Merge branch 'beta'

This commit is contained in:
Otto Winter 2019-02-22 21:46:48 +01:00
commit f4a55eafd7
No known key found for this signature in database
GPG key ID: DB66C0BE6013F97E
254 changed files with 4481 additions and 3410 deletions

View file

@ -1,49 +0,0 @@
---
name: Bug report
about: Create a report to help esphomelib improve
---
<!-- Thanks for reporting a bug for this project. READ THIS FIRST:
- Please make sure to submit issues in the right GitHub repository, if unsure just post it here:
- esphomeyaml [here] - This is mostly for reporting bugs when compiling and when you get a long stack trace while compiling or if a configuration fails to validate.
- esphomelib [https://github.com/OttoWinter/esphomelib] - Report bugs there if the ESP is crashing or a feature is not working as expected.
- esphomedocs [https://github.com/OttoWinter/esphomedocs] - Report bugs there if the documentation is wrong/outdated.
- Provide as many details as possible. Paste logs, configuration sample and code into the backticks (```).
DO NOT DELETE ANY TEXT from this template! Otherwise the issue may be closed without a comment.
-->
**Operating environment (Hass.io/Docker/pip/etc.):**
<!--
Please provide details about your environment.
-->
**ESP (ESP32/ESP8266/Board/Sonoff):**
<!--
Please provide details about which ESP you're using.
-->
**Affected component:**
<!--
Please add the link to the documentation at https://esphomelib.com/esphomeyaml/index.html of the component in question.
-->
**Description of problem:**
**Problem-relevant YAML-configuration entries:**
```yaml
PASTE YAML FILE HERE
```
**Traceback (if applicable):**
<!--
Please copy the traceback here if compilation is failing. If possible, also connect to the ESP and copy its logs into the backticks.
-->
```
```
**Additional information:**

View file

@ -1,21 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
---
<!-- READ THIS FIRST:
- This is for feature requests only, if you want to have a certain new sensor/module supported, please use the "new integration" template.
- Please be as descriptive as possible, especially use-cases that can otherwise not be solved boost the problem's priority.
DO NOT DELETE ANY TEXT from this template! Otherwise the issue may be closed without a comment.
-->
**Is your feature request related to a problem/use-case? Please describe.**
<!-- A clear and concise description of what the problem is. -->
**Describe the solution you'd like:**
<!-- A description of what you want to happen. -->
**Additional context:**
<!-- Add any other context about the feature request here. -->

View file

@ -1,13 +0,0 @@
---
name: New integration
about: Suggest a new integration for esphomelib
---
DO NOT POST NEW INTEGRATION REQUESTS HERE!
Please post all new integration requests in the esphomelib repository:
https://github.com/OttoWinter/esphomelib/issues
Thank you!

View file

@ -3,8 +3,8 @@
**Related issue (if applicable):** fixes <link to issue> **Related issue (if applicable):** fixes <link to issue>
**Pull request in [esphomedocs](https://github.com/OttoWinter/esphomedocs) with documentation (if applicable):** OttoWinter/esphomedocs#<esphomedocs PR number goes here> **Pull request in [esphome-docs](https://github.com/esphome/esphome-docs) with documentation (if applicable):** esphome/esphome-docs#<esphome-docs PR number goes here>
**Pull request in [esphomelib](https://github.com/OttoWinter/esphomelib) with C++ framework changes (if applicable):** OttoWinter/esphomelib#<esphomelib PR number goes here> **Pull request in [esphome-core](https://github.com/esphome/esphome-core) with C++ framework changes (if applicable):** esphome/esphome-core#<esphome-core PR number goes here>
## Checklist: ## Checklist:
- [ ] The code change is tested and works locally. - [ ] The code change is tested and works locally.

2
.gitignore vendored
View file

@ -105,4 +105,4 @@ venv.bak/
config/ config/
tests/build/ tests/build/
tests/.esphomeyaml/ tests/.esphome/

View file

@ -2,293 +2,126 @@
# Based on https://gitlab.com/hassio-addons/addon-node-red/blob/master/.gitlab-ci.yml # Based on https://gitlab.com/hassio-addons/addon-node-red/blob/master/.gitlab-ci.yml
variables: variables:
DOCKER_DRIVER: overlay2 DOCKER_DRIVER: overlay2
DOCKER_HOST: tcp://docker:2375/
stages: stages:
- lint - lint
- test - test
- build
- deploy - deploy
.lint: &lint .lint: &lint
image: esphome/esphome-base-amd64
stage: lint stage: lint
before_script: before_script:
- pip install -e . - pip install -e .
- pip install flake8==3.6.0 pylint==1.9.4 pillow
tags: tags:
- python2.7 - docker
- esphomeyaml-lint
.test: &test .test: &test
image: esphome/esphome-base-amd64
stage: test stage: test
before_script: before_script:
- pip install -e . - pip install -e .
tags: tags:
- python2.7 - docker
- esphomeyaml-test
variables: variables:
TZ: UTC TZ: UTC
.docker-builder: &docker-builder .docker-base: &docker-base
image: esphome/esphome-base-builder
before_script: before_script:
- docker info - docker info
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY" - docker login -u "$DOCKER_USER" -p "$DOCKER_PASSWORD"
script:
- docker run --rm --privileged hassioaddons/qemu-user-static:latest
- TAG="${CI_COMMIT_TAG#v}"
- TAG="${TAG:-${CI_COMMIT_SHA:0:7}}"
- echo "Tag ${TAG}"
- |
if [[ "${IS_HASSIO}" == "YES" ]]; then
BUILD_FROM=esphome/esphome-hassio-base-${BUILD_ARCH}:1.2.1
BUILD_TO=esphome/esphome-hassio-${BUILD_ARCH}
DOCKERFILE=docker/Dockerfile.hassio
else
BUILD_FROM=esphome/esphome-base-${BUILD_ARCH}:1.2.1
if [[ "${BUILD_ARCH}" == "amd64" ]]; then
BUILD_TO=esphome/esphome
else
BUILD_TO=esphome/esphome-${BUILD_ARCH}
fi
DOCKERFILE=docker/Dockerfile
fi
- |
docker build \
--build-arg "BUILD_FROM=${BUILD_FROM}" \
--build-arg "BUILD_VERSION=${TAG}" \
--tag "${BUILD_TO}:${TAG}" \
--file "${DOCKERFILE}" \
.
- |
if [[ "${RELEASE}" = "YES" ]]; then
echo "Pushing to ${BUILD_TO}:${TAG}"
docker push "${BUILD_TO}:${TAG}"
fi
- |
if [[ "${LATEST}" = "YES" ]]; then
echo "Pushing to :latest"
docker tag ${BUILD_TO}:${TAG} ${BUILD_TO}:latest
docker push ${BUILD_TO}:latest
fi
- |
if [[ "${BETA}" = "YES" ]]; then
echo "Pushing to :beta"
docker tag \
${BUILD_TO}:${TAG} \
${BUILD_TO}:beta
docker push ${BUILD_TO}:beta
fi
- |
if [[ "${DEV}" = "YES" ]]; then
echo "Pushing to :dev"
docker tag \
${BUILD_TO}:${TAG} \
${BUILD_TO}:dev
docker push ${BUILD_TO}:dev
fi
services: services:
- docker:dind - docker:dind
tags: tags:
- hassio-builder - docker
stage: deploy
flake8: flake8:
<<: *lint <<: *lint
script: script:
- flake8 esphomeyaml - flake8 esphome
pylint: pylint:
<<: *lint <<: *lint
script: script:
- pylint esphomeyaml - pylint esphome
test1: test1:
<<: *test <<: *test
script: script:
- esphomeyaml tests/test1.yaml compile - esphome tests/test1.yaml compile
test2: test2:
<<: *test <<: *test
script: script:
- esphomeyaml tests/test2.yaml compile - esphome tests/test2.yaml compile
.build-hassio: &build-hassio test3:
<<: *docker-builder <<: *test
stage: build
script: script:
- docker run --rm --privileged hassioaddons/qemu-user-static:latest - esphome tests/test3.yaml compile
- BUILD_FROM=hassioaddons/ubuntu-base-${ADDON_ARCH}:2.2.0
- ADDON_VERSION="${CI_COMMIT_TAG#v}"
- ADDON_VERSION="${ADDON_VERSION:-${CI_COMMIT_SHA:0:7}}"
- echo "Build from ${BUILD_FROM}"
- echo "Add-on version ${ADDON_VERSION}"
- echo "Tag ${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:dev"
- echo "Tag ${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}"
- |
docker build \
--build-arg "BUILD_FROM=${BUILD_FROM}" \
--build-arg "BUILD_DATE=$(date +"%Y-%m-%dT%H:%M:%SZ")" \
--build-arg "BUILD_ARCH=${ADDON_ARCH}" \
--build-arg "BUILD_REF=${CI_COMMIT_SHA}" \
--build-arg "BUILD_VERSION=${ADDON_VERSION}" \
--tag "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:dev" \
--tag "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \
--file "docker/Dockerfile.hassio" \
.
- |
if [ "${DO_PUSH:-true}" = true ]; then
echo "Pushing to CI registry"
docker push ${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}
docker push ${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:dev
fi
# Generic deploy template
.deploy-release: &deploy-release
<<: *docker-builder
stage: deploy
script:
- version="${CI_COMMIT_TAG#v}"
- echo "Publishing release version ${version}"
- docker pull "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}"
- docker login -u "$DOCKER_USER" -p "$DOCKER_PASSWORD"
- echo "Tag ${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
- |
docker tag \
"${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \
"${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
- docker push "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
- echo "Tag ${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:latest"
- |
docker tag \
"${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \
"${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:latest"
- docker push "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:latest"
- echo "Tag ${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:rc"
- |
docker tag \
"${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \
"${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:rc"
- docker push "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:rc"
- echo "Tag ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
- |
docker tag \
"${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \
"ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
- docker push "ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
- echo "Tag ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:latest"
- |
docker tag \
"ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}" \
"ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:latest"
- docker push "ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:latest"
- echo "Tag ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:rc"
- |
docker tag \
"ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}" \
"ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:rc"
- docker push "ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:rc"
only:
- /^v\d+\.\d+\.\d+$/
except:
- /^(?!master).+@/
.deploy-beta: &deploy-beta
<<: *docker-builder
stage: deploy
script:
- version="${CI_COMMIT_TAG#v}"
- echo "Publishing beta version ${version}"
- docker pull "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}"
- docker login -u "$DOCKER_USER" -p "$DOCKER_PASSWORD"
- echo "Tag ${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
- |
docker tag \
"${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \
"${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
- docker push "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
- echo "Tag ${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:rc"
- |
docker tag \
"${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \
"${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:rc"
- docker push "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:rc"
- echo "Tag ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
- |
docker tag \
"${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \
"ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
- docker push "ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
- echo "Tag ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:rc"
- |
docker tag \
"ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}" \
"ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:rc"
- docker push "ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:rc"
only:
- /^v\d+\.\d+\.\d+b\d+$/
except:
- /^(?!rc).+@/
# Build jobs
build:normal:
<<: *docker-builder
stage: build
script:
- docker build -t "${CI_REGISTRY}/ottowinter/esphomeyaml:dev" .
.build-hassio-edge: &build-hassio-edge
<<: *build-hassio
except:
- /^v\d+\.\d+\.\d+$/
- /^v\d+\.\d+\.\d+b\d+$/
.build-hassio-release: &build-hassio-release
<<: *build-hassio
only:
- /^v\d+\.\d+\.\d+$/
- /^v\d+\.\d+\.\d+b\d+$/
build:hassio-armhf-edge:
<<: *build-hassio-edge
variables:
ADDON_ARCH: armhf
DO_PUSH: "false"
build:hassio-armhf:
<<: *build-hassio-release
variables:
ADDON_ARCH: armhf
#build:hassio-aarch64-edge:
# <<: *build-hassio-edge
# variables:
# ADDON_ARCH: aarch64
# DO_PUSH: "false"
#build:hassio-aarch64:
# <<: *build-hassio-release
# variables:
# ADDON_ARCH: aarch64
build:hassio-i386-edge:
<<: *build-hassio-edge
variables:
ADDON_ARCH: i386
DO_PUSH: "false"
build:hassio-i386:
<<: *build-hassio-release
variables:
ADDON_ARCH: i386
build:hassio-amd64-edge:
<<: *build-hassio-edge
variables:
ADDON_ARCH: amd64
DO_PUSH: "false"
build:hassio-amd64:
<<: *build-hassio-release
variables:
ADDON_ARCH: amd64
# Deploy jobs
deploy-release:armhf:
<<: *deploy-release
variables:
ADDON_ARCH: armhf
deploy-beta:armhf:
<<: *deploy-beta
variables:
ADDON_ARCH: armhf
#deploy-release:aarch64:
# <<: *deploy-release
# variables:
# ADDON_ARCH: aarch64
#deploy-beta:aarch64:
# <<: *deploy-beta
# variables:
# ADDON_ARCH: aarch64
deploy-release:i386:
<<: *deploy-release
variables:
ADDON_ARCH: i386
deploy-beta:i386:
<<: *deploy-beta
variables:
ADDON_ARCH: i386
deploy-release:amd64:
<<: *deploy-release
variables:
ADDON_ARCH: amd64
deploy-beta:amd64:
<<: *deploy-beta
variables:
ADDON_ARCH: amd64
.deploy-pypi: &deploy-pypi .deploy-pypi: &deploy-pypi
stage: deploy stage: deploy
image: python:2.7
before_script: before_script:
- pip install -e . - pip install -e .
- pip install twine - pip install twine
@ -296,8 +129,7 @@ deploy-beta:amd64:
- python setup.py sdist - python setup.py sdist
- twine upload dist/* - twine upload dist/*
tags: tags:
- python2.7 - docker
- esphomeyaml-test
deploy-release:pypi: deploy-release:pypi:
<<: *deploy-pypi <<: *deploy-pypi
@ -312,3 +144,204 @@ deploy-beta:pypi:
- /^v\d+\.\d+\.\d+b\d+$/ - /^v\d+\.\d+\.\d+b\d+$/
except: except:
- /^(?!rc).+@/ - /^(?!rc).+@/
.latest: &latest
<<: *docker-base
only:
- /^v([0-9\.]+)$/
except:
- branches
.latest-vars: &latest-vars
RELEASE: YES
LATEST: YES
# Also push to beta tag
BETA: YES
.beta: &beta
<<: *docker-base
only:
- /^v([0-9\.]+b\d+)$/
except:
- branches
.beta-vars: &beta-vars
RELEASE: YES
BETA: YES
.dev: &dev
<<: *docker-base
only:
- dev
.dev-vars: &dev-vars
DEV: YES
aarch64-beta-docker:
<<: *beta
variables:
BETA: "YES"
BUILD_ARCH: aarch64
IS_HASSIO: "NO"
RELEASE: "YES"
aarch64-beta-hassio:
<<: *beta
variables:
BETA: "YES"
BUILD_ARCH: aarch64
IS_HASSIO: "YES"
RELEASE: "YES"
aarch64-dev-docker:
<<: *dev
variables:
BUILD_ARCH: aarch64
DEV: "YES"
IS_HASSIO: "NO"
aarch64-dev-hassio:
<<: *dev
variables:
BUILD_ARCH: aarch64
DEV: "YES"
IS_HASSIO: "YES"
aarch64-latest-docker:
<<: *latest
variables:
BETA: "YES"
BUILD_ARCH: aarch64
IS_HASSIO: "NO"
LATEST: "YES"
RELEASE: "YES"
aarch64-latest-hassio:
<<: *latest
variables:
BETA: "YES"
BUILD_ARCH: aarch64
IS_HASSIO: "YES"
LATEST: "YES"
RELEASE: "YES"
amd64-beta-docker:
<<: *beta
variables:
BETA: "YES"
BUILD_ARCH: amd64
IS_HASSIO: "NO"
RELEASE: "YES"
amd64-beta-hassio:
<<: *beta
variables:
BETA: "YES"
BUILD_ARCH: amd64
IS_HASSIO: "YES"
RELEASE: "YES"
amd64-dev-docker:
<<: *dev
variables:
BUILD_ARCH: amd64
DEV: "YES"
IS_HASSIO: "NO"
amd64-dev-hassio:
<<: *dev
variables:
BUILD_ARCH: amd64
DEV: "YES"
IS_HASSIO: "YES"
amd64-latest-docker:
<<: *latest
variables:
BETA: "YES"
BUILD_ARCH: amd64
IS_HASSIO: "NO"
LATEST: "YES"
RELEASE: "YES"
amd64-latest-hassio:
<<: *latest
variables:
BETA: "YES"
BUILD_ARCH: amd64
IS_HASSIO: "YES"
LATEST: "YES"
RELEASE: "YES"
armhf-beta-docker:
<<: *beta
variables:
BETA: "YES"
BUILD_ARCH: armhf
IS_HASSIO: "NO"
RELEASE: "YES"
armhf-beta-hassio:
<<: *beta
variables:
BETA: "YES"
BUILD_ARCH: armhf
IS_HASSIO: "YES"
RELEASE: "YES"
armhf-dev-docker:
<<: *dev
variables:
BUILD_ARCH: armhf
DEV: "YES"
IS_HASSIO: "NO"
armhf-dev-hassio:
<<: *dev
variables:
BUILD_ARCH: armhf
DEV: "YES"
IS_HASSIO: "YES"
armhf-latest-docker:
<<: *latest
variables:
BETA: "YES"
BUILD_ARCH: armhf
IS_HASSIO: "NO"
LATEST: "YES"
RELEASE: "YES"
armhf-latest-hassio:
<<: *latest
variables:
BETA: "YES"
BUILD_ARCH: armhf
IS_HASSIO: "YES"
LATEST: "YES"
RELEASE: "YES"
i386-beta-docker:
<<: *beta
variables:
BETA: "YES"
BUILD_ARCH: i386
IS_HASSIO: "NO"
RELEASE: "YES"
i386-beta-hassio:
<<: *beta
variables:
BETA: "YES"
BUILD_ARCH: i386
IS_HASSIO: "YES"
RELEASE: "YES"
i386-dev-docker:
<<: *dev
variables:
BUILD_ARCH: i386
DEV: "YES"
IS_HASSIO: "NO"
i386-dev-hassio:
<<: *dev
variables:
BUILD_ARCH: i386
DEV: "YES"
IS_HASSIO: "YES"
i386-latest-docker:
<<: *latest
variables:
BETA: "YES"
BUILD_ARCH: i386
IS_HASSIO: "NO"
LATEST: "YES"
RELEASE: "YES"
i386-latest-hassio:
<<: *latest
variables:
BETA: "YES"
BUILD_ARCH: i386
IS_HASSIO: "YES"
LATEST: "YES"
RELEASE: "YES"

View file

@ -8,23 +8,24 @@ matrix:
env: TARGET=Lint2.7 env: TARGET=Lint2.7
install: pip install -e . && pip install flake8==3.6.0 pylint==1.9.4 pillow install: pip install -e . && pip install flake8==3.6.0 pylint==1.9.4 pillow
script: script:
- flake8 esphomeyaml - flake8 esphome
- pylint esphomeyaml - pylint esphome
- python: "3.5.3" - python: "3.5.3"
env: TARGET=Lint3.5 env: TARGET=Lint3.5
install: pip install -U https://github.com/platformio/platformio-core/archive/develop.zip && pip install -e . && pip install flake8==3.6.0 pylint==2.2.2 pillow install: pip install -U https://github.com/platformio/platformio-core/archive/develop.zip && pip install -e . && pip install flake8==3.6.0 pylint==2.2.2 pillow
script: script:
- flake8 esphomeyaml - flake8 esphome
- pylint esphomeyaml - pylint esphome
- python: "2.7" - python: "2.7"
env: TARGET=Test2.7 env: TARGET=Test2.7
install: pip install -e . && pip install flake8==3.6.0 pylint==1.9.4 pillow install: pip install -e . && pip install flake8==3.6.0 pylint==1.9.4 pillow
script: script:
- esphomeyaml tests/test1.yaml compile - esphome tests/test1.yaml compile
- esphomeyaml tests/test2.yaml compile - esphome tests/test2.yaml compile
- python: "3.5.3" - esphome tests/test3.yaml compile
env: TARGET=Test3.5 #- python: "3.5.3"
install: pip install -U https://github.com/platformio/platformio-core/archive/develop.zip && pip install -e . && pip install flake8==3.6.0 pylint==2.2.2 pillow # env: TARGET=Test3.5
script: # install: pip install -U https://github.com/platformio/platformio-core/archive/develop.zip && pip install -e . && pip install flake8==3.6.0 pylint==2.2.2 pillow
- esphomeyaml tests/test1.yaml compile # script:
- esphomeyaml tests/test2.yaml compile # - esphome tests/test1.yaml compile
# - esphome tests/test2.yaml compile

View file

@ -1,16 +1,16 @@
# Contributing to esphomeyaml # Contributing to ESPHome
esphomeyaml is a part of esphomelib and is responsible for reading in YAML configuration files, This python project is responsible for reading in YAML configuration files,
converting them to C++ code. This code is then converted to a platformio project and compiled converting them to C++ code. This code is then converted to a platformio project and compiled
with [esphomelib](https://github.com/OttoWinter/esphomelib), the C++ framework behind the project. with [esphome-core](https://github.com/esphome/esphome-core), the C++ framework behind the project.
For a detailed guide, please see https://esphomelib.com/esphomeyaml/guides/contributing.html#contributing-to-esphomeyaml For a detailed guide, please see https://esphome.io/guides/contributing.html#contributing-to-esphomeyaml
Things to note when contributing: Things to note when contributing:
- Please test your changes :) - Please test your changes :)
- If a new feature is added or an existing user-facing feature is changed, you should also - If a new feature is added or an existing user-facing feature is changed, you should also
update the [docs](https://github.com/OttoWinter/esphomedocs). See [contributing to esphomedocs](https://esphomelib.com/esphomeyaml/guides/contributing.html#contributing-to-esphomedocs) update the [docs](https://github.com/esphome/esphome-docs). See [contributing to esphome-docs](https://esphome.io/guides/contributing.html#contributing-to-esphomedocs)
for more information. for more information.
- Please also update the tests in the `tests/` folder. You can do so by just adding a line in one of the YAML files - Please also update the tests in the `tests/` folder. You can do so by just adding a line in one of the YAML files
which checks if your new feature compiles correctly. which checks if your new feature compiles correctly.

View file

@ -1,28 +0,0 @@
ARG BUILD_FROM=python:2.7
FROM ${BUILD_FROM}
MAINTAINER Otto Winter <contact@otto-winter.com>
RUN apt-get update && apt-get install -y \
python-pil \
git \
&& apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* && \
pip install --no-cache-dir --no-binary :all: platformio && \
platformio settings set enable_telemetry No && \
platformio settings set check_libraries_interval 1000000 && \
platformio settings set check_platformio_interval 1000000 && \
platformio settings set check_platforms_interval 1000000
ENV ESPHOMEYAML_OTA_HOST_PORT=6123
EXPOSE 6123
VOLUME /config
WORKDIR /usr/src/app
COPY docker/platformio.ini /pio/platformio.ini
RUN platformio run -d /pio; rm -rf /pio
COPY . .
RUN pip install --no-cache-dir --no-binary :all: -e .
WORKDIR /config
ENTRYPOINT ["esphomeyaml"]
CMD ["/config", "dashboard"]

View file

@ -1,17 +1,17 @@
include README.md include README.md
include esphomeyaml/dashboard/templates/index.html include esphome/dashboard/templates/index.html
include esphomeyaml/dashboard/templates/login.html include esphome/dashboard/templates/login.html
include esphomeyaml/dashboard/static/ace.js include esphome/dashboard/static/ace.js
include esphomeyaml/dashboard/static/esphomeyaml.css include esphome/dashboard/static/esphome.css
include esphomeyaml/dashboard/static/esphomeyaml.js include esphome/dashboard/static/esphome.js
include esphomeyaml/dashboard/static/favicon.ico include esphome/dashboard/static/favicon.ico
include esphomeyaml/dashboard/static/jquery.min.js include esphome/dashboard/static/jquery.min.js
include esphomeyaml/dashboard/static/jquery.validate.min.js include esphome/dashboard/static/jquery.validate.min.js
include esphomeyaml/dashboard/static/jquery-ui.min.js include esphome/dashboard/static/jquery-ui.min.js
include esphomeyaml/dashboard/static/materialize.min.css include esphome/dashboard/static/materialize.min.css
include esphomeyaml/dashboard/static/materialize.min.js include esphome/dashboard/static/materialize.min.js
include esphomeyaml/dashboard/static/materialize-stepper.min.css include esphome/dashboard/static/materialize-stepper.min.css
include esphomeyaml/dashboard/static/materialize-stepper.min.js include esphome/dashboard/static/materialize-stepper.min.js
include esphomeyaml/dashboard/static/mode-yaml.js include esphome/dashboard/static/mode-yaml.js
include esphomeyaml/dashboard/static/theme-dreamweaver.js include esphome/dashboard/static/theme-dreamweaver.js
include esphomeyaml/dashboard/static/ext-searchbox.js include esphome/dashboard/static/ext-searchbox.js

View file

@ -1,38 +1,9 @@
# esphomeyaml for [esphomelib](https://github.com/OttoWinter/esphomelib) # ESPHome [![Build Status](https://travis-ci.org/esphome/esphome.svg?branch=master)](https://travis-ci.org/esphome/esphome) [![Discord Chat](https://img.shields.io/discord/429907082951524364.svg)](https://discord.gg/KhAMKrd) [![GitHub release](https://img.shields.io/github/release/esphome/esphome.svg)](https://GitHub.com/esphome/esphome/releases/)
### Getting Started Guide: https://esphomelib.com/esphomeyaml/guides/getting_started_command_line.html [![ESPHome Logo](https://esphome.io/_images/logo-text.png)](https://esphome.io/)
### Available Components: https://esphomelib.com/esphomeyaml/index.html **Documentation:** https://esphome.io/
esphomeyaml is the solution for your ESP8266/ESP32 projects with Home Assistant. It allows you to create **custom firmwares** for your microcontrollers with no programming experience required. All you need to know is the YAML configuration format which is also used by [Home Assistant](https://www.home-assistant.io). For issues, please go to [the issue tracker](https://github.com/esphome/issues/issues).
esphomeyaml will: For feature requests, please see [feature requests](https://github.com/esphome/feature-requests/issues).
* Read your configuration file and warn you about potential errors (like using the invalid pins.)
* Create a custom C++ sketch file for you using esphomeyaml's powerful C++ generation engine.
* Compile the sketch file for you using [platformio](http://platformio.org/).
* Upload the binary to your ESP via Over the Air updates.
* Automatically start remote logs via MQTT.
And all of that with a single command 🎉:
```bash
esphomeyaml configuration.yaml run
```
## Features
* **No programming experience required:** just edit YAML configuration
files like you're used to with Home Assistant.
* **Flexible:** Use [esphomelib](https://github.com/OttoWinter/esphomelib)'s powerful core to create custom sensors/outputs.
* **Fast and efficient:** Written in C++ and keeps memory consumption to a minimum.
* **Made for [Home Assistant](https://www.home-assistant.io):** Almost all [Home Assistant](https://www.home-assistant.io) features are supported out of the box. Including RGB lights and many more.
* **Easy reproducible configuration:** No need to go through a long setup process for every single node. Just copy a configuration file and run a single command.
* **Smart Over The Air Updates:** esphomeyaml has OTA updates deeply integrated into the system. It even automatically enters a recovery mode if a boot loop is detected.
* **Powerful logging engine:** View colorful logs and debug issues remotely.
* **Open Source**
* For me: Makes documenting esphomelib's features a lot easier.
## Special Thanks
Special Thanks to the Home Assistant project. Lots of the code base of esphomeyaml is based off of Home Assistant, for example the loading and config validation code.

10
docker/Dockerfile Normal file
View file

@ -0,0 +1,10 @@
ARG BUILD_FROM=esphome/esphome-base-amd64:1.2.1
FROM ${BUILD_FROM}
COPY . .
RUN \
pip2 install --no-cache-dir --no-binary :all: -e .
WORKDIR /config
ENTRYPOINT ["esphome"]
CMD ["/config", "dashboard"]

View file

@ -1,30 +0,0 @@
FROM multiarch/ubuntu-core:amd64-xenial
# setup locals
RUN apt-get update && apt-get install -y \
jq \
git \
python3-setuptools \
&& rm -rf /var/lib/apt/lists/* \
ENV LANG C.UTF-8
# Install docker
# https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/
RUN apt-get update && apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
software-properties-common \
&& rm -rf /var/lib/apt/lists/* \
&& curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - \
&& add-apt-repository "deb https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
&& apt-get update && apt-get install -y docker-ce \
&& rm -rf /var/lib/apt/lists/*
# setup arm binary support
RUN apt-get update && apt-get install -y \
qemu-user-static \
binfmt-support \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /data

View file

@ -1,75 +1,20 @@
ARG BUILD_FROM=hassioaddons/ubuntu-base:2.2.0 ARG BUILD_FROM=esphome/esphome-hassio-base-amd64:1.2.1
# hadolint ignore=DL3006
FROM ${BUILD_FROM} FROM ${BUILD_FROM}
# Set shell
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
# Copy root filesystem # Copy root filesystem
COPY esphomeyaml-edge/rootfs / COPY docker/rootfs/ /
COPY setup.py setup.cfg MANIFEST.in /opt/esphomeyaml/ COPY setup.py setup.cfg MANIFEST.in /opt/esphome/
COPY esphomeyaml /opt/esphomeyaml/esphomeyaml COPY esphome /opt/esphome/esphome
RUN \ RUN \
# Temporarily move nginx.conf (otherwise dpkg fails) pip2 install --no-cache-dir --no-binary :all: -e /opt/esphome
mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bkp \
# Install add-on dependencies
&& apt-get update \
&& apt-get install -y --no-install-recommends \
# Python for esphomeyaml
python \
python-pip \
python-setuptools \
# Python Pillow for display component
python-pil \
# Git for esphomelib downloads
git \
# Ping for dashboard online/offline status
iputils-ping \
# NGINX proxy
nginx \
\
&& mv /etc/nginx/nginx.conf.bkp /etc/nginx/nginx.conf \
\
&& pip2 install --no-cache-dir --no-binary :all: -e /opt/esphomeyaml \
\
# Change some platformio settings
&& platformio settings set enable_telemetry No \
&& platformio settings set check_libraries_interval 1000000 \
&& platformio settings set check_platformio_interval 1000000 \
&& platformio settings set check_platforms_interval 1000000 \
\
# Build an empty platformio project to force platformio to install all fw build dependencies
# The return-code will be non-zero since there's nothing to build.
&& (platformio run -d /opt/pio; echo "Done") \
\
# Cleanup
&& rm -fr \
/tmp/* \
/var/{cache,log}/* \
/var/lib/apt/lists/* \
/opt/pio/
# Build arugments # Build arguments
ARG BUILD_ARCH=amd64 ARG BUILD_VERSION=dev
ARG BUILD_DATE
ARG BUILD_REF
ARG BUILD_VERSION
# Labels # Labels
LABEL \ LABEL \
io.hass.name="esphomeyaml" \ io.hass.name="ESPHome" \
io.hass.description="Manage and program ESP8266/ESP32 microcontrollers through YAML configuration files" \ io.hass.description="Manage and program ESP8266/ESP32 microcontrollers through YAML configuration files" \
io.hass.arch="${BUILD_ARCH}" \
io.hass.type="addon" \ io.hass.type="addon" \
io.hass.version=${BUILD_VERSION} \ io.hass.version=${BUILD_VERSION}
maintainer="Otto Winter <contact@otto-winter.com>" \
org.label-schema.description="Manage and program ESP8266/ESP32 microcontrollers through YAML configuration files" \
org.label-schema.build-date=${BUILD_DATE} \
org.label-schema.name="esphomeyaml" \
org.label-schema.schema-version="1.0" \
org.label-schema.url="https://esphomelib.com" \
org.label-schema.usage="https://github.com/OttoWinter/esphomeyaml/tree/dev/esphomeyaml/README.md" \
org.label-schema.vcs-ref=${BUILD_REF} \
org.label-schema.vcs-url="https://github.com/OttoWinter/esphomeyaml" \
org.label-schema.vendor="esphomelib"

26
docker/hooks/build Executable file
View file

@ -0,0 +1,26 @@
#!/usr/bin/env bash
# the Docker repository tag being built.
declare CACHE_TAG
echo "CACHE_TAG: ${CACHE_TAG}"
# the name and tag of the Docker repository being built. (This variable is a combination of DOCKER_REPO:CACHE_TAG.)
declare IMAGE_NAME
echo "IMAGE_NAME: ${IMAGE_NAME}"
# the architecture to build
declare BUILD_ARCH
echo "BUILD_ARCH: ${BUILD_ARCH}"
# whether this is a hassio build
declare IS_HASSIO
echo "IS_HASSIO: ${IS_HASSIO}"
echo "PWD: $PWD"
if [[ ${IS_HASSIO} = "YES" ]]; then
docker build \
--build-arg "BUILD_FROM=esphome/esphome-hassio-base-${BUILD_ARCH}:1.2.1" \
--build-arg "BUILD_VERSION=${CACHE_TAG}" \
-t "${IMAGE_NAME}" -f ../docker/Dockerfile.hassio ..
else
docker build \
--build-arg "BUILD_FROM=esphome/esphome-base-${BUILD_ARCH}:1.2.1" \
-t "${IMAGE_NAME}" -f ../docker/Dockerfile ..
fi

18
docker/hooks/pre_build Executable file
View file

@ -0,0 +1,18 @@
#!/usr/bin/env bash
# the architecture to build
declare BUILD_ARCH
echo "BUILD_ARCH: ${BUILD_ARCH}"
if [[ ${BUILD_ARCH} = "amd64" ]]; then
echo "No qemu required..."
exit 0
fi
if [[ ${BUILD_ARCH} = "i386" ]]; then
echo "No qemu required..."
exit 0
fi
echo "Installing qemu..."
docker run --rm --privileged multiarch/qemu-user-static:register --reset

View file

@ -1,6 +1,6 @@
#!/usr/bin/with-contenv bash #!/usr/bin/with-contenv bash
# ============================================================================== # ==============================================================================
# Community Hass.io Add-ons: esphomeyaml # Community Hass.io Add-ons: ESPHome
# This files check if all user configuration requirements are met # This files check if all user configuration requirements are met
# ============================================================================== # ==============================================================================
# shellcheck disable=SC1091 # shellcheck disable=SC1091
@ -22,7 +22,7 @@ if hass.config.true 'ssl'; then
text="You enabled encrypted connections using the \"ssl\": true option. text="You enabled encrypted connections using the \"ssl\": true option.
However, the SSL files \"$(hass.config.get 'certfile')\" and \"$(hass.config.get 'keyfile')\" However, the SSL files \"$(hass.config.get 'certfile')\" and \"$(hass.config.get 'keyfile')\"
were not found. If you're using Hass.io on your local network and don't want were not found. If you're using Hass.io on your local network and don't want
to encrypt connections to the esphomeyaml dashboard, you can manually disable to encrypt connections to the ESPHome dashboard, you can manually disable
SSL by setting \"ssl\" to false." SSL by setting \"ssl\" to false."
hass.die "${text}" hass.die "${text}"
fi fi

View file

@ -1,7 +1,7 @@
#!/usr/bin/with-contenv bash #!/usr/bin/with-contenv bash
# ============================================================================== # ==============================================================================
# Community Hass.io Add-ons: esphomeyaml # Community Hass.io Add-ons: ESPHome
# Configures NGINX for use with esphomeyaml # Configures NGINX for use with ESPHome
# ============================================================================== # ==============================================================================
# shellcheck disable=SC1091 # shellcheck disable=SC1091
source /usr/lib/hassio-addons/base.sh source /usr/lib/hassio-addons/base.sh

View file

@ -1,14 +1,14 @@
#!/usr/bin/with-contenv bash #!/usr/bin/with-contenv bash
# ============================================================================== # ==============================================================================
# Community Hass.io Add-ons: esphomeyaml # Community Hass.io Add-ons: ESPHome
# This files installs the user esphomeyaml version if specified # This files installs the user ESPHome version if specified
# ============================================================================== # ==============================================================================
# shellcheck disable=SC1091 # shellcheck disable=SC1091
source /usr/lib/hassio-addons/base.sh source /usr/lib/hassio-addons/base.sh
declare esphomeyaml_version declare esphome_version
if hass.config.has_value 'esphomeyaml_version'; then if hass.config.has_value 'esphome_version'; then
esphomeyaml_version=$(hass.config.get 'esphomeyaml_version') esphome_version=$(hass.config.get 'esphome_version')
pip2 install --no-cache-dir --no-binary :all: "https://github.com/OttoWinter/esphomeyaml/archive/${esphomeyaml_version}.zip" pip2 install --no-cache-dir --no-binary :all: "https://github.com/esphome/esphome/archive/${esphome_version}.zip"
fi fi

View file

@ -0,0 +1,13 @@
#!/usr/bin/with-contenv bash
# ==============================================================================
# Community Hass.io Add-ons: ESPHome
# This files migrates the esphome config directory from the old path
# ==============================================================================
# shellcheck disable=SC1091
source /usr/lib/hassio-addons/base.sh
if [[ ! -d /config/esphome && -d /config/esphomeyaml ]]; then
echo "Moving config directory from /config/esphomeyaml to /config/esphome"
mv /config/esphomeyaml /config/esphome
mv /config/esphome/.esphomeyaml /config/esphome/.esphome
fi

View file

@ -13,9 +13,9 @@ http {
sendfile on; sendfile on;
keepalive_timeout 65; keepalive_timeout 65;
upstream esphomeyaml { upstream esphome {
ip_hash; ip_hash;
server unix:/var/run/esphomeyaml.sock; server unix:/var/run/esphome.sock;
} }
map $http_upgrade $connection_upgrade { map $http_upgrade $connection_upgrade {
default upgrade; default upgrade;
@ -45,7 +45,7 @@ http {
location / { location / {
proxy_redirect off; proxy_redirect off;
proxy_pass http://esphomeyaml; proxy_pass http://esphome;
proxy_http_version 1.1; proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; proxy_set_header Upgrade $http_upgrade;

View file

@ -13,9 +13,9 @@ http {
sendfile on; sendfile on;
keepalive_timeout 65; keepalive_timeout 65;
upstream esphomeyaml { upstream esphome {
ip_hash; ip_hash;
server unix:/var/run/esphomeyaml.sock; server unix:/var/run/esphome.sock;
} }
map $http_upgrade $connection_upgrade { map $http_upgrade $connection_upgrade {
default upgrade; default upgrade;
@ -29,7 +29,7 @@ http {
location / { location / {
proxy_redirect off; proxy_redirect off;
proxy_pass http://esphomeyaml; proxy_pass http://esphome;
proxy_http_version 1.1; proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; proxy_set_header Upgrade $http_upgrade;

View file

@ -1,7 +1,7 @@
#!/usr/bin/execlineb -S0 #!/usr/bin/execlineb -S0
# ============================================================================== # ==============================================================================
# Community Hass.io Add-ons: esphomeyaml # Community Hass.io Add-ons: ESPHome
# Take down the S6 supervision tree when esphomeyaml fails # Take down the S6 supervision tree when ESPHome fails
# ============================================================================== # ==============================================================================
if -n { s6-test $# -ne 0 } if -n { s6-test $# -ne 0 }
if -n { s6-test ${1} -eq 256 } if -n { s6-test ${1} -eq 256 }

View file

@ -1,7 +1,7 @@
#!/usr/bin/with-contenv bash #!/usr/bin/with-contenv bash
# ============================================================================== # ==============================================================================
# Community Hass.io Add-ons: esphomeyaml # Community Hass.io Add-ons: ESPHome
# Runs the esphomeyaml dashboard # Runs the ESPHome dashboard
# ============================================================================== # ==============================================================================
# shellcheck disable=SC1091 # shellcheck disable=SC1091
source /usr/lib/hassio-addons/base.sh source /usr/lib/hassio-addons/base.sh
@ -10,5 +10,5 @@ if hass.config.true 'leave_front_door_open'; then
export DISABLE_HA_AUTHENTICATION=true export DISABLE_HA_AUTHENTICATION=true
fi fi
hass.log.info "Starting esphomeyaml dashboard..." hass.log.info "Starting ESPHome dashboard..."
exec esphomeyaml /config/esphomeyaml dashboard --socket /var/run/esphomeyaml.sock --hassio exec esphome /config/esphome dashboard --socket /var/run/esphome.sock --hassio

View file

@ -1,6 +1,6 @@
#!/usr/bin/execlineb -S0 #!/usr/bin/execlineb -S0
# ============================================================================== # ==============================================================================
# Community Hass.io Add-ons: esphomeyaml # Community Hass.io Add-ons: ESPHome
# Take down the S6 supervision tree when NGINX fails # Take down the S6 supervision tree when NGINX fails
# ============================================================================== # ==============================================================================
if -n { s6-test $# -ne 0 } if -n { s6-test $# -ne 0 }

View file

@ -1,6 +1,6 @@
#!/usr/bin/with-contenv bash #!/usr/bin/with-contenv bash
# ============================================================================== # ==============================================================================
# Community Hass.io Add-ons: esphomeyaml # Community Hass.io Add-ons: ESPHome
# Runs the NGINX proxy # Runs the NGINX proxy
# ============================================================================== # ==============================================================================
# shellcheck disable=SC1091 # shellcheck disable=SC1091

View file

@ -8,22 +8,22 @@ import os
import random import random
import sys import sys
from esphomeyaml import const, core_config, mqtt, platformio_api, wizard, writer, yaml_util from esphome import const, core_config, mqtt, platformio_api, wizard, writer, yaml_util
from esphomeyaml.api.client import run_logs from esphome.api.client import run_logs
from esphomeyaml.config import get_component, iter_components, read_config, strip_default_ids from esphome.config import get_component, iter_components, read_config, strip_default_ids
from esphomeyaml.const import CONF_BAUD_RATE, CONF_ESPHOMEYAML, CONF_LOGGER, CONF_USE_CUSTOM_CODE, \ from esphome.const import CONF_BAUD_RATE, CONF_BROKER, CONF_ESPHOME, CONF_LOGGER, \
CONF_BROKER CONF_USE_CUSTOM_CODE
from esphomeyaml.core import CORE, EsphomeyamlError from esphome.core import CORE, EsphomeError
from esphomeyaml.cpp_generator import Expression, RawStatement, add, statement from esphome.cpp_generator import Expression, RawStatement, add, statement
from esphomeyaml.helpers import color, indent from esphome.helpers import color, indent
from esphomeyaml.py_compat import safe_input, text_type, IS_PY2 from esphome.py_compat import IS_PY2, safe_input, text_type
from esphomeyaml.storage_json import StorageJSON, esphomeyaml_storage_path, \ from esphome.storage_json import StorageJSON, esphome_storage_path, \
start_update_check_thread, storage_path start_update_check_thread, storage_path
from esphomeyaml.util import run_external_command, safe_print from esphome.util import run_external_command, run_external_process, safe_print
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
PRE_INITIALIZE = ['esphomeyaml', 'logger', 'wifi', 'ethernet', 'ota', 'mqtt', 'web_server', 'api', PRE_INITIALIZE = ['esphome', 'logger', 'wifi', 'ethernet', 'ota', 'mqtt', 'web_server', 'api',
'i2c'] 'i2c']
@ -127,9 +127,9 @@ def run_miniterm(config, port):
def write_cpp(config): def write_cpp(config):
_LOGGER.info("Generating C++ source...") _LOGGER.info("Generating C++ source...")
CORE.add_job(core_config.to_code, config[CONF_ESPHOMEYAML], domain='esphomeyaml') CORE.add_job(core_config.to_code, config[CONF_ESPHOME], domain='esphome')
for domain in PRE_INITIALIZE: for domain in PRE_INITIALIZE:
if domain == CONF_ESPHOMEYAML or domain not in config: if domain == CONF_ESPHOME or domain not in config:
continue continue
CORE.add_job(get_component(domain).to_code, config[domain], domain=domain) CORE.add_job(get_component(domain).to_code, config[domain], domain=domain)
@ -143,7 +143,7 @@ def write_cpp(config):
add(RawStatement('')) add(RawStatement(''))
all_code = [] all_code = []
for exp in CORE.expressions: for exp in CORE.expressions:
if not config[CONF_ESPHOMEYAML][CONF_USE_CUSTOM_CODE]: if not config[CONF_ESPHOME][CONF_USE_CUSTOM_CODE]:
if isinstance(exp, Expression) and not exp.required: if isinstance(exp, Expression) and not exp.required:
continue continue
all_code.append(text_type(statement(exp))) all_code.append(text_type(statement(exp)))
@ -157,9 +157,9 @@ def write_cpp(config):
def compile_program(args, config): def compile_program(args, config):
_LOGGER.info("Compiling app...") _LOGGER.info("Compiling app...")
update_check = not os.getenv('ESPHOMEYAML_NO_UPDATE_CHECK', '') update_check = not os.getenv('ESPHOME_NO_UPDATE_CHECK', '')
if update_check: if update_check:
thread = start_update_check_thread(esphomeyaml_storage_path(CORE.config_dir)) thread = start_update_check_thread(esphome_storage_path(CORE.config_dir))
rc = platformio_api.run_compile(config, args.verbose) rc = platformio_api.run_compile(config, args.verbose)
if update_check: if update_check:
thread.join() thread.join()
@ -167,14 +167,17 @@ def compile_program(args, config):
def upload_using_esptool(config, port): def upload_using_esptool(config, port):
import esptool
path = os.path.join(CORE.build_path, '.pioenvs', CORE.name, 'firmware.bin') path = os.path.join(CORE.build_path, '.pioenvs', CORE.name, 'firmware.bin')
cmd = ['esptool.py', '--before', 'default_reset', '--after', 'hard_reset', cmd = ['esptool.py', '--before', 'default_reset', '--after', 'hard_reset',
'--chip', 'esp8266', '--port', port, 'write_flash', '0x0', path] '--chip', 'esp8266', '--port', port, 'write_flash', '0x0', path]
if os.environ.get('ESPHOME_USE_SUBPROCESS') is None:
import esptool
# pylint: disable=protected-access # pylint: disable=protected-access
return run_external_command(esptool._main, *cmd) return run_external_command(esptool._main, *cmd)
return run_external_process(*cmd)
def upload_program(config, args, host): def upload_program(config, args, host):
# if upload is to a serial port use platformio, otherwise assume ota # if upload is to a serial port use platformio, otherwise assume ota
@ -183,13 +186,13 @@ def upload_program(config, args, host):
return upload_using_esptool(config, host) return upload_using_esptool(config, host)
return platformio_api.run_upload(config, args.verbose, host) return platformio_api.run_upload(config, args.verbose, host)
from esphomeyaml.components import ota from esphome.components import ota
from esphomeyaml import espota2 from esphome import espota2
if args.host_port is not None: if args.host_port is not None:
host_port = args.host_port host_port = args.host_port
else: else:
host_port = int(os.getenv('ESPHOMEYAML_OTA_HOST_PORT', random.randint(10000, 60000))) host_port = int(os.getenv('ESPHOME_OTA_HOST_PORT', random.randint(10000, 60000)))
verbose = args.verbose verbose = args.verbose
remote_port = ota.get_port(config) remote_port = ota.get_port(config)
@ -212,7 +215,7 @@ def upload_program(config, args, host):
def show_logs(config, args, port): def show_logs(config, args, port):
if 'logger' not in config: if 'logger' not in config:
raise EsphomeyamlError("Logger is not configured!") raise EsphomeError("Logger is not configured!")
if get_port_type(port) == 'SERIAL': if get_port_type(port) == 'SERIAL':
run_miniterm(config, port) run_miniterm(config, port)
return 0 return 0
@ -342,7 +345,7 @@ def command_clean(args, config):
def command_hass_config(args, config): def command_hass_config(args, config):
from esphomeyaml.components import mqtt as mqtt_component from esphome.components import mqtt as mqtt_component
_LOGGER.info("This is what you should put in your Home Assistant YAML configuration.") _LOGGER.info("This is what you should put in your Home Assistant YAML configuration.")
_LOGGER.info("Please note this is only necessary if you're not using MQTT discovery.") _LOGGER.info("Please note this is only necessary if you're not using MQTT discovery.")
@ -364,7 +367,7 @@ def command_hass_config(args, config):
def command_dashboard(args): def command_dashboard(args):
from esphomeyaml.dashboard import dashboard from esphome.dashboard import dashboard
return dashboard.start_web_server(args) return dashboard.start_web_server(args)
@ -389,8 +392,8 @@ POST_CONFIG_ACTIONS = {
def parse_args(argv): def parse_args(argv):
parser = argparse.ArgumentParser(prog='esphomeyaml') parser = argparse.ArgumentParser(prog='esphome')
parser.add_argument('-v', '--verbose', help="Enable verbose esphomeyaml logs.", parser.add_argument('-v', '--verbose', help="Enable verbose esphome logs.",
action='store_true') action='store_true')
parser.add_argument('--dashboard', help="Internal flag to set if the command is run from the " parser.add_argument('--dashboard', help="Internal flag to set if the command is run from the "
"dashboard.", action='store_true') "dashboard.", action='store_true')
@ -441,11 +444,11 @@ def parse_args(argv):
parser_clean.add_argument('--client-id', help='Manually set the client id.') parser_clean.add_argument('--client-id', help='Manually set the client id.')
subparsers.add_parser('wizard', help="A helpful setup wizard that will guide " subparsers.add_parser('wizard', help="A helpful setup wizard that will guide "
"you through setting up esphomeyaml.") "you through setting up esphome.")
subparsers.add_parser('mqtt-fingerprint', help="Get the SSL fingerprint from a MQTT broker.") subparsers.add_parser('mqtt-fingerprint', help="Get the SSL fingerprint from a MQTT broker.")
subparsers.add_parser('version', help="Print the esphomeyaml version and exit.") subparsers.add_parser('version', help="Print the esphome version and exit.")
subparsers.add_parser('clean', help="Delete all temporary build files.") subparsers.add_parser('clean', help="Delete all temporary build files.")
@ -458,7 +461,7 @@ def parse_args(argv):
dashboard.add_argument("--open-ui", help="Open the dashboard UI in a browser.", dashboard.add_argument("--open-ui", help="Open the dashboard UI in a browser.",
action='store_true') action='store_true')
dashboard.add_argument("--hassio", dashboard.add_argument("--hassio",
help="Internal flag used to tell esphomeyaml is started as a Hass.io " help="Internal flag used to tell esphome is started as a Hass.io "
"add-on.", "add-on.",
action="store_true") action="store_true")
dashboard.add_argument("--socket", dashboard.add_argument("--socket",
@ -471,7 +474,7 @@ def parse_args(argv):
return parser.parse_args(argv[1:]) return parser.parse_args(argv[1:])
def run_esphomeyaml(argv): def run_esphome(argv):
args = parse_args(argv) args = parse_args(argv)
CORE.dashboard = args.dashboard CORE.dashboard = args.dashboard
@ -479,7 +482,7 @@ def run_esphomeyaml(argv):
if args.command in PRE_CONFIG_ACTIONS: if args.command in PRE_CONFIG_ACTIONS:
try: try:
return PRE_CONFIG_ACTIONS[args.command](args) return PRE_CONFIG_ACTIONS[args.command](args)
except EsphomeyamlError as e: except EsphomeError as e:
_LOGGER.error(e) _LOGGER.error(e)
return 1 return 1
@ -493,7 +496,7 @@ def run_esphomeyaml(argv):
if args.command in POST_CONFIG_ACTIONS: if args.command in POST_CONFIG_ACTIONS:
try: try:
return POST_CONFIG_ACTIONS[args.command](args, config) return POST_CONFIG_ACTIONS[args.command](args, config)
except EsphomeyamlError as e: except EsphomeError as e:
_LOGGER.error(e) _LOGGER.error(e)
return 1 return 1
safe_print(u"Unknown command {}".format(args.command)) safe_print(u"Unknown command {}".format(args.command))
@ -502,8 +505,8 @@ def run_esphomeyaml(argv):
def main(): def main():
try: try:
return run_esphomeyaml(sys.argv) return run_esphome(sys.argv)
except EsphomeyamlError as e: except EsphomeError as e:
_LOGGER.error(e) _LOGGER.error(e)
return 1 return 1
except KeyboardInterrupt: except KeyboardInterrupt:

View file

@ -92,7 +92,7 @@ message DeviceInfoResponse {
// A string describing the date of compilation, this is generated by the compiler // A string describing the date of compilation, this is generated by the compiler
// and therefore may not be in the same format all the time. // and therefore may not be in the same format all the time.
// If the user isn't using esphomeyaml, this will also not be set. // If the user isn't using esphome, this will also not be set.
string compilation_time = 5; string compilation_time = 5;
// The model of the board. For example NodeMCU // The model of the board. For example NodeMCU

View file

@ -9,18 +9,18 @@ import time
from typing import Optional # noqa from typing import Optional # noqa
from google.protobuf import message # noqa from google.protobuf import message # noqa
from esphomeyaml import const from esphome import const
import esphomeyaml.api.api_pb2 as pb import esphome.api.api_pb2 as pb
from esphomeyaml.const import CONF_PASSWORD, CONF_PORT from esphome.const import CONF_PASSWORD, CONF_PORT
from esphomeyaml.core import EsphomeyamlError from esphome.core import EsphomeError
from esphomeyaml.helpers import resolve_ip_address, indent, color from esphome.helpers import resolve_ip_address, indent, color
from esphomeyaml.py_compat import text_type, IS_PY2, byte_to_bytes, char_to_byte, format_bytes from esphome.py_compat import text_type, IS_PY2, byte_to_bytes, char_to_byte, format_bytes
from esphomeyaml.util import safe_print from esphome.util import safe_print
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
class APIConnectionError(EsphomeyamlError): class APIConnectionError(EsphomeError):
pass pass
@ -179,11 +179,11 @@ class APIClient(threading.Thread):
try: try:
ip = resolve_ip_address(self._address) ip = resolve_ip_address(self._address)
except EsphomeyamlError as err: except EsphomeError as err:
_LOGGER.warning("Error resolving IP address of %s. Is it connected to WiFi?", _LOGGER.warning("Error resolving IP address of %s. Is it connected to WiFi?",
self._address) self._address)
_LOGGER.warning("(If this error persists, please set a static IP address: " _LOGGER.warning("(If this error persists, please set a static IP address: "
"https://esphomelib.com/esphomeyaml/components/wifi.html#manual-ips)") "https://esphome.io/components/wifi.html#manual-ips)")
raise APIConnectionError(err) raise APIConnectionError(err)
_LOGGER.info("Connecting to %s:%s (%s)", self._address, self._port, ip) _LOGGER.info("Connecting to %s:%s (%s)", self._address, self._port, ip)
@ -200,7 +200,7 @@ class APIClient(threading.Thread):
self._socket_open_event.set() self._socket_open_event.set()
hello = pb.HelloRequest() hello = pb.HelloRequest()
hello.client_info = 'esphomeyaml v{}'.format(const.__version__) hello.client_info = 'ESPHome v{}'.format(const.__version__)
try: try:
resp = self._send_message_await_response(hello, pb.HelloResponse) resp = self._send_message_await_response(hello, pb.HelloResponse)
except APIConnectionError as err: except APIConnectionError as err:
@ -423,12 +423,14 @@ def run_logs(config, address):
conf = config['api'] conf = config['api']
port = conf[CONF_PORT] port = conf[CONF_PORT]
password = conf[CONF_PASSWORD] password = conf[CONF_PASSWORD]
_LOGGER.info("Starting log output from %s using esphomelib API", address) _LOGGER.info("Starting log output from %s using esphome API", address)
cli = APIClient(address, port, password) cli = APIClient(address, port, password)
stopping = False stopping = False
retry_timer = [] retry_timer = []
has_connects = []
def try_connect(tries=0, is_disconnect=True): def try_connect(tries=0, is_disconnect=True):
if stopping: if stopping:
return return
@ -451,6 +453,11 @@ def run_logs(config, address):
return return
wait_time = min(2**tries, 300) wait_time = min(2**tries, 300)
if not has_connects:
_LOGGER.warning(u"Initial connection failed. The ESP might not be connected "
u"to WiFi yet (%s). Re-Trying in %s seconds",
error, wait_time)
else:
_LOGGER.warning(u"Couldn't connect to API (%s). Trying to reconnect in %s seconds", _LOGGER.warning(u"Couldn't connect to API (%s). Trying to reconnect in %s seconds",
error, wait_time) error, wait_time)
timer = threading.Timer(wait_time, functools.partial(try_connect, tries + 1, is_disconnect)) timer = threading.Timer(wait_time, functools.partial(try_connect, tries + 1, is_disconnect))
@ -465,8 +472,6 @@ def run_logs(config, address):
'TCP buffer - This is only cosmetic)') 'TCP buffer - This is only cosmetic)')
safe_print(time_ + text) safe_print(time_ + text)
has_connects = []
def on_login(): def on_login():
try: try:
cli.subscribe_logs(on_log, dump_config=not has_connects) cli.subscribe_logs(on_log, dump_config=not has_connects)

View file

@ -2,16 +2,16 @@ import copy
import voluptuous as vol import voluptuous as vol
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_ABOVE, CONF_ACTION_ID, CONF_AND, CONF_AUTOMATION_ID, \ from esphome.const import CONF_ABOVE, CONF_ACTION_ID, CONF_AND, CONF_AUTOMATION_ID, \
CONF_BELOW, CONF_CONDITION, CONF_CONDITION_ID, CONF_DELAY, CONF_ELSE, CONF_ID, CONF_IF, \ CONF_BELOW, CONF_CONDITION, CONF_CONDITION_ID, CONF_DELAY, CONF_ELSE, CONF_ID, CONF_IF, \
CONF_LAMBDA, CONF_OR, CONF_RANGE, CONF_THEN, CONF_TRIGGER_ID, CONF_WHILE CONF_LAMBDA, CONF_OR, CONF_RANGE, CONF_THEN, CONF_TRIGGER_ID, CONF_WHILE, CONF_WAIT_UNTIL
from esphomeyaml.core import CORE from esphome.core import CORE
from esphomeyaml.cpp_generator import ArrayInitializer, Pvariable, TemplateArguments, add, \ from esphome.cpp_generator import Pvariable, TemplateArguments, add, get_variable, \
get_variable, process_lambda, templatable process_lambda, templatable
from esphomeyaml.cpp_types import Action, App, Component, PollingComponent, Trigger, \ from esphome.cpp_types import Action, App, Component, PollingComponent, Trigger, bool_, \
esphomelib_ns, float_, uint32, void, bool_ esphome_ns, float_, uint32, void
from esphomeyaml.util import ServiceRegistry from esphome.util import ServiceRegistry
def maybe_simple_id(*validators): def maybe_simple_id(*validators):
@ -98,18 +98,19 @@ ACTION_REGISTRY = ServiceRegistry()
CONDITION_REGISTRY = ServiceRegistry() CONDITION_REGISTRY = ServiceRegistry()
# pylint: disable=invalid-name # pylint: disable=invalid-name
DelayAction = esphomelib_ns.class_('DelayAction', Action, Component) DelayAction = esphome_ns.class_('DelayAction', Action, Component)
LambdaAction = esphomelib_ns.class_('LambdaAction', Action) LambdaAction = esphome_ns.class_('LambdaAction', Action)
IfAction = esphomelib_ns.class_('IfAction', Action) IfAction = esphome_ns.class_('IfAction', Action)
WhileAction = esphomelib_ns.class_('WhileAction', Action) WhileAction = esphome_ns.class_('WhileAction', Action)
UpdateComponentAction = esphomelib_ns.class_('UpdateComponentAction', Action) WaitUntilAction = esphome_ns.class_('WaitUntilAction', Action, Component)
Automation = esphomelib_ns.class_('Automation') UpdateComponentAction = esphome_ns.class_('UpdateComponentAction', Action)
Automation = esphome_ns.class_('Automation')
Condition = esphomelib_ns.class_('Condition') Condition = esphome_ns.class_('Condition')
AndCondition = esphomelib_ns.class_('AndCondition', Condition) AndCondition = esphome_ns.class_('AndCondition', Condition)
OrCondition = esphomelib_ns.class_('OrCondition', Condition) OrCondition = esphome_ns.class_('OrCondition', Condition)
RangeCondition = esphomelib_ns.class_('RangeCondition', Condition) RangeCondition = esphome_ns.class_('RangeCondition', Condition)
LambdaCondition = esphomelib_ns.class_('LambdaCondition', Condition) LambdaCondition = esphome_ns.class_('LambdaCondition', Condition)
def validate_automation(extra_schema=None, extra_validators=None, single=False): def validate_automation(extra_schema=None, extra_validators=None, single=False):
@ -125,6 +126,9 @@ def validate_automation(extra_schema=None, extra_validators=None, single=False):
# First try as a sequence of actions # First try as a sequence of actions
return [schema({CONF_THEN: value})] return [schema({CONF_THEN: value})]
except vol.Invalid as err: except vol.Invalid as err:
if err.path and err.path[0] == CONF_THEN:
err.path.pop(0)
# Next try as a sequence of automations # Next try as a sequence of automations
try: try:
return vol.Schema([schema])(value) return vol.Schema([schema])(value)
@ -265,6 +269,29 @@ def while_action_to_code(config, action_id, arg_type, template_arg):
yield action yield action
def validate_wait_until(value):
schema = vol.Schema({
vol.Required(CONF_CONDITION): validate_recursive_condition
})
if isinstance(value, dict) and CONF_CONDITION in value:
return schema(value)
return validate_wait_until({CONF_CONDITION: value})
WAIT_UNTIL_ACTION_SCHEMA = validate_wait_until
@ACTION_REGISTRY.register(CONF_WAIT_UNTIL, WAIT_UNTIL_ACTION_SCHEMA)
def wait_until_action_to_code(config, action_id, arg_type, template_arg):
for conditions in build_conditions(config[CONF_CONDITION], arg_type):
yield None
rhs = WaitUntilAction.new(template_arg, conditions)
type = WaitUntilAction.template(template_arg)
action = Pvariable(action_id, rhs, type=type)
add(App.register_component(action))
yield action
LAMBDA_ACTION_SCHEMA = cv.lambda_ LAMBDA_ACTION_SCHEMA = cv.lambda_
@ -318,11 +345,10 @@ def build_action(full_config, arg_type):
def build_actions(config, arg_type): def build_actions(config, arg_type):
actions = [] actions = []
for conf in config: for conf in config:
action = None
for action in build_action(conf, arg_type): for action in build_action(conf, arg_type):
yield None yield None
actions.append(action) actions.append(action)
yield ArrayInitializer(*actions, multiline=False) yield actions
def build_condition(full_config, arg_type): def build_condition(full_config, arg_type):
@ -342,7 +368,7 @@ def build_conditions(config, arg_type):
for condition in build_condition(conf, arg_type): for condition in build_condition(conf, arg_type):
yield None yield None
conditions.append(condition) conditions.append(condition)
yield ArrayInitializer(*conditions, multiline=False) yield conditions
def build_automation_(trigger, arg_type, config): def build_automation_(trigger, arg_type, config):

View file

@ -1,11 +1,11 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.components import i2c, sensor from esphome.components import i2c, sensor
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_ADDRESS, CONF_ID from esphome.const import CONF_ADDRESS, CONF_ID
from esphomeyaml.cpp_generator import Pvariable from esphome.cpp_generator import Pvariable
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App, Component from esphome.cpp_types import App, Component
DEPENDENCIES = ['i2c'] DEPENDENCIES = ['i2c']
MULTI_CONF = True MULTI_CONF = True

View file

@ -1,11 +1,11 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.components import i2c, sensor from esphome.components import i2c, sensor
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_ADDRESS, CONF_ID, CONF_UPDATE_INTERVAL from esphome.const import CONF_ADDRESS, CONF_ID, CONF_UPDATE_INTERVAL
from esphomeyaml.cpp_generator import Pvariable, add from esphome.cpp_generator import Pvariable, add
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App, PollingComponent from esphome.cpp_types import App, PollingComponent
DEPENDENCIES = ['i2c'] DEPENDENCIES = ['i2c']
MULTI_CONF = True MULTI_CONF = True

View file

@ -1,15 +1,15 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.automation import ACTION_REGISTRY from esphome.automation import ACTION_REGISTRY
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_DATA, CONF_DATA_TEMPLATE, CONF_ID, CONF_PASSWORD, CONF_PORT, \ from esphome.const import CONF_DATA, CONF_DATA_TEMPLATE, CONF_ID, CONF_PASSWORD, CONF_PORT, \
CONF_SERVICE, CONF_VARIABLES, CONF_REBOOT_TIMEOUT CONF_REBOOT_TIMEOUT, CONF_SERVICE, CONF_VARIABLES
from esphomeyaml.core import CORE from esphome.core import CORE
from esphomeyaml.cpp_generator import ArrayInitializer, Pvariable, add, get_variable, process_lambda from esphome.cpp_generator import Pvariable, add, get_variable, process_lambda
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import Action, App, Component, StoringController, esphomelib_ns from esphome.cpp_types import Action, App, Component, StoringController, esphome_ns
api_ns = esphomelib_ns.namespace('api') api_ns = esphome_ns.namespace('api')
APIServer = api_ns.class_('APIServer', Component, StoringController) APIServer = api_ns.class_('APIServer', Component, StoringController)
HomeAssistantServiceCallAction = api_ns.class_('HomeAssistantServiceCallAction', Action) HomeAssistantServiceCallAction = api_ns.class_('HomeAssistantServiceCallAction', Action)
KeyValuePair = api_ns.class_('KeyValuePair') KeyValuePair = api_ns.class_('KeyValuePair')
@ -74,15 +74,15 @@ def homeassistant_service_to_code(config, action_id, arg_type, template_arg):
add(act.set_service(config[CONF_SERVICE])) add(act.set_service(config[CONF_SERVICE]))
if CONF_DATA in config: if CONF_DATA in config:
datas = [KeyValuePair(k, v) for k, v in config[CONF_DATA].items()] datas = [KeyValuePair(k, v) for k, v in config[CONF_DATA].items()]
add(act.set_data(ArrayInitializer(*datas))) add(act.set_data(datas))
if CONF_DATA_TEMPLATE in config: if CONF_DATA_TEMPLATE in config:
datas = [KeyValuePair(k, v) for k, v in config[CONF_DATA_TEMPLATE].items()] datas = [KeyValuePair(k, v) for k, v in config[CONF_DATA_TEMPLATE].items()]
add(act.set_data_template(ArrayInitializer(*datas))) add(act.set_data_template(datas))
if CONF_VARIABLES in config: if CONF_VARIABLES in config:
datas = [] datas = []
for key, value in config[CONF_VARIABLES].items(): for key, value in config[CONF_VARIABLES].items():
for value_ in process_lambda(value, []): for value_ in process_lambda(value, []):
yield None yield None
datas.append(TemplatableKeyValuePair(key, value_)) datas.append(TemplatableKeyValuePair(key, value_))
add(act.set_variables(ArrayInitializer(*datas))) add(act.set_variables(datas))
yield act yield act

View file

@ -1,21 +1,19 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml import automation, core from esphome import automation, core
from esphomeyaml.automation import maybe_simple_id, CONDITION_REGISTRY, Condition from esphome.automation import CONDITION_REGISTRY, Condition, maybe_simple_id
from esphomeyaml.components import mqtt from esphome.components import mqtt
from esphomeyaml.components.mqtt import setup_mqtt_component from esphome.components.mqtt import setup_mqtt_component
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_DELAYED_OFF, CONF_DELAYED_ON, CONF_DEVICE_CLASS, CONF_FILTERS, \ from esphome.const import CONF_DELAYED_OFF, CONF_DELAYED_ON, CONF_DEVICE_CLASS, CONF_FILTERS, \
CONF_HEARTBEAT, CONF_ID, CONF_INTERNAL, CONF_INVALID_COOLDOWN, CONF_INVERT, CONF_INVERTED, \ CONF_HEARTBEAT, CONF_ID, CONF_INTERNAL, CONF_INVALID_COOLDOWN, CONF_INVERT, CONF_INVERTED, \
CONF_LAMBDA, CONF_MAX_LENGTH, CONF_MIN_LENGTH, CONF_MQTT_ID, CONF_ON_CLICK, \ CONF_LAMBDA, CONF_MAX_LENGTH, CONF_MIN_LENGTH, CONF_MQTT_ID, CONF_ON_CLICK, \
CONF_ON_DOUBLE_CLICK, CONF_ON_MULTI_CLICK, CONF_ON_PRESS, CONF_ON_RELEASE, CONF_STATE, \ CONF_ON_DOUBLE_CLICK, CONF_ON_MULTI_CLICK, CONF_ON_PRESS, CONF_ON_RELEASE, CONF_ON_STATE, \
CONF_TIMING, CONF_TRIGGER_ID, CONF_ON_STATE CONF_STATE, CONF_TIMING, CONF_TRIGGER_ID
from esphomeyaml.core import CORE from esphome.core import CORE
from esphomeyaml.cpp_generator import process_lambda, ArrayInitializer, add, Pvariable, \ from esphome.cpp_generator import Pvariable, StructInitializer, add, get_variable, process_lambda
StructInitializer, get_variable from esphome.cpp_types import App, Component, Nameable, NoArg, Trigger, bool_, esphome_ns, optional
from esphomeyaml.cpp_types import esphomelib_ns, Nameable, Trigger, NoArg, Component, App, bool_, \ from esphome.py_compat import string_types
optional
from esphomeyaml.py_compat import string_types
DEVICE_CLASSES = [ DEVICE_CLASSES = [
'', 'battery', 'cold', 'connectivity', 'door', 'garage_door', 'gas', '', 'battery', 'cold', 'connectivity', 'door', 'garage_door', 'gas',
@ -28,7 +26,7 @@ PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
}) })
binary_sensor_ns = esphomelib_ns.namespace('binary_sensor') binary_sensor_ns = esphome_ns.namespace('binary_sensor')
BinarySensor = binary_sensor_ns.class_('BinarySensor', Nameable) BinarySensor = binary_sensor_ns.class_('BinarySensor', Nameable)
BinarySensorPtr = BinarySensor.operator('ptr') BinarySensorPtr = BinarySensor.operator('ptr')
MQTTBinarySensorComponent = binary_sensor_ns.class_('MQTTBinarySensorComponent', mqtt.MQTTComponent) MQTTBinarySensorComponent = binary_sensor_ns.class_('MQTTBinarySensorComponent', mqtt.MQTTComponent)
@ -53,15 +51,15 @@ HeartbeatFilter = binary_sensor_ns.class_('HeartbeatFilter', Filter, Component)
InvertFilter = binary_sensor_ns.class_('InvertFilter', Filter) InvertFilter = binary_sensor_ns.class_('InvertFilter', Filter)
LambdaFilter = binary_sensor_ns.class_('LambdaFilter', Filter) LambdaFilter = binary_sensor_ns.class_('LambdaFilter', Filter)
FILTER_KEYS = [CONF_INVERT, CONF_DELAYED_ON, CONF_DELAYED_OFF, CONF_LAMBDA, CONF_HEARTBEAT] FILTER_KEYS = [CONF_INVERT, CONF_DELAYED_ON, CONF_DELAYED_OFF, CONF_LAMBDA, CONF_HEARTBEAT]
FILTERS_SCHEMA = cv.ensure_list({ FILTERS_SCHEMA = cv.ensure_list({
vol.Optional(CONF_INVERT): None, vol.Optional(CONF_INVERT): None,
vol.Optional(CONF_DELAYED_ON): cv.positive_time_period_milliseconds, vol.Optional(CONF_DELAYED_ON): cv.positive_time_period_milliseconds,
vol.Optional(CONF_DELAYED_OFF): cv.positive_time_period_milliseconds, vol.Optional(CONF_DELAYED_OFF): cv.positive_time_period_milliseconds,
vol.Optional(CONF_HEARTBEAT): cv.positive_time_period_milliseconds,
vol.Optional(CONF_LAMBDA): cv.lambda_, vol.Optional(CONF_LAMBDA): cv.lambda_,
vol.Optional(CONF_HEARTBEAT): cv.invalid("The heartbeat filter has been removed in 1.11.0"),
}, cv.has_exactly_one_key(*FILTER_KEYS)) }, cv.has_exactly_one_key(*FILTER_KEYS))
MULTI_CLICK_TIMING_SCHEMA = vol.Schema({ MULTI_CLICK_TIMING_SCHEMA = vol.Schema({
@ -191,7 +189,7 @@ BINARY_SENSOR_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend({
vol.Optional(CONF_INVERTED): cv.invalid( vol.Optional(CONF_INVERTED): cv.invalid(
"The inverted binary_sensor property has been replaced by the " "The inverted binary_sensor property has been replaced by the "
"new 'invert' binary sensor filter. Please see " "new 'invert' binary sensor filter. Please see "
"https://esphomelib.com/esphomeyaml/components/binary_sensor/index.html." "https://esphome.io/components/binary_sensor/index.html."
), ),
}) })
@ -205,8 +203,6 @@ def setup_filter(config):
yield App.register_component(DelayedOffFilter.new(config[CONF_DELAYED_OFF])) yield App.register_component(DelayedOffFilter.new(config[CONF_DELAYED_OFF]))
elif CONF_DELAYED_ON in config: elif CONF_DELAYED_ON in config:
yield App.register_component(DelayedOnFilter.new(config[CONF_DELAYED_ON])) yield App.register_component(DelayedOnFilter.new(config[CONF_DELAYED_ON]))
elif CONF_HEARTBEAT in config:
yield App.register_component(HeartbeatFilter.new(config[CONF_HEARTBEAT]))
elif CONF_LAMBDA in config: elif CONF_LAMBDA in config:
for lambda_ in process_lambda(config[CONF_LAMBDA], [(bool_, 'x')], for lambda_ in process_lambda(config[CONF_LAMBDA], [(bool_, 'x')],
return_type=optional.template(bool_)): return_type=optional.template(bool_)):
@ -217,14 +213,13 @@ def setup_filter(config):
def setup_filters(config): def setup_filters(config):
filters = [] filters = []
for conf in config: for conf in config:
filter = None
for filter in setup_filter(conf): for filter in setup_filter(conf):
yield None yield None
filters.append(filter) filters.append(filter)
yield ArrayInitializer(*filters) yield filters
def setup_binary_sensor_core_(binary_sensor_var, mqtt_var, config): def setup_binary_sensor_core_(binary_sensor_var, config):
if CONF_INTERNAL in config: if CONF_INTERNAL in config:
add(binary_sensor_var.set_internal(CONF_INTERNAL)) add(binary_sensor_var.set_internal(CONF_INTERNAL))
if CONF_DEVICE_CLASS in config: if CONF_DEVICE_CLASS in config:
@ -232,7 +227,6 @@ def setup_binary_sensor_core_(binary_sensor_var, mqtt_var, config):
if CONF_INVERTED in config: if CONF_INVERTED in config:
add(binary_sensor_var.set_inverted(config[CONF_INVERTED])) add(binary_sensor_var.set_inverted(config[CONF_INVERTED]))
if CONF_FILTERS in config: if CONF_FILTERS in config:
filters = None
for filters in setup_filters(config[CONF_FILTERS]): for filters in setup_filters(config[CONF_FILTERS]):
yield yield
add(binary_sensor_var.add_filters(filters)) add(binary_sensor_var.add_filters(filters))
@ -267,7 +261,6 @@ def setup_binary_sensor_core_(binary_sensor_var, mqtt_var, config):
('min_length', tim[CONF_MIN_LENGTH]), ('min_length', tim[CONF_MIN_LENGTH]),
('max_length', tim.get(CONF_MAX_LENGTH, 4294967294)), ('max_length', tim.get(CONF_MAX_LENGTH, 4294967294)),
)) ))
timings = ArrayInitializer(*timings, multiline=False)
rhs = App.register_component(binary_sensor_var.make_multi_click_trigger(timings)) rhs = App.register_component(binary_sensor_var.make_multi_click_trigger(timings))
trigger = Pvariable(conf[CONF_TRIGGER_ID], rhs) trigger = Pvariable(conf[CONF_TRIGGER_ID], rhs)
if CONF_INVALID_COOLDOWN in conf: if CONF_INVALID_COOLDOWN in conf:
@ -279,22 +272,19 @@ def setup_binary_sensor_core_(binary_sensor_var, mqtt_var, config):
trigger = Pvariable(conf[CONF_TRIGGER_ID], rhs) trigger = Pvariable(conf[CONF_TRIGGER_ID], rhs)
automation.build_automation(trigger, bool_, conf) automation.build_automation(trigger, bool_, conf)
setup_mqtt_component(mqtt_var, config) setup_mqtt_component(binary_sensor_var.Pget_mqtt(), config)
def setup_binary_sensor(binary_sensor_obj, mqtt_obj, config): def setup_binary_sensor(binary_sensor_obj, config):
binary_sensor_var = Pvariable(config[CONF_ID], binary_sensor_obj, if not CORE.has_id(config[CONF_ID]):
has_side_effects=False) binary_sensor_obj = Pvariable(config[CONF_ID], binary_sensor_obj, has_side_effects=True)
mqtt_var = Pvariable(config[CONF_MQTT_ID], mqtt_obj, CORE.add_job(setup_binary_sensor_core_, binary_sensor_obj, config)
has_side_effects=False)
CORE.add_job(setup_binary_sensor_core_, binary_sensor_var, mqtt_var, config)
def register_binary_sensor(var, config): def register_binary_sensor(var, config):
binary_sensor_var = Pvariable(config[CONF_ID], var, has_side_effects=True) binary_sensor_var = Pvariable(config[CONF_ID], var, has_side_effects=True)
rhs = App.register_binary_sensor(binary_sensor_var) add(App.register_binary_sensor(binary_sensor_var))
mqtt_var = Pvariable(config[CONF_MQTT_ID], rhs, has_side_effects=True) CORE.add_job(setup_binary_sensor_core_, binary_sensor_var, config)
CORE.add_job(setup_binary_sensor_core_, binary_sensor_var, mqtt_var, config)
def core_to_hass_config(data, config): def core_to_hass_config(data, config):
@ -309,7 +299,6 @@ def core_to_hass_config(data, config):
BUILD_FLAGS = '-DUSE_BINARY_SENSOR' BUILD_FLAGS = '-DUSE_BINARY_SENSOR'
CONF_BINARY_SENSOR_IS_ON = 'binary_sensor.is_on' CONF_BINARY_SENSOR_IS_ON = 'binary_sensor.is_on'
BINARY_SENSOR_IS_ON_CONDITION_SCHEMA = maybe_simple_id({ BINARY_SENSOR_IS_ON_CONDITION_SCHEMA = maybe_simple_id({
vol.Required(CONF_ID): cv.use_variable_id(BinarySensor), vol.Required(CONF_ID): cv.use_variable_id(BinarySensor),

View file

@ -1,10 +1,10 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.components import binary_sensor, sensor from esphome.components import binary_sensor, sensor
from esphomeyaml.components.apds9960 import APDS9960, CONF_APDS9960_ID from esphome.components.apds9960 import APDS9960, CONF_APDS9960_ID
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_DIRECTION, CONF_NAME from esphome.const import CONF_DIRECTION, CONF_NAME
from esphomeyaml.cpp_generator import get_variable from esphome.cpp_generator import get_variable
DEPENDENCIES = ['apds9960'] DEPENDENCIES = ['apds9960']
APDS9960GestureDirectionBinarySensor = sensor.sensor_ns.class_( APDS9960GestureDirectionBinarySensor = sensor.sensor_ns.class_(

View file

@ -1,10 +1,10 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.components import binary_sensor from esphome.components import binary_sensor
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_BINARY_SENSORS, CONF_ID, CONF_LAMBDA from esphome.const import CONF_BINARY_SENSORS, CONF_ID, CONF_LAMBDA, CONF_NAME
from esphomeyaml.cpp_generator import process_lambda, variable from esphome.cpp_generator import add, process_lambda, variable
from esphomeyaml.cpp_types import std_vector from esphome.cpp_types import std_vector
CustomBinarySensorConstructor = binary_sensor.binary_sensor_ns.class_( CustomBinarySensorConstructor = binary_sensor.binary_sensor_ns.class_(
'CustomBinarySensorConstructor') 'CustomBinarySensorConstructor')
@ -26,8 +26,10 @@ def to_code(config):
rhs = CustomBinarySensorConstructor(template_) rhs = CustomBinarySensorConstructor(template_)
custom = variable(config[CONF_ID], rhs) custom = variable(config[CONF_ID], rhs)
for i, sens in enumerate(config[CONF_BINARY_SENSORS]): for i, conf in enumerate(config[CONF_BINARY_SENSORS]):
binary_sensor.register_binary_sensor(custom.get_binary_sensor(i), sens) rhs = custom.Pget_binary_sensor(i)
add(rhs.set_name(conf[CONF_NAME]))
binary_sensor.register_binary_sensor(rhs, conf)
BUILD_FLAGS = '-DUSE_CUSTOM_BINARY_SENSOR' BUILD_FLAGS = '-DUSE_CUSTOM_BINARY_SENSOR'

View file

@ -1,15 +1,15 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.components import binary_sensor from esphome.components import binary_sensor
from esphomeyaml.components.esp32_ble_tracker import CONF_ESP32_BLE_ID, ESP32BLETracker, \ from esphome.components.esp32_ble_tracker import CONF_ESP32_BLE_ID, ESP32BLETracker, \
make_address_array make_address_array
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_MAC_ADDRESS, CONF_NAME from esphome.const import CONF_MAC_ADDRESS, CONF_NAME
from esphomeyaml.cpp_generator import get_variable from esphome.cpp_generator import get_variable
from esphomeyaml.cpp_types import esphomelib_ns from esphome.cpp_types import esphome_ns
DEPENDENCIES = ['esp32_ble_tracker'] DEPENDENCIES = ['esp32_ble_tracker']
ESP32BLEPresenceDevice = esphomelib_ns.class_('ESP32BLEPresenceDevice', binary_sensor.BinarySensor) ESP32BLEPresenceDevice = esphome_ns.class_('ESP32BLEPresenceDevice', binary_sensor.BinarySensor)
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
cv.GenerateID(): cv.declare_variable_id(ESP32BLEPresenceDevice), cv.GenerateID(): cv.declare_variable_id(ESP32BLEPresenceDevice),
@ -19,7 +19,6 @@ PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend
def to_code(config): def to_code(config):
hub = None
for hub in get_variable(config[CONF_ESP32_BLE_ID]): for hub in get_variable(config[CONF_ESP32_BLE_ID]):
yield yield
rhs = hub.make_presence_sensor(config[CONF_NAME], make_address_array(config[CONF_MAC_ADDRESS])) rhs = hub.make_presence_sensor(config[CONF_NAME], make_address_array(config[CONF_MAC_ADDRESS]))

View file

@ -1,12 +1,12 @@
import voluptuous as vol import voluptuous as vol
import esphomeyaml.config_validation as cv from esphome.components import binary_sensor
from esphomeyaml.components import binary_sensor from esphome.components.esp32_touch import ESP32TouchComponent
from esphomeyaml.components.esp32_touch import ESP32TouchComponent import esphome.config_validation as cv
from esphomeyaml.const import CONF_NAME, CONF_PIN, CONF_THRESHOLD, ESP_PLATFORM_ESP32 from esphome.const import CONF_NAME, CONF_PIN, CONF_THRESHOLD, ESP_PLATFORM_ESP32
from esphomeyaml.cpp_generator import get_variable from esphome.cpp_generator import get_variable
from esphomeyaml.cpp_types import global_ns from esphome.cpp_types import global_ns
from esphomeyaml.pins import validate_gpio_pin from esphome.pins import validate_gpio_pin
ESP_PLATFORMS = [ESP_PLATFORM_ESP32] ESP_PLATFORMS = [ESP_PLATFORM_ESP32]

View file

@ -1,21 +1,19 @@
import voluptuous as vol import voluptuous as vol
import esphomeyaml.config_validation as cv from esphome import pins
from esphomeyaml import pins from esphome.components import binary_sensor
from esphomeyaml.components import binary_sensor import esphome.config_validation as cv
from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_PIN from esphome.const import CONF_ID, CONF_NAME, CONF_PIN
from esphomeyaml.cpp_generator import variable from esphome.cpp_generator import Pvariable
from esphomeyaml.cpp_helpers import gpio_input_pin_expression, setup_component from esphome.cpp_helpers import gpio_input_pin_expression, setup_component
from esphomeyaml.cpp_types import Application, Component, App from esphome.cpp_types import App, Component
MakeGPIOBinarySensor = Application.struct('MakeGPIOBinarySensor')
GPIOBinarySensorComponent = binary_sensor.binary_sensor_ns.class_('GPIOBinarySensorComponent', GPIOBinarySensorComponent = binary_sensor.binary_sensor_ns.class_('GPIOBinarySensorComponent',
binary_sensor.BinarySensor, binary_sensor.BinarySensor,
Component) Component)
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
cv.GenerateID(): cv.declare_variable_id(GPIOBinarySensorComponent), cv.GenerateID(): cv.declare_variable_id(GPIOBinarySensorComponent),
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeGPIOBinarySensor),
vol.Required(CONF_PIN): pins.gpio_input_pin_schema vol.Required(CONF_PIN): pins.gpio_input_pin_schema
}).extend(cv.COMPONENT_SCHEMA.schema)) }).extend(cv.COMPONENT_SCHEMA.schema))
@ -25,9 +23,9 @@ def to_code(config):
for pin in gpio_input_pin_expression(config[CONF_PIN]): for pin in gpio_input_pin_expression(config[CONF_PIN]):
yield yield
rhs = App.make_gpio_binary_sensor(config[CONF_NAME], pin) rhs = App.make_gpio_binary_sensor(config[CONF_NAME], pin)
gpio = variable(config[CONF_MAKE_ID], rhs) gpio = Pvariable(config[CONF_ID], rhs)
binary_sensor.setup_binary_sensor(gpio.Pgpio, gpio.Pmqtt, config) binary_sensor.setup_binary_sensor(gpio, config)
setup_component(gpio.Pgpio, config) setup_component(gpio, config)
BUILD_FLAGS = '-DUSE_GPIO_BINARY_SENSOR' BUILD_FLAGS = '-DUSE_GPIO_BINARY_SENSOR'

View file

@ -0,0 +1,30 @@
import voluptuous as vol
from esphome.components import binary_sensor
import esphome.config_validation as cv
from esphome.const import CONF_ENTITY_ID, CONF_ID, CONF_NAME
from esphome.cpp_generator import Pvariable
from esphome.cpp_types import App
DEPENDENCIES = ['api']
HomeassistantBinarySensor = binary_sensor.binary_sensor_ns.class_('HomeassistantBinarySensor',
binary_sensor.BinarySensor)
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
cv.GenerateID(): cv.declare_variable_id(HomeassistantBinarySensor),
vol.Required(CONF_ENTITY_ID): cv.entity_id,
}))
def to_code(config):
rhs = App.make_homeassistant_binary_sensor(config[CONF_NAME], config[CONF_ENTITY_ID])
subs = Pvariable(config[CONF_ID], rhs)
binary_sensor.setup_binary_sensor(subs, config)
BUILD_FLAGS = '-DUSE_HOMEASSISTANT_BINARY_SENSOR'
def to_hass_config(data, config):
return binary_sensor.core_to_hass_config(data, config)

View file

@ -1,10 +1,10 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.components import binary_sensor, display from esphome.components import binary_sensor, display
from esphomeyaml.components.display.nextion import Nextion from esphome.components.display.nextion import Nextion
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_COMPONENT_ID, CONF_NAME, CONF_PAGE_ID from esphome.const import CONF_COMPONENT_ID, CONF_NAME, CONF_PAGE_ID
from esphomeyaml.cpp_generator import get_variable from esphome.cpp_generator import get_variable
DEPENDENCIES = ['display'] DEPENDENCIES = ['display']

View file

@ -1,11 +1,11 @@
import voluptuous as vol import voluptuous as vol
import esphomeyaml.config_validation as cv from esphome.components import binary_sensor
from esphomeyaml.components import binary_sensor from esphome.components.pn532 import PN532Component
from esphomeyaml.components.pn532 import PN532Component import esphome.config_validation as cv
from esphomeyaml.const import CONF_NAME, CONF_UID from esphome.const import CONF_NAME, CONF_UID
from esphomeyaml.core import HexInt from esphome.core import HexInt
from esphomeyaml.cpp_generator import get_variable, ArrayInitializer from esphome.cpp_generator import get_variable
DEPENDENCIES = ['pn532'] DEPENDENCIES = ['pn532']
@ -41,7 +41,7 @@ def to_code(config):
for hub in get_variable(config[CONF_PN532_ID]): for hub in get_variable(config[CONF_PN532_ID]):
yield yield
addr = [HexInt(int(x, 16)) for x in config[CONF_UID].split('-')] addr = [HexInt(int(x, 16)) for x in config[CONF_UID].split('-')]
rhs = hub.make_tag(config[CONF_NAME], ArrayInitializer(*addr, multiline=False)) rhs = hub.make_tag(config[CONF_NAME], addr)
binary_sensor.register_binary_sensor(rhs, config) binary_sensor.register_binary_sensor(rhs, config)

View file

@ -1,9 +1,9 @@
import voluptuous as vol import voluptuous as vol
import esphomeyaml.config_validation as cv from esphome.components import binary_sensor, rdm6300
from esphomeyaml.components import binary_sensor, rdm6300 import esphome.config_validation as cv
from esphomeyaml.const import CONF_NAME, CONF_UID from esphome.const import CONF_NAME, CONF_UID
from esphomeyaml.cpp_generator import get_variable from esphome.cpp_generator import get_variable
DEPENDENCIES = ['rdm6300'] DEPENDENCIES = ['rdm6300']

View file

@ -1,42 +1,60 @@
import voluptuous as vol import voluptuous as vol
import esphomeyaml.config_validation as cv from esphome.components import binary_sensor
from esphomeyaml.components import binary_sensor from esphome.components.remote_receiver import RemoteReceiverComponent, remote_ns
from esphomeyaml.components.remote_receiver import RemoteReceiverComponent, remote_ns from esphome.components.remote_transmitter import RC_SWITCH_RAW_SCHEMA, \
from esphomeyaml.components.remote_transmitter import RC_SWITCH_RAW_SCHEMA, \
RC_SWITCH_TYPE_A_SCHEMA, RC_SWITCH_TYPE_B_SCHEMA, RC_SWITCH_TYPE_C_SCHEMA, \ RC_SWITCH_TYPE_A_SCHEMA, RC_SWITCH_TYPE_B_SCHEMA, RC_SWITCH_TYPE_C_SCHEMA, \
RC_SWITCH_TYPE_D_SCHEMA, binary_code, build_rc_switch_protocol RC_SWITCH_TYPE_D_SCHEMA, binary_code, build_rc_switch_protocol
from esphomeyaml.const import CONF_ADDRESS, CONF_CHANNEL, CONF_CODE, CONF_COMMAND, CONF_DATA, \ import esphome.config_validation as cv
CONF_DEVICE, CONF_FAMILY, CONF_GROUP, CONF_LG, CONF_NAME, CONF_NBITS, CONF_NEC, \ from esphome.const import CONF_ADDRESS, CONF_CHANNEL, CONF_CODE, CONF_COMMAND, CONF_DATA, \
CONF_PANASONIC, CONF_PROTOCOL, CONF_RAW, CONF_RC_SWITCH_RAW, CONF_RC_SWITCH_TYPE_A, \ CONF_DEVICE, CONF_FAMILY, CONF_GROUP, CONF_ID, CONF_JVC, CONF_LG, CONF_NAME, CONF_NBITS, \
CONF_NEC, CONF_PANASONIC, CONF_PROTOCOL, CONF_RAW, CONF_RC_SWITCH_RAW, CONF_RC_SWITCH_TYPE_A, \
CONF_RC_SWITCH_TYPE_B, CONF_RC_SWITCH_TYPE_C, CONF_RC_SWITCH_TYPE_D, CONF_SAMSUNG, CONF_SONY, \ CONF_RC_SWITCH_TYPE_B, CONF_RC_SWITCH_TYPE_C, CONF_RC_SWITCH_TYPE_D, CONF_SAMSUNG, CONF_SONY, \
CONF_STATE CONF_STATE, CONF_RC5
from esphomeyaml.cpp_generator import ArrayInitializer, get_variable, Pvariable from esphome.cpp_generator import Pvariable, get_variable, progmem_array
from esphome.cpp_types import int32
DEPENDENCIES = ['remote_receiver'] DEPENDENCIES = ['remote_receiver']
REMOTE_KEYS = [CONF_NEC, CONF_LG, CONF_SONY, CONF_PANASONIC, CONF_SAMSUNG, CONF_RAW, REMOTE_KEYS = [CONF_JVC, CONF_NEC, CONF_LG, CONF_SONY, CONF_PANASONIC, CONF_SAMSUNG, CONF_RAW,
CONF_RC_SWITCH_RAW, CONF_RC_SWITCH_TYPE_A, CONF_RC_SWITCH_TYPE_B, CONF_RC_SWITCH_RAW, CONF_RC_SWITCH_TYPE_A, CONF_RC_SWITCH_TYPE_B,
CONF_RC_SWITCH_TYPE_C, CONF_RC_SWITCH_TYPE_D] CONF_RC_SWITCH_TYPE_C, CONF_RC_SWITCH_TYPE_D, CONF_RC5]
CONF_REMOTE_RECEIVER_ID = 'remote_receiver_id' CONF_REMOTE_RECEIVER_ID = 'remote_receiver_id'
CONF_RECEIVER_ID = 'receiver_id' CONF_RECEIVER_ID = 'receiver_id'
RemoteReceiver = remote_ns.class_('RemoteReceiver', binary_sensor.BinarySensor) RemoteReceiver = remote_ns.class_('RemoteReceiver', binary_sensor.BinarySensor)
JVCReceiver = remote_ns.class_('JVCReceiver', RemoteReceiver)
LGReceiver = remote_ns.class_('LGReceiver', RemoteReceiver) LGReceiver = remote_ns.class_('LGReceiver', RemoteReceiver)
NECReceiver = remote_ns.class_('NECReceiver', RemoteReceiver) NECReceiver = remote_ns.class_('NECReceiver', RemoteReceiver)
PanasonicReceiver = remote_ns.class_('PanasonicReceiver', RemoteReceiver) PanasonicReceiver = remote_ns.class_('PanasonicReceiver', RemoteReceiver)
RawReceiver = remote_ns.class_('RawReceiver', RemoteReceiver) RawReceiver = remote_ns.class_('RawReceiver', RemoteReceiver)
SamsungReceiver = remote_ns.class_('SamsungReceiver', RemoteReceiver) SamsungReceiver = remote_ns.class_('SamsungReceiver', RemoteReceiver)
SonyReceiver = remote_ns.class_('SonyReceiver', RemoteReceiver) SonyReceiver = remote_ns.class_('SonyReceiver', RemoteReceiver)
RC5Receiver = remote_ns.class_('RC5Receiver', RemoteReceiver)
RCSwitchRawReceiver = remote_ns.class_('RCSwitchRawReceiver', RemoteReceiver) RCSwitchRawReceiver = remote_ns.class_('RCSwitchRawReceiver', RemoteReceiver)
RCSwitchTypeAReceiver = remote_ns.class_('RCSwitchTypeAReceiver', RCSwitchRawReceiver) RCSwitchTypeAReceiver = remote_ns.class_('RCSwitchTypeAReceiver', RCSwitchRawReceiver)
RCSwitchTypeBReceiver = remote_ns.class_('RCSwitchTypeBReceiver', RCSwitchRawReceiver) RCSwitchTypeBReceiver = remote_ns.class_('RCSwitchTypeBReceiver', RCSwitchRawReceiver)
RCSwitchTypeCReceiver = remote_ns.class_('RCSwitchTypeCReceiver', RCSwitchRawReceiver) RCSwitchTypeCReceiver = remote_ns.class_('RCSwitchTypeCReceiver', RCSwitchRawReceiver)
RCSwitchTypeDReceiver = remote_ns.class_('RCSwitchTypeDReceiver', RCSwitchRawReceiver) RCSwitchTypeDReceiver = remote_ns.class_('RCSwitchTypeDReceiver', RCSwitchRawReceiver)
def validate_raw(value):
if isinstance(value, dict):
return vol.Schema({
cv.GenerateID(): cv.declare_variable_id(int32),
vol.Required(CONF_DATA): [vol.Any(vol.Coerce(int), cv.time_period_microseconds)],
})(value)
return validate_raw({
CONF_DATA: value
})
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
cv.GenerateID(): cv.declare_variable_id(RemoteReceiver), cv.GenerateID(): cv.declare_variable_id(RemoteReceiver),
vol.Optional(CONF_JVC): vol.Schema({
vol.Required(CONF_DATA): cv.hex_uint32_t,
}),
vol.Optional(CONF_LG): vol.Schema({ vol.Optional(CONF_LG): vol.Schema({
vol.Required(CONF_DATA): cv.hex_uint32_t, vol.Required(CONF_DATA): cv.hex_uint32_t,
vol.Optional(CONF_NBITS, default=28): cv.one_of(28, 32, int=True), vol.Optional(CONF_NBITS, default=28): cv.one_of(28, 32, int=True),
@ -56,7 +74,11 @@ PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend
vol.Required(CONF_ADDRESS): cv.hex_uint16_t, vol.Required(CONF_ADDRESS): cv.hex_uint16_t,
vol.Required(CONF_COMMAND): cv.hex_uint32_t, vol.Required(CONF_COMMAND): cv.hex_uint32_t,
}), }),
vol.Optional(CONF_RAW): [vol.Any(vol.Coerce(int), cv.time_period_microseconds)], vol.Optional(CONF_RC5): vol.Schema({
vol.Required(CONF_ADDRESS): vol.All(cv.hex_int, vol.Range(min=0, max=0x1F)),
vol.Required(CONF_COMMAND): vol.All(cv.hex_int, vol.Range(min=0, max=0x3F)),
}),
vol.Optional(CONF_RAW): validate_raw,
vol.Optional(CONF_RC_SWITCH_RAW): RC_SWITCH_RAW_SCHEMA, vol.Optional(CONF_RC_SWITCH_RAW): RC_SWITCH_RAW_SCHEMA,
vol.Optional(CONF_RC_SWITCH_TYPE_A): RC_SWITCH_TYPE_A_SCHEMA, vol.Optional(CONF_RC_SWITCH_TYPE_A): RC_SWITCH_TYPE_A_SCHEMA,
vol.Optional(CONF_RC_SWITCH_TYPE_B): RC_SWITCH_TYPE_B_SCHEMA, vol.Optional(CONF_RC_SWITCH_TYPE_B): RC_SWITCH_TYPE_B_SCHEMA,
@ -71,6 +93,8 @@ PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend
def receiver_base(full_config): def receiver_base(full_config):
name = full_config[CONF_NAME] name = full_config[CONF_NAME]
key, config = next((k, v) for k, v in full_config.items() if k in REMOTE_KEYS) key, config = next((k, v) for k, v in full_config.items() if k in REMOTE_KEYS)
if key == CONF_JVC:
return JVCReceiver.new(name, config[CONF_DATA])
if key == CONF_LG: if key == CONF_LG:
return LGReceiver.new(name, config[CONF_DATA], config[CONF_NBITS]) return LGReceiver.new(name, config[CONF_DATA], config[CONF_NBITS])
if key == CONF_NEC: if key == CONF_NEC:
@ -81,9 +105,11 @@ def receiver_base(full_config):
return SamsungReceiver.new(name, config[CONF_DATA]) return SamsungReceiver.new(name, config[CONF_DATA])
if key == CONF_SONY: if key == CONF_SONY:
return SonyReceiver.new(name, config[CONF_DATA], config[CONF_NBITS]) return SonyReceiver.new(name, config[CONF_DATA], config[CONF_NBITS])
if key == CONF_RC5:
return RC5Receiver.new(name, config[CONF_ADDRESS], config[CONF_COMMAND])
if key == CONF_RAW: if key == CONF_RAW:
data = ArrayInitializer(*config, multiline=False) arr = progmem_array(config[CONF_ID], config[CONF_DATA])
return RawReceiver.new(name, data) return RawReceiver.new(name, arr, len(config[CONF_DATA]))
if key == CONF_RC_SWITCH_RAW: if key == CONF_RC_SWITCH_RAW:
return RCSwitchRawReceiver.new(name, build_rc_switch_protocol(config[CONF_PROTOCOL]), return RCSwitchRawReceiver.new(name, build_rc_switch_protocol(config[CONF_PROTOCOL]),
binary_code(config[CONF_CODE]), len(config[CONF_CODE])) binary_code(config[CONF_CODE]), len(config[CONF_CODE]))

View file

@ -1,27 +1,24 @@
import esphomeyaml.config_validation as cv from esphome.components import binary_sensor
from esphomeyaml.components import binary_sensor import esphome.config_validation as cv
from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME from esphome.const import CONF_ID, CONF_NAME
from esphomeyaml.cpp_generator import variable from esphome.cpp_generator import Pvariable
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import Application, Component, App from esphome.cpp_types import App, Component
MakeStatusBinarySensor = Application.struct('MakeStatusBinarySensor')
StatusBinarySensor = binary_sensor.binary_sensor_ns.class_('StatusBinarySensor', StatusBinarySensor = binary_sensor.binary_sensor_ns.class_('StatusBinarySensor',
binary_sensor.BinarySensor, binary_sensor.BinarySensor,
Component) Component)
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeStatusBinarySensor),
cv.GenerateID(): cv.declare_variable_id(StatusBinarySensor), cv.GenerateID(): cv.declare_variable_id(StatusBinarySensor),
}).extend(cv.COMPONENT_SCHEMA.schema)) }).extend(cv.COMPONENT_SCHEMA.schema))
def to_code(config): def to_code(config):
rhs = App.make_status_binary_sensor(config[CONF_NAME]) rhs = App.make_status_binary_sensor(config[CONF_NAME])
status = variable(config[CONF_MAKE_ID], rhs) status = Pvariable(config[CONF_ID], rhs)
binary_sensor.setup_binary_sensor(status.Pstatus, status.Pmqtt, config) binary_sensor.setup_binary_sensor(status, config)
setup_component(status.Pstatus, config) setup_component(status, config)
BUILD_FLAGS = '-DUSE_STATUS_BINARY_SENSOR' BUILD_FLAGS = '-DUSE_STATUS_BINARY_SENSOR'

View file

@ -0,0 +1,60 @@
import voluptuous as vol
from esphome.automation import ACTION_REGISTRY
from esphome.components import binary_sensor
import esphome.config_validation as cv
from esphome.const import CONF_ID, CONF_LAMBDA, CONF_NAME, CONF_STATE
from esphome.cpp_generator import Pvariable, add, get_variable, process_lambda, templatable
from esphome.cpp_helpers import setup_component
from esphome.cpp_types import Action, App, Component, bool_, optional
TemplateBinarySensor = binary_sensor.binary_sensor_ns.class_('TemplateBinarySensor',
binary_sensor.BinarySensor,
Component)
BinarySensorPublishAction = binary_sensor.binary_sensor_ns.class_('BinarySensorPublishAction',
Action)
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
cv.GenerateID(): cv.declare_variable_id(TemplateBinarySensor),
vol.Optional(CONF_LAMBDA): cv.lambda_,
}).extend(cv.COMPONENT_SCHEMA.schema))
def to_code(config):
rhs = App.make_template_binary_sensor(config[CONF_NAME])
var = Pvariable(config[CONF_ID], rhs)
binary_sensor.setup_binary_sensor(var, config)
setup_component(var, config)
if CONF_LAMBDA in config:
for template_ in process_lambda(config[CONF_LAMBDA], [],
return_type=optional.template(bool_)):
yield
add(var.set_template(template_))
BUILD_FLAGS = '-DUSE_TEMPLATE_BINARY_SENSOR'
CONF_BINARY_SENSOR_TEMPLATE_PUBLISH = 'binary_sensor.template.publish'
BINARY_SENSOR_TEMPLATE_PUBLISH_ACTION_SCHEMA = vol.Schema({
vol.Required(CONF_ID): cv.use_variable_id(binary_sensor.BinarySensor),
vol.Required(CONF_STATE): cv.templatable(cv.boolean),
})
@ACTION_REGISTRY.register(CONF_BINARY_SENSOR_TEMPLATE_PUBLISH,
BINARY_SENSOR_TEMPLATE_PUBLISH_ACTION_SCHEMA)
def binary_sensor_template_publish_to_code(config, action_id, arg_type, template_arg):
for var in get_variable(config[CONF_ID]):
yield None
rhs = var.make_binary_sensor_publish_action(template_arg)
type = BinarySensorPublishAction.template(arg_type)
action = Pvariable(action_id, rhs, type=type)
for template_ in templatable(config[CONF_STATE], arg_type, bool_):
yield None
add(action.set_state(template_))
yield action
def to_hass_config(data, config):
return binary_sensor.core_to_hass_config(data, config)

View file

@ -1,18 +1,19 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.automation import ACTION_REGISTRY, maybe_simple_id from esphome.automation import ACTION_REGISTRY, maybe_simple_id
from esphomeyaml.components import mqtt from esphome.components import mqtt
from esphomeyaml.components.mqtt import setup_mqtt_component from esphome.components.mqtt import setup_mqtt_component
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_ID, CONF_INTERNAL, CONF_MQTT_ID from esphome.const import CONF_ID, CONF_INTERNAL, CONF_MQTT_ID
from esphomeyaml.cpp_generator import Pvariable, add, get_variable from esphome.core import CORE
from esphomeyaml.cpp_types import Action, Nameable, esphomelib_ns from esphome.cpp_generator import Pvariable, add, get_variable
from esphome.cpp_types import Action, Nameable, esphome_ns
PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
}) })
cover_ns = esphomelib_ns.namespace('cover') cover_ns = esphome_ns.namespace('cover')
Cover = cover_ns.class_('Cover', Nameable) Cover = cover_ns.class_('Cover', Nameable)
MQTTCoverComponent = cover_ns.class_('MQTTCoverComponent', mqtt.MQTTComponent) MQTTCoverComponent = cover_ns.class_('MQTTCoverComponent', mqtt.MQTTComponent)
@ -21,6 +22,12 @@ CoverState = cover_ns.class_('CoverState')
COVER_OPEN = cover_ns.COVER_OPEN COVER_OPEN = cover_ns.COVER_OPEN
COVER_CLOSED = cover_ns.COVER_CLOSED COVER_CLOSED = cover_ns.COVER_CLOSED
validate_cover_state = cv.one_of('OPEN', 'CLOSED', upper=True)
COVER_STATES = {
'OPEN': COVER_OPEN,
'CLOSED': COVER_CLOSED,
}
# Actions # Actions
OpenAction = cover_ns.class_('OpenAction', Action) OpenAction = cover_ns.class_('OpenAction', Action)
CloseAction = cover_ns.class_('CloseAction', Action) CloseAction = cover_ns.class_('CloseAction', Action)
@ -34,16 +41,14 @@ COVER_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend({
COVER_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(COVER_SCHEMA.schema) COVER_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(COVER_SCHEMA.schema)
def setup_cover_core_(cover_var, mqtt_var, config): def setup_cover_core_(cover_var, config):
if CONF_INTERNAL in config: if CONF_INTERNAL in config:
add(cover_var.set_internal(config[CONF_INTERNAL])) add(cover_var.set_internal(config[CONF_INTERNAL]))
setup_mqtt_component(mqtt_var, config) setup_mqtt_component(cover_var.Pget_mqtt(), config)
def setup_cover(cover_obj, mqtt_obj, config): def setup_cover(cover_obj, config):
cover_var = Pvariable(config[CONF_ID], cover_obj, has_side_effects=False) CORE.add_job(setup_cover_core_, cover_obj, config)
mqtt_var = Pvariable(config[CONF_MQTT_ID], mqtt_obj, has_side_effects=False)
setup_cover_core_(cover_var, mqtt_var, config)
BUILD_FLAGS = '-DUSE_COVER' BUILD_FLAGS = '-DUSE_COVER'

View file

@ -0,0 +1,88 @@
import voluptuous as vol
from esphome import automation
from esphome.automation import ACTION_REGISTRY
from esphome.components import cover
import esphome.config_validation as cv
from esphome.const import CONF_ASSUMED_STATE, CONF_CLOSE_ACTION, CONF_ID, CONF_LAMBDA, CONF_NAME, \
CONF_OPEN_ACTION, CONF_OPTIMISTIC, CONF_STATE, CONF_STOP_ACTION
from esphome.cpp_generator import Pvariable, add, get_variable, process_lambda, templatable
from esphome.cpp_helpers import setup_component
from esphome.cpp_types import Action, App, NoArg, optional
from esphome.py_compat import string_types
TemplateCover = cover.cover_ns.class_('TemplateCover', cover.Cover)
CoverPublishAction = cover.cover_ns.class_('CoverPublishAction', Action)
PLATFORM_SCHEMA = cv.nameable(cover.COVER_PLATFORM_SCHEMA.extend({
cv.GenerateID(): cv.declare_variable_id(TemplateCover),
vol.Optional(CONF_LAMBDA): cv.lambda_,
vol.Optional(CONF_OPTIMISTIC): cv.boolean,
vol.Optional(CONF_ASSUMED_STATE): cv.boolean,
vol.Optional(CONF_OPEN_ACTION): automation.validate_automation(single=True),
vol.Optional(CONF_CLOSE_ACTION): automation.validate_automation(single=True),
vol.Optional(CONF_STOP_ACTION): automation.validate_automation(single=True),
}).extend(cv.COMPONENT_SCHEMA.schema))
def to_code(config):
rhs = App.make_template_cover(config[CONF_NAME])
var = Pvariable(config[CONF_ID], rhs)
cover.setup_cover(var, config)
setup_component(var, config)
if CONF_LAMBDA in config:
for template_ in process_lambda(config[CONF_LAMBDA], [],
return_type=optional.template(cover.CoverState)):
yield
add(var.set_state_lambda(template_))
if CONF_OPEN_ACTION in config:
automation.build_automation(var.get_open_trigger(), NoArg,
config[CONF_OPEN_ACTION])
if CONF_CLOSE_ACTION in config:
automation.build_automation(var.get_close_trigger(), NoArg,
config[CONF_CLOSE_ACTION])
if CONF_STOP_ACTION in config:
automation.build_automation(var.get_stop_trigger(), NoArg,
config[CONF_STOP_ACTION])
if CONF_OPTIMISTIC in config:
add(var.set_optimistic(config[CONF_OPTIMISTIC]))
if CONF_ASSUMED_STATE in config:
add(var.set_assumed_state(config[CONF_ASSUMED_STATE]))
BUILD_FLAGS = '-DUSE_TEMPLATE_COVER'
CONF_COVER_TEMPLATE_PUBLISH = 'cover.template.publish'
COVER_TEMPLATE_PUBLISH_ACTION_SCHEMA = vol.Schema({
vol.Required(CONF_ID): cv.use_variable_id(cover.Cover),
vol.Required(CONF_STATE): cv.templatable(cover.validate_cover_state),
})
@ACTION_REGISTRY.register(CONF_COVER_TEMPLATE_PUBLISH,
COVER_TEMPLATE_PUBLISH_ACTION_SCHEMA)
def cover_template_publish_to_code(config, action_id, arg_type, template_arg):
for var in get_variable(config[CONF_ID]):
yield None
rhs = var.make_cover_publish_action(template_arg)
type = CoverPublishAction.template(arg_type)
action = Pvariable(action_id, rhs, type=type)
state = config[CONF_STATE]
if isinstance(state, string_types):
template_ = cover.COVER_STATES[state]
else:
for template_ in templatable(state, arg_type, cover.CoverState):
yield None
add(action.set_state(template_))
yield action
def to_hass_config(data, config):
ret = cover.core_to_hass_config(data, config)
if ret is None:
return None
if CONF_OPTIMISTIC in config:
ret['optimistic'] = config[CONF_OPTIMISTIC]
return ret

View file

@ -1,12 +1,12 @@
import voluptuous as vol import voluptuous as vol
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_ID, CONF_LAMBDA, CONF_COMPONENTS from esphome.const import CONF_COMPONENTS, CONF_ID, CONF_LAMBDA
from esphomeyaml.cpp_generator import process_lambda, variable from esphome.cpp_generator import Pvariable, process_lambda, variable
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import Component, ComponentPtr, esphomelib_ns, std_vector from esphome.cpp_types import Component, ComponentPtr, esphome_ns, std_vector
CustomComponentConstructor = esphomelib_ns.class_('CustomComponentConstructor') CustomComponentConstructor = esphome_ns.class_('CustomComponentConstructor')
MULTI_CONF = True MULTI_CONF = True
CONFIG_SCHEMA = vol.Schema({ CONFIG_SCHEMA = vol.Schema({
@ -25,8 +25,9 @@ def to_code(config):
rhs = CustomComponentConstructor(template_) rhs = CustomComponentConstructor(template_)
custom = variable(config[CONF_ID], rhs) custom = variable(config[CONF_ID], rhs)
for i, comp in enumerate(config.get(CONF_COMPONENTS, [])): for i, comp_config in enumerate(config.get(CONF_COMPONENTS, [])):
setup_component(custom.get_component(i), comp) comp = Pvariable(comp_config[CONF_ID], custom.get_component(i))
setup_component(comp, comp_config)
BUILD_FLAGS = '-DUSE_CUSTOM_COMPONENT' BUILD_FLAGS = '-DUSE_CUSTOM_COMPONENT'

View file

@ -1,12 +1,12 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml import pins from esphome import pins
from esphomeyaml.components import sensor from esphome.components import sensor
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_ID, CONF_PIN, CONF_UPDATE_INTERVAL from esphome.const import CONF_ID, CONF_PIN, CONF_UPDATE_INTERVAL
from esphomeyaml.cpp_generator import Pvariable from esphome.cpp_generator import Pvariable
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App, PollingComponent from esphome.cpp_types import App, PollingComponent
DallasComponent = sensor.sensor_ns.class_('DallasComponent', PollingComponent) DallasComponent = sensor.sensor_ns.class_('DallasComponent', PollingComponent)
MULTI_CONF = True MULTI_CONF = True

View file

@ -1,7 +1,7 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.cpp_generator import add from esphome.cpp_generator import add
from esphomeyaml.cpp_types import App from esphome.cpp_types import App
DEPENDENCIES = ['logger'] DEPENDENCIES = ['logger']

View file

@ -1,12 +1,12 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml import config_validation as cv, pins from esphome import config_validation as cv, pins
from esphomeyaml.automation import ACTION_REGISTRY, maybe_simple_id from esphome.automation import ACTION_REGISTRY, maybe_simple_id
from esphomeyaml.const import CONF_ID, CONF_MODE, CONF_NUMBER, CONF_PINS, CONF_RUN_CYCLES, \ from esphome.const import CONF_ID, CONF_MODE, CONF_NUMBER, CONF_PINS, CONF_RUN_CYCLES, \
CONF_RUN_DURATION, CONF_SLEEP_DURATION, CONF_WAKEUP_PIN CONF_RUN_DURATION, CONF_SLEEP_DURATION, CONF_WAKEUP_PIN
from esphomeyaml.cpp_generator import Pvariable, StructInitializer, add, get_variable from esphome.cpp_generator import Pvariable, StructInitializer, add, get_variable
from esphomeyaml.cpp_helpers import gpio_input_pin_expression, setup_component from esphome.cpp_helpers import gpio_input_pin_expression, setup_component
from esphomeyaml.cpp_types import Action, App, Component, esphomelib_ns, global_ns from esphome.cpp_types import Action, App, Component, esphome_ns, global_ns
def validate_pin_number(value): def validate_pin_number(value):
@ -17,11 +17,11 @@ def validate_pin_number(value):
return value return value
DeepSleepComponent = esphomelib_ns.class_('DeepSleepComponent', Component) DeepSleepComponent = esphome_ns.class_('DeepSleepComponent', Component)
EnterDeepSleepAction = esphomelib_ns.class_('EnterDeepSleepAction', Action) EnterDeepSleepAction = esphome_ns.class_('EnterDeepSleepAction', Action)
PreventDeepSleepAction = esphomelib_ns.class_('PreventDeepSleepAction', Action) PreventDeepSleepAction = esphome_ns.class_('PreventDeepSleepAction', Action)
WakeupPinMode = esphomelib_ns.enum('WakeupPinMode') WakeupPinMode = esphome_ns.enum('WakeupPinMode')
WAKEUP_PIN_MODES = { WAKEUP_PIN_MODES = {
'IGNORE': WakeupPinMode.WAKEUP_PIN_MODE_IGNORE, 'IGNORE': WakeupPinMode.WAKEUP_PIN_MODE_IGNORE,
'KEEP_AWAKE': WakeupPinMode.WAKEUP_PIN_MODE_KEEP_AWAKE, 'KEEP_AWAKE': WakeupPinMode.WAKEUP_PIN_MODE_KEEP_AWAKE,
@ -29,7 +29,7 @@ WAKEUP_PIN_MODES = {
} }
esp_sleep_ext1_wakeup_mode_t = global_ns.enum('esp_sleep_ext1_wakeup_mode_t') esp_sleep_ext1_wakeup_mode_t = global_ns.enum('esp_sleep_ext1_wakeup_mode_t')
Ext1Wakeup = esphomelib_ns.struct('Ext1Wakeup') Ext1Wakeup = esphome_ns.struct('Ext1Wakeup')
EXT1_WAKEUP_MODES = { EXT1_WAKEUP_MODES = {
'ALL_LOW': esp_sleep_ext1_wakeup_mode_t.ESP_EXT1_WAKEUP_ALL_LOW, 'ALL_LOW': esp_sleep_ext1_wakeup_mode_t.ESP_EXT1_WAKEUP_ALL_LOW,
'ANY_HIGH': esp_sleep_ext1_wakeup_mode_t.ESP_EXT1_WAKEUP_ANY_HIGH, 'ANY_HIGH': esp_sleep_ext1_wakeup_mode_t.ESP_EXT1_WAKEUP_ANY_HIGH,
@ -49,8 +49,11 @@ CONFIG_SCHEMA = vol.Schema({
vol.Required(CONF_PINS): cv.ensure_list(pins.shorthand_input_pin, validate_pin_number), vol.Required(CONF_PINS): cv.ensure_list(pins.shorthand_input_pin, validate_pin_number),
vol.Required(CONF_MODE): cv.one_of(*EXT1_WAKEUP_MODES, upper=True), vol.Required(CONF_MODE): cv.one_of(*EXT1_WAKEUP_MODES, upper=True),
})), })),
vol.Optional(CONF_RUN_CYCLES): cv.positive_int,
vol.Optional(CONF_RUN_DURATION): cv.positive_time_period_milliseconds, vol.Optional(CONF_RUN_DURATION): cv.positive_time_period_milliseconds,
vol.Optional(CONF_RUN_CYCLES): cv.invalid("The run_cycles option has been removed in 1.11.0 as "
"it was essentially the same as a run_duration of 0s."
"Please use run_duration now.")
}).extend(cv.COMPONENT_SCHEMA.schema) }).extend(cv.COMPONENT_SCHEMA.schema)
@ -65,8 +68,6 @@ def to_code(config):
add(deep_sleep.set_wakeup_pin(pin)) add(deep_sleep.set_wakeup_pin(pin))
if CONF_WAKEUP_PIN_MODE in config: if CONF_WAKEUP_PIN_MODE in config:
add(deep_sleep.set_wakeup_pin_mode(WAKEUP_PIN_MODES[config[CONF_WAKEUP_PIN_MODE]])) add(deep_sleep.set_wakeup_pin_mode(WAKEUP_PIN_MODES[config[CONF_WAKEUP_PIN_MODE]]))
if CONF_RUN_CYCLES in config:
add(deep_sleep.set_run_cycles(config[CONF_RUN_CYCLES]))
if CONF_RUN_DURATION in config: if CONF_RUN_DURATION in config:
add(deep_sleep.set_run_duration(config[CONF_RUN_DURATION])) add(deep_sleep.set_run_duration(config[CONF_RUN_DURATION]))

View file

@ -0,0 +1,127 @@
# coding=utf-8
import voluptuous as vol
from esphome import core
from esphome.automation import ACTION_REGISTRY, maybe_simple_id
import esphome.config_validation as cv
from esphome.const import CONF_LAMBDA, CONF_ROTATION, CONF_UPDATE_INTERVAL, CONF_PAGES, CONF_ID
from esphome.core import CORE
from esphome.cpp_generator import add, process_lambda, Pvariable, templatable, get_variable
from esphome.cpp_types import esphome_ns, void, Action
PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
})
display_ns = esphome_ns.namespace('display')
DisplayBuffer = display_ns.class_('DisplayBuffer')
DisplayPage = display_ns.class_('DisplayPage')
DisplayPagePtr = DisplayPage.operator('ptr')
DisplayBufferRef = DisplayBuffer.operator('ref')
DisplayPageShowAction = display_ns.class_('DisplayPageShowAction', Action)
DisplayPageShowNextAction = display_ns.class_('DisplayPageShowNextAction', Action)
DisplayPageShowPrevAction = display_ns.class_('DisplayPageShowPrevAction', Action)
DISPLAY_ROTATIONS = {
0: display_ns.DISPLAY_ROTATION_0_DEGREES,
90: display_ns.DISPLAY_ROTATION_90_DEGREES,
180: display_ns.DISPLAY_ROTATION_180_DEGREES,
270: display_ns.DISPLAY_ROTATION_270_DEGREES,
}
def validate_rotation(value):
value = cv.string(value)
if value.endswith(u"°"):
value = value[:-1]
try:
value = int(value)
except ValueError:
raise vol.Invalid(u"Expected integer for rotation")
return cv.one_of(*DISPLAY_ROTATIONS)(value)
BASIC_DISPLAY_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
vol.Optional(CONF_LAMBDA): cv.lambda_,
})
FULL_DISPLAY_PLATFORM_SCHEMA = BASIC_DISPLAY_PLATFORM_SCHEMA.extend({
vol.Optional(CONF_ROTATION): validate_rotation,
vol.Optional(CONF_PAGES): vol.All(cv.ensure_list({
cv.GenerateID(): cv.declare_variable_id(DisplayPage),
vol.Required(CONF_LAMBDA): cv.lambda_,
}), vol.Length(min=1)),
})
def setup_display_core_(display_var, config):
if CONF_UPDATE_INTERVAL in config:
add(display_var.set_update_interval(config[CONF_UPDATE_INTERVAL]))
if CONF_ROTATION in config:
add(display_var.set_rotation(DISPLAY_ROTATIONS[config[CONF_ROTATION]]))
if CONF_PAGES in config:
pages = []
for conf in config[CONF_PAGES]:
for lambda_ in process_lambda(conf[CONF_LAMBDA], [(DisplayBufferRef, 'it')],
return_type=void):
yield
var = Pvariable(conf[CONF_ID], DisplayPage.new(lambda_))
pages.append(var)
add(display_var.set_pages(pages))
CONF_DISPLAY_PAGE_SHOW = 'display.page.show'
DISPLAY_PAGE_SHOW_ACTION_SCHEMA = maybe_simple_id({
vol.Required(CONF_ID): cv.templatable(cv.use_variable_id(DisplayPage)),
})
@ACTION_REGISTRY.register(CONF_DISPLAY_PAGE_SHOW, DISPLAY_PAGE_SHOW_ACTION_SCHEMA)
def display_page_show_to_code(config, action_id, arg_type, template_arg):
type = DisplayPageShowAction.template(arg_type)
action = Pvariable(action_id, type.new(), type=type)
if isinstance(config[CONF_ID], core.Lambda):
for template_ in templatable(config[CONF_ID], arg_type, DisplayPagePtr):
yield None
add(action.set_page(template_))
else:
for var in get_variable(config[CONF_ID]):
yield None
add(action.set_page(var))
yield action
CONF_DISPLAY_PAGE_SHOW_NEXT = 'display.page.show_next'
DISPLAY_PAGE_SHOW_NEXT_ACTION_SCHEMA = maybe_simple_id({
vol.Required(CONF_ID): cv.templatable(cv.use_variable_id(DisplayBuffer)),
})
@ACTION_REGISTRY.register(CONF_DISPLAY_PAGE_SHOW_NEXT, DISPLAY_PAGE_SHOW_NEXT_ACTION_SCHEMA)
def display_page_show_next_to_code(config, action_id, arg_type, template_arg):
for var in get_variable(config[CONF_ID]):
yield None
type = DisplayPageShowNextAction.template(arg_type)
yield Pvariable(action_id, type.new(var), type=type)
CONF_DISPLAY_PAGE_SHOW_PREVIOUS = 'display.page.show_previous'
DISPLAY_PAGE_SHOW_PREVIOUS_ACTION_SCHEMA = maybe_simple_id({
vol.Required(CONF_ID): cv.templatable(cv.use_variable_id(DisplayBuffer)),
})
@ACTION_REGISTRY.register(CONF_DISPLAY_PAGE_SHOW_PREVIOUS, DISPLAY_PAGE_SHOW_PREVIOUS_ACTION_SCHEMA)
def display_page_show_previous_to_code(config, action_id, arg_type, template_arg):
for var in get_variable(config[CONF_ID]):
yield None
type = DisplayPageShowPrevAction.template(arg_type)
yield Pvariable(action_id, type.new(var), type=type)
def setup_display(display_var, config):
CORE.add_job(setup_display_core_, display_var, config)
BUILD_FLAGS = '-DUSE_DISPLAY'

View file

@ -1,13 +1,13 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml import pins from esphome import pins
from esphomeyaml.components import display from esphome.components import display
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_DATA_PINS, CONF_DIMENSIONS, CONF_ENABLE_PIN, CONF_ID, \ from esphome.const import CONF_DATA_PINS, CONF_DIMENSIONS, CONF_ENABLE_PIN, CONF_ID, \
CONF_LAMBDA, CONF_RS_PIN, CONF_RW_PIN CONF_LAMBDA, CONF_RS_PIN, CONF_RW_PIN
from esphomeyaml.cpp_generator import Pvariable, add, process_lambda from esphome.cpp_generator import Pvariable, add, process_lambda
from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component from esphome.cpp_helpers import gpio_output_pin_expression, setup_component
from esphomeyaml.cpp_types import App, PollingComponent, void from esphome.cpp_types import App, PollingComponent, void
LCDDisplay = display.display_ns.class_('LCDDisplay', PollingComponent) LCDDisplay = display.display_ns.class_('LCDDisplay', PollingComponent)
LCDDisplayRef = LCDDisplay.operator('ref') LCDDisplayRef = LCDDisplay.operator('ref')

View file

@ -1,13 +1,13 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.components import display, i2c from esphome.components import display, i2c
from esphomeyaml.components.display.lcd_gpio import LCDDisplay, LCDDisplayRef, \ from esphome.components.display.lcd_gpio import LCDDisplay, LCDDisplayRef, \
validate_lcd_dimensions validate_lcd_dimensions
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_ADDRESS, CONF_DIMENSIONS, CONF_ID, CONF_LAMBDA from esphome.const import CONF_ADDRESS, CONF_DIMENSIONS, CONF_ID, CONF_LAMBDA
from esphomeyaml.cpp_generator import Pvariable, add, process_lambda from esphome.cpp_generator import Pvariable, add, process_lambda
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App, void from esphome.cpp_types import App, void
DEPENDENCIES = ['i2c'] DEPENDENCIES = ['i2c']

View file

@ -1,14 +1,14 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml import pins from esphome import pins
from esphomeyaml.components import display, spi from esphome.components import display, spi
from esphomeyaml.components.spi import SPIComponent from esphome.components.spi import SPIComponent
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_CS_PIN, CONF_ID, CONF_INTENSITY, CONF_LAMBDA, CONF_NUM_CHIPS, \ from esphome.const import CONF_CS_PIN, CONF_ID, CONF_INTENSITY, CONF_LAMBDA, CONF_NUM_CHIPS, \
CONF_SPI_ID CONF_SPI_ID
from esphomeyaml.cpp_generator import Pvariable, add, get_variable, process_lambda from esphome.cpp_generator import Pvariable, add, get_variable, process_lambda
from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component from esphome.cpp_helpers import gpio_output_pin_expression, setup_component
from esphomeyaml.cpp_types import App, PollingComponent, void from esphome.cpp_types import App, PollingComponent, void
DEPENDENCIES = ['spi'] DEPENDENCIES = ['spi']

View file

@ -1,10 +1,10 @@
from esphomeyaml.components import display, uart from esphome.components import display, uart
from esphomeyaml.components.uart import UARTComponent from esphome.components.uart import UARTComponent
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_ID, CONF_LAMBDA, CONF_UART_ID from esphome.const import CONF_ID, CONF_LAMBDA, CONF_UART_ID
from esphomeyaml.cpp_generator import Pvariable, add, get_variable, process_lambda from esphome.cpp_generator import Pvariable, add, get_variable, process_lambda
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App, PollingComponent, void from esphome.cpp_types import App, PollingComponent, void
DEPENDENCIES = ['uart'] DEPENDENCIES = ['uart']

View file

@ -1,26 +1,26 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml import pins from esphome import pins
from esphomeyaml.components import display from esphome.components import display
from esphomeyaml.components.display import ssd1306_spi from esphome.components.display import ssd1306_spi
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_ADDRESS, CONF_EXTERNAL_VCC, CONF_ID, CONF_LAMBDA, CONF_MODEL, \ from esphome.const import CONF_ADDRESS, CONF_EXTERNAL_VCC, CONF_ID, CONF_LAMBDA, CONF_MODEL, \
CONF_RESET_PIN CONF_PAGES, CONF_RESET_PIN
from esphomeyaml.cpp_generator import Pvariable, add, process_lambda from esphome.cpp_generator import Pvariable, add, process_lambda
from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component from esphome.cpp_helpers import gpio_output_pin_expression, setup_component
from esphomeyaml.cpp_types import App, void from esphome.cpp_types import App, void
DEPENDENCIES = ['i2c'] DEPENDENCIES = ['i2c']
I2CSSD1306 = display.display_ns.class_('I2CSSD1306', ssd1306_spi.SSD1306) I2CSSD1306 = display.display_ns.class_('I2CSSD1306', ssd1306_spi.SSD1306)
PLATFORM_SCHEMA = display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = vol.All(display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({
cv.GenerateID(): cv.declare_variable_id(I2CSSD1306), cv.GenerateID(): cv.declare_variable_id(I2CSSD1306),
vol.Required(CONF_MODEL): ssd1306_spi.SSD1306_MODEL, vol.Required(CONF_MODEL): ssd1306_spi.SSD1306_MODEL,
vol.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema, vol.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema,
vol.Optional(CONF_EXTERNAL_VCC): cv.boolean, vol.Optional(CONF_EXTERNAL_VCC): cv.boolean,
vol.Optional(CONF_ADDRESS): cv.i2c_address, vol.Optional(CONF_ADDRESS): cv.i2c_address,
}).extend(cv.COMPONENT_SCHEMA.schema) }).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_most_one_key(CONF_PAGES, CONF_LAMBDA))
def to_code(config): def to_code(config):

View file

@ -1,14 +1,14 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml import pins from esphome import pins
from esphomeyaml.components import display, spi from esphome.components import display, spi
from esphomeyaml.components.spi import SPIComponent from esphome.components.spi import SPIComponent
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_CS_PIN, CONF_DC_PIN, CONF_EXTERNAL_VCC, CONF_ID, CONF_LAMBDA, \ from esphome.const import CONF_CS_PIN, CONF_DC_PIN, CONF_EXTERNAL_VCC, CONF_ID, CONF_LAMBDA, \
CONF_MODEL, CONF_RESET_PIN, CONF_SPI_ID CONF_MODEL, CONF_RESET_PIN, CONF_SPI_ID, CONF_PAGES
from esphomeyaml.cpp_generator import Pvariable, add, get_variable, process_lambda from esphome.cpp_generator import Pvariable, add, get_variable, process_lambda
from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component from esphome.cpp_helpers import gpio_output_pin_expression, setup_component
from esphomeyaml.cpp_types import App, PollingComponent, void from esphome.cpp_types import App, PollingComponent, void
DEPENDENCIES = ['spi'] DEPENDENCIES = ['spi']
@ -29,7 +29,7 @@ MODELS = {
SSD1306_MODEL = cv.one_of(*MODELS, upper=True, space="_") SSD1306_MODEL = cv.one_of(*MODELS, upper=True, space="_")
PLATFORM_SCHEMA = display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = vol.All(display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({
cv.GenerateID(): cv.declare_variable_id(SPISSD1306), cv.GenerateID(): cv.declare_variable_id(SPISSD1306),
cv.GenerateID(CONF_SPI_ID): cv.use_variable_id(SPIComponent), cv.GenerateID(CONF_SPI_ID): cv.use_variable_id(SPIComponent),
vol.Required(CONF_CS_PIN): pins.gpio_output_pin_schema, vol.Required(CONF_CS_PIN): pins.gpio_output_pin_schema,
@ -37,7 +37,7 @@ PLATFORM_SCHEMA = display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({
vol.Required(CONF_MODEL): SSD1306_MODEL, vol.Required(CONF_MODEL): SSD1306_MODEL,
vol.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema, vol.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema,
vol.Optional(CONF_EXTERNAL_VCC): cv.boolean, vol.Optional(CONF_EXTERNAL_VCC): cv.boolean,
}).extend(cv.COMPONENT_SCHEMA.schema) }).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_most_one_key(CONF_PAGES, CONF_LAMBDA))
def to_code(config): def to_code(config):

View file

@ -1,15 +1,15 @@
import voluptuous as vol import voluptuous as vol
import esphomeyaml.config_validation as cv from esphome import pins
from esphomeyaml import pins from esphome.components import display, spi
from esphomeyaml.components import display, spi from esphome.components.spi import SPIComponent
from esphomeyaml.components.spi import SPIComponent import esphome.config_validation as cv
from esphomeyaml.const import CONF_BUSY_PIN, CONF_CS_PIN, CONF_DC_PIN, CONF_FULL_UPDATE_EVERY, \ from esphome.const import CONF_BUSY_PIN, CONF_CS_PIN, CONF_DC_PIN, CONF_FULL_UPDATE_EVERY, \
CONF_ID, CONF_LAMBDA, CONF_MODEL, CONF_RESET_PIN, CONF_SPI_ID CONF_ID, CONF_LAMBDA, CONF_MODEL, CONF_PAGES, CONF_RESET_PIN, CONF_SPI_ID
from esphomeyaml.cpp_generator import get_variable, Pvariable, process_lambda, add from esphome.cpp_generator import Pvariable, add, get_variable, process_lambda
from esphomeyaml.cpp_helpers import gpio_output_pin_expression, gpio_input_pin_expression, \ from esphome.cpp_helpers import gpio_input_pin_expression, gpio_output_pin_expression, \
setup_component setup_component
from esphomeyaml.cpp_types import PollingComponent, App, void from esphome.cpp_types import App, PollingComponent, void
DEPENDENCIES = ['spi'] DEPENDENCIES = ['spi']
@ -17,7 +17,6 @@ WaveshareEPaperTypeA = display.display_ns.WaveshareEPaperTypeA
WaveshareEPaper = display.display_ns.class_('WaveshareEPaper', WaveshareEPaper = display.display_ns.class_('WaveshareEPaper',
PollingComponent, spi.SPIDevice, display.DisplayBuffer) PollingComponent, spi.SPIDevice, display.DisplayBuffer)
WaveshareEPaperTypeAModel = display.display_ns.enum('WaveshareEPaperTypeAModel') WaveshareEPaperTypeAModel = display.display_ns.enum('WaveshareEPaperTypeAModel')
WaveshareEPaperTypeBModel = display.display_ns.enum('WaveshareEPaperTypeBModel') WaveshareEPaperTypeBModel = display.display_ns.enum('WaveshareEPaperTypeBModel')
@ -49,7 +48,8 @@ PLATFORM_SCHEMA = vol.All(display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({
vol.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema, vol.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema,
vol.Optional(CONF_BUSY_PIN): pins.gpio_input_pin_schema, vol.Optional(CONF_BUSY_PIN): pins.gpio_input_pin_schema,
vol.Optional(CONF_FULL_UPDATE_EVERY): cv.uint32_t, vol.Optional(CONF_FULL_UPDATE_EVERY): cv.uint32_t,
}).extend(cv.COMPONENT_SCHEMA.schema), validate_full_update_every_only_type_a) }).extend(cv.COMPONENT_SCHEMA.schema), validate_full_update_every_only_type_a,
cv.has_at_most_one_key(CONF_PAGES, CONF_LAMBDA))
def to_code(config): def to_code(config):

View file

@ -1,14 +1,14 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml import config_validation as cv from esphome import config_validation as cv
from esphomeyaml.const import CONF_ID, CONF_SCAN_INTERVAL, CONF_TYPE, CONF_UUID, ESP_PLATFORM_ESP32 from esphome.const import CONF_ID, CONF_SCAN_INTERVAL, CONF_TYPE, CONF_UUID, ESP_PLATFORM_ESP32
from esphomeyaml.cpp_generator import ArrayInitializer, Pvariable, RawExpression, add from esphome.cpp_generator import Pvariable, RawExpression, add
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App, Component, esphomelib_ns from esphome.cpp_types import App, Component, esphome_ns
ESP_PLATFORMS = [ESP_PLATFORM_ESP32] ESP_PLATFORMS = [ESP_PLATFORM_ESP32]
ESP32BLEBeacon = esphomelib_ns.class_('ESP32BLEBeacon', Component) ESP32BLEBeacon = esphome_ns.class_('ESP32BLEBeacon', Component)
CONF_MAJOR = 'major' CONF_MAJOR = 'major'
CONF_MINOR = 'minor' CONF_MINOR = 'minor'
@ -26,7 +26,7 @@ CONFIG_SCHEMA = vol.Schema({
def to_code(config): def to_code(config):
uuid = config[CONF_UUID].hex uuid = config[CONF_UUID].hex
uuid_arr = [RawExpression('0x{}'.format(uuid[i:i + 2])) for i in range(0, len(uuid), 2)] uuid_arr = [RawExpression('0x{}'.format(uuid[i:i + 2])) for i in range(0, len(uuid), 2)]
rhs = App.make_esp32_ble_beacon(ArrayInitializer(*uuid_arr, multiline=False)) rhs = App.make_esp32_ble_beacon(uuid_arr)
ble = Pvariable(config[CONF_ID], rhs) ble = Pvariable(config[CONF_ID], rhs)
if CONF_MAJOR in config: if CONF_MAJOR in config:
add(ble.set_major(config[CONF_MAJOR])) add(ble.set_major(config[CONF_MAJOR]))

View file

@ -0,0 +1,40 @@
import voluptuous as vol
from esphome import config_validation as cv
from esphome.components import sensor
from esphome.const import CONF_ID, CONF_SCAN_INTERVAL, ESP_PLATFORM_ESP32
from esphome.core import HexInt
from esphome.cpp_generator import Pvariable, add
from esphome.cpp_helpers import setup_component
from esphome.cpp_types import App, Component, esphome_ns
ESP_PLATFORMS = [ESP_PLATFORM_ESP32]
CONF_ESP32_BLE_ID = 'esp32_ble_id'
ESP32BLETracker = esphome_ns.class_('ESP32BLETracker', Component)
XiaomiSensor = esphome_ns.class_('XiaomiSensor', sensor.Sensor)
XiaomiDevice = esphome_ns.class_('XiaomiDevice')
XIAOMI_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({
cv.GenerateID(): cv.declare_variable_id(XiaomiSensor)
})
CONFIG_SCHEMA = vol.Schema({
cv.GenerateID(): cv.declare_variable_id(ESP32BLETracker),
vol.Optional(CONF_SCAN_INTERVAL): cv.positive_time_period_seconds,
}).extend(cv.COMPONENT_SCHEMA.schema)
def make_address_array(address):
return [HexInt(i) for i in address.parts]
def to_code(config):
rhs = App.make_esp32_ble_tracker()
ble = Pvariable(config[CONF_ID], rhs)
if CONF_SCAN_INTERVAL in config:
add(ble.set_scan_interval(config[CONF_SCAN_INTERVAL]))
setup_component(ble, config)
BUILD_FLAGS = '-DUSE_ESP32_BLE_TRACKER'

View file

@ -1,14 +1,14 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml import config_validation as cv from esphome import config_validation as cv
from esphomeyaml.components import binary_sensor from esphome.components import binary_sensor
from esphomeyaml.const import CONF_HIGH_VOLTAGE_REFERENCE, CONF_ID, CONF_IIR_FILTER, \ from esphome.const import CONF_HIGH_VOLTAGE_REFERENCE, CONF_ID, CONF_IIR_FILTER, \
CONF_LOW_VOLTAGE_REFERENCE, CONF_MEASUREMENT_DURATION, CONF_SETUP_MODE, CONF_SLEEP_DURATION, \ CONF_LOW_VOLTAGE_REFERENCE, CONF_MEASUREMENT_DURATION, CONF_SETUP_MODE, CONF_SLEEP_DURATION, \
CONF_VOLTAGE_ATTENUATION, ESP_PLATFORM_ESP32 CONF_VOLTAGE_ATTENUATION, ESP_PLATFORM_ESP32
from esphomeyaml.core import TimePeriod from esphome.core import TimePeriod
from esphomeyaml.cpp_generator import Pvariable, add from esphome.cpp_generator import Pvariable, add
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App, Component, global_ns from esphome.cpp_types import App, Component, global_ns
ESP_PLATFORMS = [ESP_PLATFORM_ESP32] ESP_PLATFORMS = [ESP_PLATFORM_ESP32]

View file

@ -1,13 +1,14 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml import pins from esphome import pins
from esphomeyaml.components import wifi from esphome.components import wifi
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_DOMAIN, CONF_HOSTNAME, CONF_ID, CONF_MANUAL_IP, CONF_TYPE, \ from esphome.const import CONF_DOMAIN, CONF_ID, CONF_MANUAL_IP, CONF_STATIC_IP, CONF_TYPE, \
ESP_PLATFORM_ESP32 CONF_USE_ADDRESS, ESP_PLATFORM_ESP32
from esphomeyaml.cpp_generator import Pvariable, add from esphome.core import CORE
from esphomeyaml.cpp_helpers import gpio_output_pin_expression from esphome.cpp_generator import Pvariable, add
from esphomeyaml.cpp_types import App, Component, esphomelib_ns, global_ns from esphome.cpp_helpers import gpio_output_pin_expression
from esphome.cpp_types import App, Component, esphome_ns, global_ns
CONFLICTS_WITH = ['wifi'] CONFLICTS_WITH = ['wifi']
ESP_PLATFORMS = [ESP_PLATFORM_ESP32] ESP_PLATFORMS = [ESP_PLATFORM_ESP32]
@ -18,7 +19,7 @@ CONF_MDIO_PIN = 'mdio_pin'
CONF_CLK_MODE = 'clk_mode' CONF_CLK_MODE = 'clk_mode'
CONF_POWER_PIN = 'power_pin' CONF_POWER_PIN = 'power_pin'
EthernetType = esphomelib_ns.enum('EthernetType') EthernetType = esphome_ns.enum('EthernetType')
ETHERNET_TYPES = { ETHERNET_TYPES = {
'LAN8720': EthernetType.ETHERNET_TYPE_LAN8720, 'LAN8720': EthernetType.ETHERNET_TYPE_LAN8720,
'TLK110': EthernetType.ETHERNET_TYPE_TLK110, 'TLK110': EthernetType.ETHERNET_TYPE_TLK110,
@ -32,9 +33,20 @@ CLK_MODES = {
'GPIO17_OUT': eth_clock_mode_t.ETH_CLOCK_GPIO17_OUT, 'GPIO17_OUT': eth_clock_mode_t.ETH_CLOCK_GPIO17_OUT,
} }
EthernetComponent = esphomelib_ns.class_('EthernetComponent', Component) EthernetComponent = esphome_ns.class_('EthernetComponent', Component)
CONFIG_SCHEMA = vol.Schema({
def validate(config):
if CONF_USE_ADDRESS not in config:
if CONF_MANUAL_IP in config:
use_address = str(config[CONF_MANUAL_IP][CONF_STATIC_IP])
else:
use_address = CORE.name + config[CONF_DOMAIN]
config[CONF_USE_ADDRESS] = use_address
return config
CONFIG_SCHEMA = vol.All(vol.Schema({
cv.GenerateID(): cv.declare_variable_id(EthernetComponent), cv.GenerateID(): cv.declare_variable_id(EthernetComponent),
vol.Required(CONF_TYPE): cv.one_of(*ETHERNET_TYPES, upper=True), vol.Required(CONF_TYPE): cv.one_of(*ETHERNET_TYPES, upper=True),
vol.Required(CONF_MDC_PIN): pins.output_pin, vol.Required(CONF_MDC_PIN): pins.output_pin,
@ -43,9 +55,11 @@ CONFIG_SCHEMA = vol.Schema({
vol.Optional(CONF_PHY_ADDR, default=0): vol.All(cv.int_, vol.Range(min=0, max=31)), vol.Optional(CONF_PHY_ADDR, default=0): vol.All(cv.int_, vol.Range(min=0, max=31)),
vol.Optional(CONF_POWER_PIN): pins.gpio_output_pin_schema, vol.Optional(CONF_POWER_PIN): pins.gpio_output_pin_schema,
vol.Optional(CONF_MANUAL_IP): wifi.STA_MANUAL_IP_SCHEMA, vol.Optional(CONF_MANUAL_IP): wifi.STA_MANUAL_IP_SCHEMA,
vol.Optional(CONF_HOSTNAME): cv.hostname,
vol.Optional(CONF_DOMAIN, default='.local'): cv.domain_name, vol.Optional(CONF_DOMAIN, default='.local'): cv.domain_name,
}) vol.Optional(CONF_USE_ADDRESS): cv.string_strict,
vol.Optional('hostname'): cv.invalid("The hostname option has been removed in 1.11.0"),
}), validate)
def to_code(config): def to_code(config):
@ -57,15 +71,13 @@ def to_code(config):
add(eth.set_mdio_pin(config[CONF_MDIO_PIN])) add(eth.set_mdio_pin(config[CONF_MDIO_PIN]))
add(eth.set_type(ETHERNET_TYPES[config[CONF_TYPE]])) add(eth.set_type(ETHERNET_TYPES[config[CONF_TYPE]]))
add(eth.set_clk_mode(CLK_MODES[config[CONF_CLK_MODE]])) add(eth.set_clk_mode(CLK_MODES[config[CONF_CLK_MODE]]))
add(eth.set_use_address(config[CONF_USE_ADDRESS]))
if CONF_POWER_PIN in config: if CONF_POWER_PIN in config:
for pin in gpio_output_pin_expression(config[CONF_POWER_PIN]): for pin in gpio_output_pin_expression(config[CONF_POWER_PIN]):
yield yield
add(eth.set_power_pin(pin)) add(eth.set_power_pin(pin))
if CONF_HOSTNAME in config:
add(eth.set_hostname(config[CONF_HOSTNAME]))
if CONF_MANUAL_IP in config: if CONF_MANUAL_IP in config:
add(eth.set_manual_ip(wifi.manual_ip(config[CONF_MANUAL_IP]))) add(eth.set_manual_ip(wifi.manual_ip(config[CONF_MANUAL_IP])))

View file

@ -1,20 +1,22 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.automation import ACTION_REGISTRY, maybe_simple_id from esphome.automation import ACTION_REGISTRY, maybe_simple_id
from esphomeyaml.components import mqtt from esphome.components import mqtt
from esphomeyaml.components.mqtt import setup_mqtt_component from esphome.components.mqtt import setup_mqtt_component
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_ID, CONF_INTERNAL, CONF_MQTT_ID, CONF_NAME, CONF_OSCILLATING, \ from esphome.const import CONF_ID, CONF_INTERNAL, CONF_MQTT_ID, CONF_NAME, CONF_OSCILLATING, \
CONF_OSCILLATION_COMMAND_TOPIC, CONF_OSCILLATION_OUTPUT, CONF_OSCILLATION_STATE_TOPIC, \ CONF_OSCILLATION_COMMAND_TOPIC, CONF_OSCILLATION_OUTPUT, CONF_OSCILLATION_STATE_TOPIC, \
CONF_SPEED, CONF_SPEED_COMMAND_TOPIC, CONF_SPEED_STATE_TOPIC CONF_SPEED, CONF_SPEED_COMMAND_TOPIC, CONF_SPEED_STATE_TOPIC
from esphomeyaml.cpp_generator import add, Pvariable, get_variable, templatable from esphome.core import CORE
from esphomeyaml.cpp_types import Application, Component, Nameable, esphomelib_ns, Action, bool_ from esphome.cpp_generator import Pvariable, add, get_variable, templatable
from esphome.cpp_types import Action, Application, Component, Nameable, bool_, esphome_ns
from esphome.py_compat import string_types
PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
}) })
fan_ns = esphomelib_ns.namespace('fan') fan_ns = esphome_ns.namespace('fan')
FanState = fan_ns.class_('FanState', Nameable, Component) FanState = fan_ns.class_('FanState', Nameable, Component)
MQTTFanComponent = fan_ns.class_('MQTTFanComponent', mqtt.MQTTComponent) MQTTFanComponent = fan_ns.class_('MQTTFanComponent', mqtt.MQTTComponent)
MakeFan = Application.struct('MakeFan') MakeFan = Application.struct('MakeFan')
@ -49,25 +51,25 @@ FAN_SPEEDS = {
} }
def setup_fan_core_(fan_var, mqtt_var, config): def setup_fan_core_(fan_var, config):
if CONF_INTERNAL in config: if CONF_INTERNAL in config:
add(fan_var.set_internal(config[CONF_INTERNAL])) add(fan_var.set_internal(config[CONF_INTERNAL]))
mqtt_ = fan_var.Pget_mqtt()
if CONF_OSCILLATION_STATE_TOPIC in config: if CONF_OSCILLATION_STATE_TOPIC in config:
add(mqtt_var.set_custom_oscillation_state_topic(config[CONF_OSCILLATION_STATE_TOPIC])) add(mqtt_.set_custom_oscillation_state_topic(config[CONF_OSCILLATION_STATE_TOPIC]))
if CONF_OSCILLATION_COMMAND_TOPIC in config: if CONF_OSCILLATION_COMMAND_TOPIC in config:
add(mqtt_var.set_custom_oscillation_command_topic(config[CONF_OSCILLATION_COMMAND_TOPIC])) add(mqtt_.set_custom_oscillation_command_topic(config[CONF_OSCILLATION_COMMAND_TOPIC]))
if CONF_SPEED_STATE_TOPIC in config: if CONF_SPEED_STATE_TOPIC in config:
add(mqtt_var.set_custom_speed_state_topic(config[CONF_SPEED_STATE_TOPIC])) add(mqtt_.set_custom_speed_state_topic(config[CONF_SPEED_STATE_TOPIC]))
if CONF_SPEED_COMMAND_TOPIC in config: if CONF_SPEED_COMMAND_TOPIC in config:
add(mqtt_var.set_custom_speed_command_topic(config[CONF_SPEED_COMMAND_TOPIC])) add(mqtt_.set_custom_speed_command_topic(config[CONF_SPEED_COMMAND_TOPIC]))
setup_mqtt_component(mqtt_var, config) setup_mqtt_component(mqtt_, config)
def setup_fan(fan_obj, mqtt_obj, config): def setup_fan(fan_obj, config):
fan_var = Pvariable(config[CONF_ID], fan_obj, has_side_effects=False) fan_var = Pvariable(config[CONF_ID], fan_obj, has_side_effects=False)
mqtt_var = Pvariable(config[CONF_MQTT_ID], mqtt_obj, has_side_effects=False) CORE.add_job(setup_fan_core_, fan_var, config)
setup_fan_core_(fan_var, mqtt_var, config)
BUILD_FLAGS = '-DUSE_FAN' BUILD_FLAGS = '-DUSE_FAN'
@ -124,6 +126,8 @@ def fan_turn_on_to_code(config, action_id, arg_type, template_arg):
if CONF_SPEED in config: if CONF_SPEED in config:
for template_ in templatable(config[CONF_SPEED], arg_type, FanSpeed): for template_ in templatable(config[CONF_SPEED], arg_type, FanSpeed):
yield None yield None
if isinstance(template_, string_types):
template_ = FAN_SPEEDS[template_]
add(action.set_speed(template_)) add(action.set_speed(template_))
yield action yield action

View file

@ -1,11 +1,11 @@
import voluptuous as vol import voluptuous as vol
import esphomeyaml.config_validation as cv from esphome.components import fan, output
from esphomeyaml.components import fan, output import esphome.config_validation as cv
from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_OSCILLATION_OUTPUT, CONF_OUTPUT from esphome.const import CONF_MAKE_ID, CONF_NAME, CONF_OSCILLATION_OUTPUT, CONF_OUTPUT
from esphomeyaml.cpp_generator import get_variable, variable, add from esphome.cpp_generator import add, get_variable, variable
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App from esphome.cpp_types import App
PLATFORM_SCHEMA = cv.nameable(fan.FAN_PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = cv.nameable(fan.FAN_PLATFORM_SCHEMA.extend({
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(fan.MakeFan), cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(fan.MakeFan),
@ -26,7 +26,7 @@ def to_code(config):
yield yield
add(fan_struct.Poutput.set_oscillation(oscillation_output)) add(fan_struct.Poutput.set_oscillation(oscillation_output))
fan.setup_fan(fan_struct.Pstate, fan_struct.Pmqtt, config) fan.setup_fan(fan_struct.Pstate, config)
setup_component(fan_struct.Poutput, config) setup_component(fan_struct.Poutput, config)

View file

@ -1,12 +1,12 @@
import voluptuous as vol import voluptuous as vol
import esphomeyaml.config_validation as cv from esphome.components import fan, mqtt, output
from esphomeyaml.components import fan, mqtt, output import esphome.config_validation as cv
from esphomeyaml.const import CONF_HIGH, CONF_LOW, CONF_MAKE_ID, CONF_MEDIUM, CONF_NAME, \ from esphome.const import CONF_HIGH, CONF_LOW, CONF_MAKE_ID, CONF_MEDIUM, CONF_NAME, \
CONF_OSCILLATION_OUTPUT, CONF_OUTPUT, CONF_SPEED, CONF_SPEED_COMMAND_TOPIC, \ CONF_OSCILLATION_OUTPUT, CONF_OUTPUT, CONF_SPEED, CONF_SPEED_COMMAND_TOPIC, \
CONF_SPEED_STATE_TOPIC CONF_SPEED_STATE_TOPIC
from esphomeyaml.cpp_generator import get_variable, variable, add from esphome.cpp_generator import add, get_variable, variable
from esphomeyaml.cpp_types import App from esphome.cpp_types import App
PLATFORM_SCHEMA = cv.nameable(fan.FAN_PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = cv.nameable(fan.FAN_PLATFORM_SCHEMA.extend({
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(fan.MakeFan), cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(fan.MakeFan),
@ -41,7 +41,7 @@ def to_code(config):
yield yield
add(fan_struct.Poutput.set_oscillation(oscillation_output)) add(fan_struct.Poutput.set_oscillation(oscillation_output))
fan.setup_fan(fan_struct.Pstate, fan_struct.Pmqtt, config) fan.setup_fan(fan_struct.Pstate, config)
def to_hass_config(data, config): def to_hass_config(data, config):

View file

@ -1,14 +1,14 @@
# coding=utf-8 # coding=utf-8
import voluptuous as vol import voluptuous as vol
from esphomeyaml import core from esphome import core
from esphomeyaml.components import display from esphome.components import display
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_FILE, CONF_GLYPHS, CONF_ID, CONF_SIZE from esphome.const import CONF_FILE, CONF_GLYPHS, CONF_ID, CONF_SIZE
from esphomeyaml.core import CORE, HexInt from esphome.core import CORE, HexInt
from esphomeyaml.cpp_generator import ArrayInitializer, MockObj, Pvariable, RawExpression, add from esphome.cpp_generator import Pvariable, progmem_array, safe_exp
from esphomeyaml.cpp_types import App from esphome.cpp_types import App, uint8
from esphomeyaml.py_compat import sort_by_cmp from esphome.py_compat import sort_by_cmp
DEPENDENCIES = ['display'] DEPENDENCIES = ['display']
MULTI_CONF = True MULTI_CONF = True
@ -74,7 +74,7 @@ FONT_SCHEMA = vol.Schema({
vol.Required(CONF_FILE): validate_truetype_file, vol.Required(CONF_FILE): validate_truetype_file,
vol.Optional(CONF_GLYPHS, default=DEFAULT_GLYPHS): validate_glyphs, vol.Optional(CONF_GLYPHS, default=DEFAULT_GLYPHS): validate_glyphs,
vol.Optional(CONF_SIZE, default=20): vol.All(cv.int_, vol.Range(min=1)), vol.Optional(CONF_SIZE, default=20): vol.All(cv.int_, vol.Range(min=1)),
cv.GenerateID(CONF_RAW_DATA_ID): cv.declare_variable_id(None), cv.GenerateID(CONF_RAW_DATA_ID): cv.declare_variable_id(uint8),
}) })
CONFIG_SCHEMA = vol.All(validate_pillow_installed, FONT_SCHEMA) CONFIG_SCHEMA = vol.All(validate_pillow_installed, FONT_SCHEMA)
@ -87,7 +87,7 @@ def to_code(config):
try: try:
font = ImageFont.truetype(path, config[CONF_SIZE]) font = ImageFont.truetype(path, config[CONF_SIZE])
except Exception as e: except Exception as e:
raise core.EsphomeyamlError(u"Could not load truetype file {}: {}".format(path, e)) raise core.EsphomeError(u"Could not load truetype file {}: {}".format(path, e))
ascent, descent = font.getmetrics() ascent, descent = font.getmetrics()
@ -108,14 +108,12 @@ def to_code(config):
glyph_args[glyph] = (len(data), offset_x, offset_y, width, height) glyph_args[glyph] = (len(data), offset_x, offset_y, width, height)
data += glyph_data data += glyph_data
raw_data = MockObj(config[CONF_RAW_DATA_ID]) rhs = safe_exp([HexInt(x) for x in data])
add(RawExpression('static const uint8_t {}[{}] PROGMEM = {}'.format( prog_arr = progmem_array(config[CONF_RAW_DATA_ID], rhs)
raw_data, len(data),
ArrayInitializer(*[HexInt(x) for x in data], multiline=False))))
glyphs = [] glyphs = []
for glyph in config[CONF_GLYPHS]: for glyph in config[CONF_GLYPHS]:
glyphs.append(Glyph(glyph, raw_data, *glyph_args[glyph])) glyphs.append(Glyph(glyph, prog_arr, *glyph_args[glyph]))
rhs = App.make_font(ArrayInitializer(*glyphs), ascent, ascent + descent) rhs = App.make_font(glyphs, ascent, ascent + descent)
Pvariable(config[CONF_ID], rhs) Pvariable(config[CONF_ID], rhs)

View file

@ -1,12 +1,12 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml import config_validation as cv from esphome import config_validation as cv
from esphomeyaml.const import CONF_ID, CONF_INITIAL_VALUE, CONF_RESTORE_VALUE, CONF_TYPE from esphome.const import CONF_ID, CONF_INITIAL_VALUE, CONF_RESTORE_VALUE, CONF_TYPE
from esphomeyaml.cpp_generator import Pvariable, RawExpression, TemplateArguments, add from esphome.cpp_generator import Pvariable, RawExpression, TemplateArguments, add
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App, Component, esphomelib_ns from esphome.cpp_types import App, Component, esphome_ns
GlobalVariableComponent = esphomelib_ns.class_('GlobalVariableComponent', Component) GlobalVariableComponent = esphome_ns.class_('GlobalVariableComponent', Component)
MULTI_CONF = True MULTI_CONF = True

View file

@ -1,20 +1,20 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml import pins from esphome import pins
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_FREQUENCY, CONF_ID, CONF_RECEIVE_TIMEOUT, CONF_SCAN, CONF_SCL, \ from esphome.const import CONF_FREQUENCY, CONF_ID, CONF_RECEIVE_TIMEOUT, CONF_SCAN, CONF_SCL, \
CONF_SDA CONF_SDA
from esphomeyaml.cpp_generator import Pvariable, add from esphome.cpp_generator import Pvariable, add
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App, Component, esphomelib_ns from esphome.cpp_types import App, Component, esphome_ns
I2CComponent = esphomelib_ns.class_('I2CComponent', Component) I2CComponent = esphome_ns.class_('I2CComponent', Component)
I2CDevice = pins.I2CDevice I2CDevice = pins.I2CDevice
CONFIG_SCHEMA = vol.Schema({ CONFIG_SCHEMA = vol.Schema({
cv.GenerateID(): cv.declare_variable_id(I2CComponent), cv.GenerateID(): cv.declare_variable_id(I2CComponent),
vol.Optional(CONF_SDA, default='SDA'): pins.input_pullup_pin, vol.Optional(CONF_SDA, default='SDA'): pins.input_pin,
vol.Optional(CONF_SCL, default='SCL'): pins.input_pullup_pin, vol.Optional(CONF_SCL, default='SCL'): pins.input_pin,
vol.Optional(CONF_FREQUENCY): vol.All(cv.frequency, vol.Range(min=0, min_included=False)), vol.Optional(CONF_FREQUENCY): vol.All(cv.frequency, vol.Range(min=0, min_included=False)),
vol.Optional(CONF_SCAN): cv.boolean, vol.Optional(CONF_SCAN): cv.boolean,

View file

@ -3,13 +3,13 @@ import logging
import voluptuous as vol import voluptuous as vol
from esphomeyaml import core from esphome import core
from esphomeyaml.components import display, font from esphome.components import display, font
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_FILE, CONF_ID, CONF_RESIZE from esphome.const import CONF_FILE, CONF_ID, CONF_RESIZE
from esphomeyaml.core import CORE, HexInt from esphome.core import CORE, HexInt
from esphomeyaml.cpp_generator import ArrayInitializer, MockObj, Pvariable, RawExpression, add from esphome.cpp_generator import Pvariable, progmem_array, safe_exp
from esphomeyaml.cpp_types import App from esphome.cpp_types import App, uint8
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -24,7 +24,7 @@ IMAGE_SCHEMA = vol.Schema({
vol.Required(CONF_ID): cv.declare_variable_id(Image_), vol.Required(CONF_ID): cv.declare_variable_id(Image_),
vol.Required(CONF_FILE): cv.file_, vol.Required(CONF_FILE): cv.file_,
vol.Optional(CONF_RESIZE): cv.dimensions, vol.Optional(CONF_RESIZE): cv.dimensions,
cv.GenerateID(CONF_RAW_DATA_ID): cv.declare_variable_id(None), cv.GenerateID(CONF_RAW_DATA_ID): cv.declare_variable_id(uint8),
}) })
CONFIG_SCHEMA = vol.All(font.validate_pillow_installed, IMAGE_SCHEMA) CONFIG_SCHEMA = vol.All(font.validate_pillow_installed, IMAGE_SCHEMA)
@ -37,7 +37,7 @@ def to_code(config):
try: try:
image = Image.open(path) image = Image.open(path)
except Exception as e: except Exception as e:
raise core.EsphomeyamlError(u"Could not load image file {}: {}".format(path, e)) raise core.EsphomeError(u"Could not load image file {}: {}".format(path, e))
if CONF_RESIZE in config: if CONF_RESIZE in config:
image.thumbnail(config[CONF_RESIZE]) image.thumbnail(config[CONF_RESIZE])
@ -56,10 +56,8 @@ def to_code(config):
pos = x + y * width8 pos = x + y * width8
data[pos // 8] |= 0x80 >> (pos % 8) data[pos // 8] |= 0x80 >> (pos % 8)
raw_data = MockObj(config[CONF_RAW_DATA_ID]) rhs = safe_exp([HexInt(x) for x in data])
add(RawExpression('static const uint8_t {}[{}] PROGMEM = {}'.format( prog_arr = progmem_array(config[CONF_RAW_DATA_ID], rhs)
raw_data, len(data),
ArrayInitializer(*[HexInt(x) for x in data], multiline=False))))
rhs = App.make_image(raw_data, width, height) rhs = App.make_image(prog_arr, width, height)
Pvariable(config[CONF_ID], rhs) Pvariable(config[CONF_ID], rhs)

View file

@ -1,13 +1,13 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml import automation from esphome import automation
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_ID, CONF_INTERVAL from esphome.const import CONF_ID, CONF_INTERVAL
from esphomeyaml.cpp_generator import Pvariable from esphome.cpp_generator import Pvariable
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App, NoArg, PollingComponent, Trigger, esphomelib_ns from esphome.cpp_types import App, NoArg, PollingComponent, Trigger, esphome_ns
IntervalTrigger = esphomelib_ns.class_('IntervalTrigger', Trigger.template(NoArg), PollingComponent) IntervalTrigger = esphome_ns.class_('IntervalTrigger', Trigger.template(NoArg), PollingComponent)
CONFIG_SCHEMA = automation.validate_automation(vol.Schema({ CONFIG_SCHEMA = automation.validate_automation(vol.Schema({
cv.GenerateID(): cv.declare_variable_id(IntervalTrigger), cv.GenerateID(): cv.declare_variable_id(IntervalTrigger),

View file

@ -1,28 +1,29 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.automation import ACTION_REGISTRY, maybe_simple_id from esphome.automation import ACTION_REGISTRY, maybe_simple_id
from esphomeyaml.components import mqtt from esphome.components import mqtt
from esphomeyaml.components.mqtt import setup_mqtt_component from esphome.components.mqtt import setup_mqtt_component
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_ALPHA, CONF_BLUE, CONF_BRIGHTNESS, CONF_COLORS, \ from esphome.const import CONF_ALPHA, CONF_BLUE, CONF_BRIGHTNESS, CONF_COLORS, \
CONF_DEFAULT_TRANSITION_LENGTH, CONF_DURATION, CONF_EFFECTS, CONF_EFFECT_ID, \ CONF_COLOR_TEMPERATURE, CONF_DEFAULT_TRANSITION_LENGTH, CONF_DURATION, CONF_EFFECT, \
CONF_GAMMA_CORRECT, CONF_GREEN, CONF_ID, CONF_INTERNAL, CONF_LAMBDA, CONF_MQTT_ID, CONF_NAME, \ CONF_EFFECTS, CONF_EFFECT_ID, CONF_FLASH_LENGTH, CONF_GAMMA_CORRECT, CONF_GREEN, CONF_ID, \
CONF_NUM_LEDS, CONF_RANDOM, CONF_RED, CONF_SPEED, CONF_STATE, CONF_TRANSITION_LENGTH, \ CONF_INTERNAL, CONF_LAMBDA, CONF_MQTT_ID, CONF_NAME, CONF_NUM_LEDS, CONF_RANDOM, CONF_RED, \
CONF_UPDATE_INTERVAL, CONF_WHITE, CONF_WIDTH, CONF_FLASH_LENGTH, CONF_COLOR_TEMPERATURE, \ CONF_SPEED, CONF_STATE, CONF_TRANSITION_LENGTH, CONF_UPDATE_INTERVAL, CONF_WHITE, CONF_WIDTH
CONF_EFFECT from esphome.core import CORE
from esphomeyaml.core import CORE from esphome.cpp_generator import Pvariable, StructInitializer, add, get_variable, process_lambda, \
from esphomeyaml.cpp_generator import process_lambda, Pvariable, add, StructInitializer, \ templatable
ArrayInitializer, get_variable, templatable from esphome.cpp_types import Action, Application, Component, Nameable, esphome_ns, float_, \
from esphomeyaml.cpp_types import esphomelib_ns, Application, Component, Nameable, Action, uint32, \ std_string, uint32, void
float_, std_string, void
PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
}) })
# Base # Base
light_ns = esphomelib_ns.namespace('light') light_ns = esphome_ns.namespace('light')
LightState = light_ns.class_('LightState', Nameable, Component) LightState = light_ns.class_('LightState', Nameable, Component)
# Fake class for addressable lights
AddressableLightState = light_ns.class_('LightState', LightState)
MakeLight = Application.struct('MakeLight') MakeLight = Application.struct('MakeLight')
LightOutput = light_ns.class_('LightOutput') LightOutput = light_ns.class_('LightOutput')
AddressableLight = light_ns.class_('AddressableLight') AddressableLight = light_ns.class_('AddressableLight')
@ -279,7 +280,7 @@ def build_effect(full_config):
('duration', color[CONF_DURATION]), ('duration', color[CONF_DURATION]),
)) ))
if colors: if colors:
add(effect.set_colors(ArrayInitializer(*colors))) add(effect.set_colors(colors))
yield effect yield effect
elif key == CONF_FLICKER: elif key == CONF_FLICKER:
rhs = FlickerLightEffect.new(config[CONF_NAME]) rhs = FlickerLightEffect.new(config[CONF_NAME])
@ -322,7 +323,7 @@ def build_effect(full_config):
('num_leds', color[CONF_NUM_LEDS]), ('num_leds', color[CONF_NUM_LEDS]),
)) ))
if colors: if colors:
add(effect.set_colors(ArrayInitializer(*colors))) add(effect.set_colors(colors))
yield effect yield effect
elif key == CONF_ADDRESSABLE_SCAN: elif key == CONF_ADDRESSABLE_SCAN:
rhs = AddressableScanEffect.new(config[CONF_NAME]) rhs = AddressableScanEffect.new(config[CONF_NAME])
@ -370,7 +371,7 @@ def build_effect(full_config):
raise NotImplementedError("Effect {} not implemented".format(next(config.keys()))) raise NotImplementedError("Effect {} not implemented".format(next(config.keys())))
def setup_light_core_(light_var, mqtt_var, config): def setup_light_core_(light_var, config):
if CONF_INTERNAL in config: if CONF_INTERNAL in config:
add(light_var.set_internal(config[CONF_INTERNAL])) add(light_var.set_internal(config[CONF_INTERNAL]))
if CONF_DEFAULT_TRANSITION_LENGTH in config: if CONF_DEFAULT_TRANSITION_LENGTH in config:
@ -383,15 +384,14 @@ def setup_light_core_(light_var, mqtt_var, config):
yield yield
effects.append(effect) effects.append(effect)
if effects: if effects:
add(light_var.add_effects(ArrayInitializer(*effects))) add(light_var.add_effects(effects))
setup_mqtt_component(mqtt_var, config) setup_mqtt_component(light_var.Pget_mqtt(), config)
def setup_light(light_obj, mqtt_obj, config): def setup_light(light_obj, config):
light_var = Pvariable(config[CONF_ID], light_obj, has_side_effects=False) light_var = Pvariable(config[CONF_ID], light_obj, has_side_effects=False)
mqtt_var = Pvariable(config[CONF_MQTT_ID], mqtt_obj, has_side_effects=False) CORE.add_job(setup_light_core_, light_var, config)
CORE.add_job(setup_light_core_, light_var, mqtt_var, config)
BUILD_FLAGS = '-DUSE_LIGHT' BUILD_FLAGS = '-DUSE_LIGHT'

View file

@ -1,11 +1,11 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.components import light, output from esphome.components import light, output
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_EFFECTS, CONF_MAKE_ID, CONF_NAME, CONF_OUTPUT from esphome.const import CONF_EFFECTS, CONF_MAKE_ID, CONF_NAME, CONF_OUTPUT
from esphomeyaml.cpp_generator import get_variable, variable from esphome.cpp_generator import get_variable, variable
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App from esphome.cpp_types import App
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight),
@ -19,7 +19,7 @@ def to_code(config):
yield yield
rhs = App.make_binary_light(config[CONF_NAME], output_) rhs = App.make_binary_light(config[CONF_NAME], output_)
light_struct = variable(config[CONF_MAKE_ID], rhs) light_struct = variable(config[CONF_MAKE_ID], rhs)
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config) light.setup_light(light_struct.Pstate, config)
setup_component(light_struct.Pstate, config) setup_component(light_struct.Pstate, config)

View file

@ -1,15 +1,15 @@
import voluptuous as vol import voluptuous as vol
import esphomeyaml.config_validation as cv from esphome.components import light, output
from esphomeyaml.components import light, output from esphome.components.light.rgbww import validate_cold_white_colder, \
from esphomeyaml.components.light.rgbww import validate_cold_white_colder, \
validate_color_temperature validate_color_temperature
from esphomeyaml.const import CONF_COLD_WHITE, CONF_COLD_WHITE_COLOR_TEMPERATURE, \ import esphome.config_validation as cv
from esphome.const import CONF_COLD_WHITE, CONF_COLD_WHITE_COLOR_TEMPERATURE, \
CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_GAMMA_CORRECT, CONF_MAKE_ID, \ CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_GAMMA_CORRECT, CONF_MAKE_ID, \
CONF_NAME, CONF_WARM_WHITE, CONF_WARM_WHITE_COLOR_TEMPERATURE CONF_NAME, CONF_WARM_WHITE, CONF_WARM_WHITE_COLOR_TEMPERATURE
from esphomeyaml.cpp_generator import get_variable, variable from esphome.cpp_generator import get_variable, variable
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App from esphome.cpp_types import App
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight),
@ -33,7 +33,7 @@ def to_code(config):
config[CONF_WARM_WHITE_COLOR_TEMPERATURE], config[CONF_WARM_WHITE_COLOR_TEMPERATURE],
cold_white, warm_white) cold_white, warm_white)
light_struct = variable(config[CONF_MAKE_ID], rhs) light_struct = variable(config[CONF_MAKE_ID], rhs)
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config) light.setup_light(light_struct.Pstate, config)
setup_component(light_struct.Pstate, config) setup_component(light_struct.Pstate, config)

View file

@ -1,15 +1,15 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml import pins from esphome import pins
from esphomeyaml.components import light from esphome.components import light
from esphomeyaml.components.power_supply import PowerSupplyComponent from esphome.components.power_supply import PowerSupplyComponent
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_CHIPSET, CONF_COLOR_CORRECT, CONF_DEFAULT_TRANSITION_LENGTH, \ from esphome.const import CONF_CHIPSET, CONF_COLOR_CORRECT, CONF_DEFAULT_TRANSITION_LENGTH, \
CONF_EFFECTS, CONF_GAMMA_CORRECT, CONF_MAKE_ID, CONF_MAX_REFRESH_RATE, CONF_NAME, \ CONF_EFFECTS, CONF_GAMMA_CORRECT, CONF_MAKE_ID, CONF_MAX_REFRESH_RATE, CONF_NAME, \
CONF_NUM_LEDS, CONF_PIN, CONF_POWER_SUPPLY, CONF_RGB_ORDER CONF_NUM_LEDS, CONF_PIN, CONF_POWER_SUPPLY, CONF_RGB_ORDER
from esphomeyaml.cpp_generator import RawExpression, TemplateArguments, add, get_variable, variable from esphome.cpp_generator import RawExpression, TemplateArguments, add, get_variable, variable
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App, Application from esphome.cpp_types import App, Application
TYPES = [ TYPES = [
'NEOPIXEL', 'NEOPIXEL',
@ -57,6 +57,7 @@ def validate(value):
MakeFastLEDLight = Application.struct('MakeFastLEDLight') MakeFastLEDLight = Application.struct('MakeFastLEDLight')
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
cv.GenerateID(): cv.declare_variable_id(light.AddressableLightState),
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeFastLEDLight), cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeFastLEDLight),
vol.Required(CONF_CHIPSET): cv.one_of(*TYPES, upper=True), vol.Required(CONF_CHIPSET): cv.one_of(*TYPES, upper=True),
@ -98,11 +99,13 @@ def to_code(config):
r, g, b = config[CONF_COLOR_CORRECT] r, g, b = config[CONF_COLOR_CORRECT]
add(fast_led.set_correction(r, g, b)) add(fast_led.set_correction(r, g, b))
light.setup_light(make.Pstate, make.Pmqtt, config) light.setup_light(make.Pstate, config)
setup_component(fast_led, config) setup_component(fast_led, config)
BUILD_FLAGS = '-DUSE_FAST_LED_LIGHT' REQUIRED_BUILD_FLAGS = '-DUSE_FAST_LED_LIGHT'
LIB_DEPS = 'FastLED@3.2.0'
LIB_DEPS = 'FastLED@3.2.0' LIB_DEPS = 'FastLED@3.2.0'

View file

@ -1,15 +1,15 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml import pins from esphome import pins
from esphomeyaml.components import light from esphome.components import light
from esphomeyaml.components.power_supply import PowerSupplyComponent from esphome.components.power_supply import PowerSupplyComponent
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_CHIPSET, CONF_CLOCK_PIN, CONF_COLOR_CORRECT, CONF_DATA_PIN, \ from esphome.const import CONF_CHIPSET, CONF_CLOCK_PIN, CONF_COLOR_CORRECT, CONF_DATA_PIN, \
CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_GAMMA_CORRECT, CONF_MAKE_ID, \ CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_GAMMA_CORRECT, CONF_MAKE_ID, \
CONF_MAX_REFRESH_RATE, CONF_NAME, CONF_NUM_LEDS, CONF_POWER_SUPPLY, CONF_RGB_ORDER CONF_MAX_REFRESH_RATE, CONF_NAME, CONF_NUM_LEDS, CONF_POWER_SUPPLY, CONF_RGB_ORDER
from esphomeyaml.cpp_generator import RawExpression, TemplateArguments, add, get_variable, variable from esphome.cpp_generator import RawExpression, TemplateArguments, add, get_variable, variable
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App, Application from esphome.cpp_types import App, Application
CHIPSETS = [ CHIPSETS = [
'LPD8806', 'LPD8806',
@ -34,6 +34,7 @@ RGB_ORDERS = [
MakeFastLEDLight = Application.struct('MakeFastLEDLight') MakeFastLEDLight = Application.struct('MakeFastLEDLight')
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
cv.GenerateID(): cv.declare_variable_id(light.AddressableLightState),
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeFastLEDLight), cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeFastLEDLight),
vol.Required(CONF_CHIPSET): cv.one_of(*CHIPSETS, upper=True), vol.Required(CONF_CHIPSET): cv.one_of(*CHIPSETS, upper=True),
@ -78,11 +79,13 @@ def to_code(config):
r, g, b = config[CONF_COLOR_CORRECT] r, g, b = config[CONF_COLOR_CORRECT]
add(fast_led.set_correction(r, g, b)) add(fast_led.set_correction(r, g, b))
light.setup_light(make.Pstate, make.Pmqtt, config) light.setup_light(make.Pstate, config)
setup_component(fast_led, config) setup_component(fast_led, config)
BUILD_FLAGS = '-DUSE_FAST_LED_LIGHT' REQUIRED_BUILD_FLAGS = '-DUSE_FAST_LED_LIGHT'
LIB_DEPS = 'FastLED@3.2.0'
LIB_DEPS = 'FastLED@3.2.0' LIB_DEPS = 'FastLED@3.2.0'

View file

@ -1,12 +1,12 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.components import light, output from esphome.components import light, output
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_GAMMA_CORRECT, \ from esphome.const import CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_GAMMA_CORRECT, \
CONF_MAKE_ID, CONF_NAME, CONF_OUTPUT CONF_MAKE_ID, CONF_NAME, CONF_OUTPUT
from esphomeyaml.cpp_generator import get_variable, variable from esphome.cpp_generator import get_variable, variable
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App from esphome.cpp_types import App
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight),
@ -22,7 +22,7 @@ def to_code(config):
yield yield
rhs = App.make_monochromatic_light(config[CONF_NAME], output_) rhs = App.make_monochromatic_light(config[CONF_NAME], output_)
light_struct = variable(config[CONF_MAKE_ID], rhs) light_struct = variable(config[CONF_MAKE_ID], rhs)
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config) light.setup_light(light_struct.Pstate, config)
setup_component(light_struct.Pstate, config) setup_component(light_struct.Pstate, config)

View file

@ -1,17 +1,17 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml import pins from esphome import pins
from esphomeyaml.components import light from esphome.components import light
from esphomeyaml.components.light import AddressableLight from esphome.components.light import AddressableLight
from esphomeyaml.components.power_supply import PowerSupplyComponent from esphome.components.power_supply import PowerSupplyComponent
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_CLOCK_PIN, CONF_COLOR_CORRECT, CONF_DATA_PIN, \ from esphome.const import CONF_CLOCK_PIN, CONF_COLOR_CORRECT, CONF_DATA_PIN, \
CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_GAMMA_CORRECT, CONF_MAKE_ID, CONF_METHOD, \ CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_GAMMA_CORRECT, CONF_MAKE_ID, CONF_METHOD, \
CONF_NAME, CONF_NUM_LEDS, CONF_PIN, CONF_POWER_SUPPLY, CONF_TYPE, CONF_VARIANT CONF_NAME, CONF_NUM_LEDS, CONF_PIN, CONF_POWER_SUPPLY, CONF_TYPE, CONF_VARIANT
from esphomeyaml.core import CORE from esphome.core import CORE
from esphomeyaml.cpp_generator import TemplateArguments, add, get_variable, variable from esphome.cpp_generator import TemplateArguments, add, get_variable, variable
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App, Application, Component, global_ns from esphome.cpp_types import App, Application, Component, global_ns
NeoPixelBusLightOutputBase = light.light_ns.class_('NeoPixelBusLightOutputBase', Component, NeoPixelBusLightOutputBase = light.light_ns.class_('NeoPixelBusLightOutputBase', Component,
AddressableLight) AddressableLight)
@ -60,6 +60,30 @@ def validate_method(value):
raise NotImplementedError raise NotImplementedError
def validate_method_pin(value):
method = value[CONF_METHOD]
method_pins = {
'ESP8266_DMA': [3],
'ESP8266_UART0': [1],
'ESP8266_ASYNC_UART0': [1],
'ESP8266_UART1': [2],
'ESP8266_ASYNC_UART1': [2],
'ESP32_I2S_0': list(range(0, 32)),
'ESP32_I2S_1': list(range(0, 32)),
}
if CORE.is_esp8266:
method_pins['BIT_BANG'] = list(range(0, 16))
elif CORE.is_esp32:
method_pins['BIT_BANG'] = list(range(0, 32))
pins_ = method_pins[method]
for opt in (CONF_PIN, CONF_CLOCK_PIN, CONF_DATA_PIN):
if opt in value and value[opt] not in pins_:
raise vol.Invalid("Method {} only supports pin(s) {}".format(
method, ', '.join('GPIO{}'.format(x) for x in pins_)
), path=[CONF_METHOD])
return value
VARIANTS = { VARIANTS = {
'WS2812X': 'Ws2812x', 'WS2812X': 'Ws2812x',
'SK6812': 'Sk6812', 'SK6812': 'Sk6812',
@ -107,6 +131,7 @@ def validate(config):
MakeNeoPixelBusLight = Application.struct('MakeNeoPixelBusLight') MakeNeoPixelBusLight = Application.struct('MakeNeoPixelBusLight')
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
cv.GenerateID(): cv.declare_variable_id(light.AddressableLightState),
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeNeoPixelBusLight), cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeNeoPixelBusLight),
vol.Optional(CONF_TYPE, default='GRB'): validate_type, vol.Optional(CONF_TYPE, default='GRB'): validate_type,
@ -123,7 +148,7 @@ PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds, vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds,
vol.Optional(CONF_POWER_SUPPLY): cv.use_variable_id(PowerSupplyComponent), vol.Optional(CONF_POWER_SUPPLY): cv.use_variable_id(PowerSupplyComponent),
vol.Optional(CONF_EFFECTS): light.validate_effects(light.ADDRESSABLE_EFFECTS), vol.Optional(CONF_EFFECTS): light.validate_effects(light.ADDRESSABLE_EFFECTS),
}).extend(cv.COMPONENT_SCHEMA.schema), validate) }).extend(cv.COMPONENT_SCHEMA.schema), validate, validate_method_pin)
def to_code(config): def to_code(config):
@ -156,11 +181,11 @@ def to_code(config):
if CONF_COLOR_CORRECT in config: if CONF_COLOR_CORRECT in config:
add(output.set_correction(*config[CONF_COLOR_CORRECT])) add(output.set_correction(*config[CONF_COLOR_CORRECT]))
light.setup_light(make.Pstate, make.Pmqtt, config) light.setup_light(make.Pstate, config)
setup_component(output, config) setup_component(output, config)
BUILD_FLAGS = '-DUSE_NEO_PIXEL_BUS_LIGHT' REQUIRED_BUILD_FLAGS = '-DUSE_NEO_PIXEL_BUS_LIGHT'
LIB_DEPS = 'NeoPixelBus@2.4.1' LIB_DEPS = 'NeoPixelBus@2.4.1'

View file

@ -0,0 +1,52 @@
import voluptuous as vol
from esphome.components import light
from esphome.components.light import AddressableLight
import esphome.config_validation as cv
from esphome.const import CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_FROM, CONF_ID, \
CONF_MAKE_ID, CONF_NAME, CONF_SEGMENTS, CONF_TO
from esphome.cpp_generator import get_variable, variable
from esphome.cpp_types import App, Application
AddressableSegment = light.light_ns.class_('AddressableSegment')
PartitionLightOutput = light.light_ns.class_('PartitionLightOutput', AddressableLight)
MakePartitionLight = Application.struct('MakePartitionLight')
def validate_from_to(value):
if value[CONF_FROM] > value[CONF_TO]:
raise vol.Invalid(u"From ({}) must not be larger than to ({})"
u"".format(value[CONF_FROM], value[CONF_TO]))
return value
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
cv.GenerateID(): cv.declare_variable_id(light.AddressableLightState),
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakePartitionLight),
vol.Required(CONF_SEGMENTS): vol.All(cv.ensure_list({
vol.Required(CONF_ID): cv.use_variable_id(light.AddressableLightState),
vol.Required(CONF_FROM): cv.positive_int,
vol.Required(CONF_TO): cv.positive_int,
}, validate_from_to), vol.Length(min=1)),
vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds,
vol.Optional(CONF_EFFECTS): light.validate_effects(light.ADDRESSABLE_EFFECTS),
}))
def to_code(config):
segments = []
for conf in config[CONF_SEGMENTS]:
for var in get_variable(conf[CONF_ID]):
yield
segments.append(AddressableSegment(var, conf[CONF_FROM],
conf[CONF_TO] - conf[CONF_FROM] + 1))
rhs = App.make_partition_light(config[CONF_NAME], segments)
make = variable(config[CONF_MAKE_ID], rhs)
light.setup_light(make.Pstate, config)
def to_hass_config(data, config):
return light.core_to_hass_config(data, config, brightness=True, rgb=True, color_temp=False)

View file

@ -1,12 +1,12 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.components import light, output from esphome.components import light, output
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_BLUE, CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, \ from esphome.const import CONF_BLUE, CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, \
CONF_GAMMA_CORRECT, CONF_GREEN, CONF_MAKE_ID, CONF_NAME, CONF_RED CONF_GAMMA_CORRECT, CONF_GREEN, CONF_MAKE_ID, CONF_NAME, CONF_RED
from esphomeyaml.cpp_generator import get_variable, variable from esphome.cpp_generator import get_variable, variable
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App from esphome.cpp_types import App
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight),
@ -28,7 +28,7 @@ def to_code(config):
yield yield
rhs = App.make_rgb_light(config[CONF_NAME], red, green, blue) rhs = App.make_rgb_light(config[CONF_NAME], red, green, blue)
light_struct = variable(config[CONF_MAKE_ID], rhs) light_struct = variable(config[CONF_MAKE_ID], rhs)
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config) light.setup_light(light_struct.Pstate, config)
setup_component(light_struct.Pstate, config) setup_component(light_struct.Pstate, config)

View file

@ -1,12 +1,12 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.components import light, output from esphome.components import light, output
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_BLUE, CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, \ from esphome.const import CONF_BLUE, CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, \
CONF_GAMMA_CORRECT, CONF_GREEN, CONF_MAKE_ID, CONF_NAME, CONF_RED, CONF_WHITE CONF_GAMMA_CORRECT, CONF_GREEN, CONF_MAKE_ID, CONF_NAME, CONF_RED, CONF_WHITE
from esphomeyaml.cpp_generator import get_variable, variable from esphome.cpp_generator import get_variable, variable
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App from esphome.cpp_types import App
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight),
@ -31,7 +31,7 @@ def to_code(config):
yield yield
rhs = App.make_rgbw_light(config[CONF_NAME], red, green, blue, white) rhs = App.make_rgbw_light(config[CONF_NAME], red, green, blue, white)
light_struct = variable(config[CONF_MAKE_ID], rhs) light_struct = variable(config[CONF_MAKE_ID], rhs)
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config) light.setup_light(light_struct.Pstate, config)
setup_component(light_struct.Pstate, config) setup_component(light_struct.Pstate, config)

View file

@ -1,13 +1,13 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.components import light, output from esphome.components import light, output
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_BLUE, CONF_COLD_WHITE, CONF_COLD_WHITE_COLOR_TEMPERATURE, \ from esphome.const import CONF_BLUE, CONF_COLD_WHITE, CONF_COLD_WHITE_COLOR_TEMPERATURE, \
CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_GAMMA_CORRECT, CONF_GREEN, CONF_MAKE_ID, \ CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_GAMMA_CORRECT, CONF_GREEN, CONF_MAKE_ID, \
CONF_NAME, CONF_RED, CONF_WARM_WHITE, CONF_WARM_WHITE_COLOR_TEMPERATURE CONF_NAME, CONF_RED, CONF_WARM_WHITE, CONF_WARM_WHITE_COLOR_TEMPERATURE
from esphomeyaml.cpp_generator import get_variable, variable from esphome.cpp_generator import get_variable, variable
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App from esphome.cpp_types import App
def validate_color_temperature(value): def validate_color_temperature(value):
@ -61,7 +61,7 @@ def to_code(config):
config[CONF_WARM_WHITE_COLOR_TEMPERATURE], config[CONF_WARM_WHITE_COLOR_TEMPERATURE],
red, green, blue, cold_white, warm_white) red, green, blue, cold_white, warm_white)
light_struct = variable(config[CONF_MAKE_ID], rhs) light_struct = variable(config[CONF_MAKE_ID], rhs)
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config) light.setup_light(light_struct.Pstate, config)
setup_component(light_struct.Pstate, config) setup_component(light_struct.Pstate, config)

View file

@ -2,24 +2,23 @@ import re
import voluptuous as vol import voluptuous as vol
from esphomeyaml.automation import ACTION_REGISTRY, LambdaAction from esphome.automation import ACTION_REGISTRY, LambdaAction
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_ARGS, CONF_BAUD_RATE, CONF_FORMAT, CONF_ID, CONF_LEVEL, \ from esphome.const import CONF_ARGS, CONF_BAUD_RATE, CONF_FORMAT, CONF_HARDWARE_UART, CONF_ID, \
CONF_LOGS, CONF_TAG, CONF_TX_BUFFER_SIZE CONF_LEVEL, CONF_LOGS, CONF_TAG, CONF_TX_BUFFER_SIZE
from esphomeyaml.core import EsphomeyamlError, Lambda, CORE from esphome.core import CORE, EsphomeError, Lambda
from esphomeyaml.cpp_generator import Pvariable, RawExpression, add, process_lambda, statement from esphome.cpp_generator import Pvariable, RawExpression, add, process_lambda, statement
from esphomeyaml.cpp_types import App, Component, esphomelib_ns, global_ns, void from esphome.cpp_types import App, Component, esphome_ns, global_ns, void
from esphome.py_compat import text_type
from esphomeyaml.py_compat import text_type
LOG_LEVELS = { LOG_LEVELS = {
'NONE': global_ns.ESPHOMELIB_LOG_LEVEL_NONE, 'NONE': global_ns.ESPHOME_LOG_LEVEL_NONE,
'ERROR': global_ns.ESPHOMELIB_LOG_LEVEL_ERROR, 'ERROR': global_ns.ESPHOME_LOG_LEVEL_ERROR,
'WARN': global_ns.ESPHOMELIB_LOG_LEVEL_WARN, 'WARN': global_ns.ESPHOME_LOG_LEVEL_WARN,
'INFO': global_ns.ESPHOMELIB_LOG_LEVEL_INFO, 'INFO': global_ns.ESPHOME_LOG_LEVEL_INFO,
'DEBUG': global_ns.ESPHOMELIB_LOG_LEVEL_DEBUG, 'DEBUG': global_ns.ESPHOME_LOG_LEVEL_DEBUG,
'VERBOSE': global_ns.ESPHOMELIB_LOG_LEVEL_VERBOSE, 'VERBOSE': global_ns.ESPHOME_LOG_LEVEL_VERBOSE,
'VERY_VERBOSE': global_ns.ESPHOMELIB_LOG_LEVEL_VERY_VERBOSE, 'VERY_VERBOSE': global_ns.ESPHOME_LOG_LEVEL_VERY_VERBOSE,
} }
LOG_LEVEL_TO_ESP_LOG = { LOG_LEVEL_TO_ESP_LOG = {
@ -33,25 +32,52 @@ LOG_LEVEL_TO_ESP_LOG = {
LOG_LEVEL_SEVERITY = ['NONE', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'VERBOSE', 'VERY_VERBOSE'] LOG_LEVEL_SEVERITY = ['NONE', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'VERBOSE', 'VERY_VERBOSE']
UART_SELECTION_ESP32 = ['UART0', 'UART1', 'UART2']
UART_SELECTION_ESP8266 = ['UART0', 'UART0_SWAP', 'UART1']
HARDWARE_UART_TO_UART_SELECTION = {
'UART0': global_ns.UART_SELECTION_UART0,
'UART0_SWAP': global_ns.UART_SELECTION_UART0_SWAP,
'UART1': global_ns.UART_SELECTION_UART1,
'UART2': global_ns.UART_SELECTION_UART2,
}
HARDWARE_UART_TO_SERIAL = {
'UART0': 'Serial',
'UART0_SWAP': 'Serial',
'UART1': 'Serial1',
'UART2': 'Serial2',
}
# pylint: disable=invalid-name # pylint: disable=invalid-name
is_log_level = cv.one_of(*LOG_LEVELS, upper=True) is_log_level = cv.one_of(*LOG_LEVELS, upper=True)
def uart_selection(value):
if CORE.is_esp32:
return cv.one_of(*UART_SELECTION_ESP32, upper=True)(value)
if CORE.is_esp8266:
return cv.one_of(*UART_SELECTION_ESP8266, upper=True)(value)
raise NotImplementedError
def validate_local_no_higher_than_global(value): def validate_local_no_higher_than_global(value):
global_level = value.get(CONF_LEVEL, 'DEBUG') global_level = value.get(CONF_LEVEL, 'DEBUG')
for tag, level in value.get(CONF_LOGS, {}).items(): for tag, level in value.get(CONF_LOGS, {}).items():
if LOG_LEVEL_SEVERITY.index(level) > LOG_LEVEL_SEVERITY.index(global_level): if LOG_LEVEL_SEVERITY.index(level) > LOG_LEVEL_SEVERITY.index(global_level):
raise EsphomeyamlError(u"The local log level {} for {} must be less severe than the " raise EsphomeError(u"The local log level {} for {} must be less severe than the "
u"global log level {}.".format(level, tag, global_level)) u"global log level {}.".format(level, tag, global_level))
return value return value
LogComponent = esphomelib_ns.class_('LogComponent', Component) LogComponent = esphome_ns.class_('LogComponent', Component)
CONFIG_SCHEMA = vol.All(vol.Schema({ CONFIG_SCHEMA = vol.All(vol.Schema({
cv.GenerateID(): cv.declare_variable_id(LogComponent), cv.GenerateID(): cv.declare_variable_id(LogComponent),
vol.Optional(CONF_BAUD_RATE, default=115200): cv.positive_int, vol.Optional(CONF_BAUD_RATE, default=115200): cv.positive_int,
vol.Optional(CONF_TX_BUFFER_SIZE): cv.validate_bytes, vol.Optional(CONF_TX_BUFFER_SIZE, default=512): cv.validate_bytes,
vol.Optional(CONF_HARDWARE_UART, default='UART0'): uart_selection,
vol.Optional(CONF_LEVEL): is_log_level, vol.Optional(CONF_LEVEL): is_log_level,
vol.Optional(CONF_LOGS): vol.Schema({ vol.Optional(CONF_LOGS): vol.Schema({
cv.string: is_log_level, cv.string: is_log_level,
@ -60,10 +86,10 @@ CONFIG_SCHEMA = vol.All(vol.Schema({
def to_code(config): def to_code(config):
rhs = App.init_log(config.get(CONF_BAUD_RATE)) rhs = App.init_log(config.get(CONF_BAUD_RATE),
config.get(CONF_TX_BUFFER_SIZE),
HARDWARE_UART_TO_UART_SELECTION[config.get(CONF_HARDWARE_UART)])
log = Pvariable(config[CONF_ID], rhs) log = Pvariable(config[CONF_ID], rhs)
if CONF_TX_BUFFER_SIZE in config:
add(log.set_tx_buffer_size(config[CONF_TX_BUFFER_SIZE]))
if CONF_LEVEL in config: if CONF_LEVEL in config:
add(log.set_global_log_level(LOG_LEVELS[config[CONF_LEVEL]])) add(log.set_global_log_level(LOG_LEVELS[config[CONF_LEVEL]]))
for tag, level in config.get(CONF_LOGS, {}).items(): for tag, level in config.get(CONF_LOGS, {}).items():
@ -73,13 +99,14 @@ def to_code(config):
def required_build_flags(config): def required_build_flags(config):
flags = [] flags = []
if CONF_LEVEL in config: if CONF_LEVEL in config:
flags.append(u'-DESPHOMELIB_LOG_LEVEL={}'.format(str(LOG_LEVELS[config[CONF_LEVEL]]))) flags.append(u'-DESPHOME_LOG_LEVEL={}'.format(str(LOG_LEVELS[config[CONF_LEVEL]])))
this_severity = LOG_LEVEL_SEVERITY.index(config[CONF_LEVEL]) this_severity = LOG_LEVEL_SEVERITY.index(config[CONF_LEVEL])
verbose_severity = LOG_LEVEL_SEVERITY.index('VERBOSE') verbose_severity = LOG_LEVEL_SEVERITY.index('VERBOSE')
is_at_least_verbose = this_severity >= verbose_severity is_at_least_verbose = this_severity >= verbose_severity
has_serial_logging = config.get(CONF_BAUD_RATE) != 0 has_serial_logging = config.get(CONF_BAUD_RATE) != 0
if CORE.is_esp8266 and has_serial_logging and is_at_least_verbose: if CORE.is_esp8266 and has_serial_logging and is_at_least_verbose:
flags.append(u"-DDEBUG_ESP_PORT=Serial") debug_serial_port = HARDWARE_UART_TO_SERIAL[config.get(CONF_HARDWARE_UART)]
flags.append(u"-DDEBUG_ESP_PORT={}".format(debug_serial_port))
flags.append(u"-DLWIP_DEBUG") flags.append(u"-DLWIP_DEBUG")
DEBUG_COMPONENTS = { DEBUG_COMPONENTS = {
'HTTP_CLIENT', 'HTTP_CLIENT',

View file

@ -3,22 +3,22 @@ import re
import voluptuous as vol import voluptuous as vol
from esphomeyaml import automation from esphome import automation
from esphomeyaml.automation import ACTION_REGISTRY from esphome.automation import ACTION_REGISTRY
from esphomeyaml.components import logger from esphome.components import logger
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_AVAILABILITY, CONF_BIRTH_MESSAGE, CONF_BROKER, CONF_CLIENT_ID, \ from esphome.const import CONF_AVAILABILITY, CONF_BIRTH_MESSAGE, CONF_BROKER, CONF_CLIENT_ID, \
CONF_COMMAND_TOPIC, CONF_DISCOVERY, CONF_DISCOVERY_PREFIX, CONF_DISCOVERY_RETAIN, \ CONF_COMMAND_TOPIC, CONF_DISCOVERY, CONF_DISCOVERY_PREFIX, CONF_DISCOVERY_RETAIN, \
CONF_ESPHOMEYAML, CONF_ID, CONF_INTERNAL, CONF_KEEPALIVE, CONF_LEVEL, CONF_LOG_TOPIC, \ CONF_ESPHOME, CONF_ID, CONF_INTERNAL, CONF_KEEPALIVE, CONF_LEVEL, CONF_LOG_TOPIC, \
CONF_MQTT, CONF_NAME, CONF_ON_JSON_MESSAGE, CONF_ON_MESSAGE, CONF_PASSWORD, CONF_PAYLOAD, \ CONF_MQTT, CONF_NAME, CONF_ON_JSON_MESSAGE, CONF_ON_MESSAGE, CONF_PASSWORD, CONF_PAYLOAD, \
CONF_PAYLOAD_AVAILABLE, CONF_PAYLOAD_NOT_AVAILABLE, CONF_PORT, CONF_QOS, CONF_REBOOT_TIMEOUT, \ CONF_PAYLOAD_AVAILABLE, CONF_PAYLOAD_NOT_AVAILABLE, CONF_PORT, CONF_QOS, CONF_REBOOT_TIMEOUT, \
CONF_RETAIN, CONF_SHUTDOWN_MESSAGE, CONF_SSL_FINGERPRINTS, CONF_STATE_TOPIC, CONF_TOPIC, \ CONF_RETAIN, CONF_SHUTDOWN_MESSAGE, CONF_SSL_FINGERPRINTS, CONF_STATE_TOPIC, CONF_TOPIC, \
CONF_TOPIC_PREFIX, CONF_TRIGGER_ID, CONF_USERNAME, CONF_WILL_MESSAGE CONF_TOPIC_PREFIX, CONF_TRIGGER_ID, CONF_USERNAME, CONF_WILL_MESSAGE
from esphomeyaml.core import EsphomeyamlError from esphome.core import EsphomeError
from esphomeyaml.cpp_generator import ArrayInitializer, Pvariable, RawExpression, \ from esphome.cpp_generator import Pvariable, RawExpression, StructInitializer, TemplateArguments, \
StructInitializer, TemplateArguments, add, process_lambda, templatable add, get_variable, process_lambda, templatable
from esphomeyaml.cpp_types import Action, App, Component, JsonObjectConstRef, JsonObjectRef, \ from esphome.cpp_types import Action, App, Component, JsonObjectConstRef, JsonObjectRef, \
Trigger, bool_, esphomelib_ns, optional, std_string, uint8, void Trigger, bool_, esphome_ns, optional, std_string, uint8, void
def validate_message_just_topic(value): def validate_message_just_topic(value):
@ -38,7 +38,7 @@ MQTT_MESSAGE_SCHEMA = vol.Any(None, MQTT_MESSAGE_BASE.extend({
vol.Required(CONF_PAYLOAD): cv.mqtt_payload, vol.Required(CONF_PAYLOAD): cv.mqtt_payload,
})) }))
mqtt_ns = esphomelib_ns.namespace('mqtt') mqtt_ns = esphome_ns.namespace('mqtt')
MQTTMessage = mqtt_ns.struct('MQTTMessage') MQTTMessage = mqtt_ns.struct('MQTTMessage')
MQTTClientComponent = mqtt_ns.class_('MQTTClientComponent', Component) MQTTClientComponent = mqtt_ns.class_('MQTTClientComponent', Component)
MQTTPublishAction = mqtt_ns.class_('MQTTPublishAction', Action) MQTTPublishAction = mqtt_ns.class_('MQTTPublishAction', Action)
@ -163,13 +163,13 @@ def to_code(config):
else: else:
add(mqtt.set_log_message_template(exp_mqtt_message(log_topic))) add(mqtt.set_log_message_template(exp_mqtt_message(log_topic)))
if CONF_LEVEL in config: if CONF_LEVEL in log_topic:
add(mqtt.set_log_level(logger.LOG_LEVELS[config[CONF_LEVEL]])) add(mqtt.set_log_level(logger.LOG_LEVELS[log_topic[CONF_LEVEL]]))
if CONF_SSL_FINGERPRINTS in config: if CONF_SSL_FINGERPRINTS in config:
for fingerprint in config[CONF_SSL_FINGERPRINTS]: for fingerprint in config[CONF_SSL_FINGERPRINTS]:
arr = [RawExpression("0x{}".format(fingerprint[i:i + 2])) for i in range(0, 40, 2)] arr = [RawExpression("0x{}".format(fingerprint[i:i + 2])) for i in range(0, 40, 2)]
add(mqtt.add_ssl_fingerprint(ArrayInitializer(*arr, multiline=False))) add(mqtt.add_ssl_fingerprint(arr))
if CONF_KEEPALIVE in config: if CONF_KEEPALIVE in config:
add(mqtt.set_keep_alive(config[CONF_KEEPALIVE])) add(mqtt.set_keep_alive(config[CONF_KEEPALIVE]))
@ -194,6 +194,7 @@ def to_code(config):
CONF_MQTT_PUBLISH = 'mqtt.publish' CONF_MQTT_PUBLISH = 'mqtt.publish'
MQTT_PUBLISH_ACTION_SCHEMA = vol.Schema({ MQTT_PUBLISH_ACTION_SCHEMA = vol.Schema({
cv.GenerateID(): cv.use_variable_id(MQTTClientComponent),
vol.Required(CONF_TOPIC): cv.templatable(cv.publish_topic), vol.Required(CONF_TOPIC): cv.templatable(cv.publish_topic),
vol.Required(CONF_PAYLOAD): cv.templatable(cv.mqtt_payload), vol.Required(CONF_PAYLOAD): cv.templatable(cv.mqtt_payload),
vol.Optional(CONF_QOS): cv.templatable(cv.mqtt_qos), vol.Optional(CONF_QOS): cv.templatable(cv.mqtt_qos),
@ -203,7 +204,9 @@ MQTT_PUBLISH_ACTION_SCHEMA = vol.Schema({
@ACTION_REGISTRY.register(CONF_MQTT_PUBLISH, MQTT_PUBLISH_ACTION_SCHEMA) @ACTION_REGISTRY.register(CONF_MQTT_PUBLISH, MQTT_PUBLISH_ACTION_SCHEMA)
def mqtt_publish_action_to_code(config, action_id, arg_type, template_arg): def mqtt_publish_action_to_code(config, action_id, arg_type, template_arg):
rhs = App.Pget_mqtt_client().Pmake_publish_action(template_arg) for var in get_variable(config[CONF_ID]):
yield None
rhs = var.make_publish_action(template_arg)
type = MQTTPublishAction.template(template_arg) type = MQTTPublishAction.template(template_arg)
action = Pvariable(action_id, rhs, type=type) action = Pvariable(action_id, rhs, type=type)
for template_ in templatable(config[CONF_TOPIC], arg_type, std_string): for template_ in templatable(config[CONF_TOPIC], arg_type, std_string):
@ -226,6 +229,7 @@ def mqtt_publish_action_to_code(config, action_id, arg_type, template_arg):
CONF_MQTT_PUBLISH_JSON = 'mqtt.publish_json' CONF_MQTT_PUBLISH_JSON = 'mqtt.publish_json'
MQTT_PUBLISH_JSON_ACTION_SCHEMA = vol.Schema({ MQTT_PUBLISH_JSON_ACTION_SCHEMA = vol.Schema({
cv.GenerateID(): cv.use_variable_id(MQTTClientComponent),
vol.Required(CONF_TOPIC): cv.templatable(cv.publish_topic), vol.Required(CONF_TOPIC): cv.templatable(cv.publish_topic),
vol.Required(CONF_PAYLOAD): cv.lambda_, vol.Required(CONF_PAYLOAD): cv.lambda_,
vol.Optional(CONF_QOS): cv.mqtt_qos, vol.Optional(CONF_QOS): cv.mqtt_qos,
@ -235,7 +239,9 @@ MQTT_PUBLISH_JSON_ACTION_SCHEMA = vol.Schema({
@ACTION_REGISTRY.register(CONF_MQTT_PUBLISH_JSON, MQTT_PUBLISH_JSON_ACTION_SCHEMA) @ACTION_REGISTRY.register(CONF_MQTT_PUBLISH_JSON, MQTT_PUBLISH_JSON_ACTION_SCHEMA)
def mqtt_publish_json_action_to_code(config, action_id, arg_type, template_arg): def mqtt_publish_json_action_to_code(config, action_id, arg_type, template_arg):
rhs = App.Pget_mqtt_client().Pmake_publish_json_action(template_arg) for var in get_variable(config[CONF_ID]):
yield None
rhs = var.make_publish_json_action(template_arg)
type = MQTTPublishJsonAction.template(template_arg) type = MQTTPublishJsonAction.template(template_arg)
action = Pvariable(action_id, rhs, type=type) action = Pvariable(action_id, rhs, type=type)
for template_ in templatable(config[CONF_TOPIC], arg_type, std_string): for template_ in templatable(config[CONF_TOPIC], arg_type, std_string):
@ -293,10 +299,10 @@ def build_hass_config(data, component_type, config, include_state=True, include_
class GenerateHassConfigData(object): class GenerateHassConfigData(object):
def __init__(self, config): def __init__(self, config):
if 'mqtt' not in config: if 'mqtt' not in config:
raise EsphomeyamlError("Cannot generate Home Assistant MQTT config if MQTT is not " raise EsphomeError("Cannot generate Home Assistant MQTT config if MQTT is not "
"used!") "used!")
mqtt = config[CONF_MQTT] mqtt = config[CONF_MQTT]
self.topic_prefix = mqtt.get(CONF_TOPIC_PREFIX, config[CONF_ESPHOMEYAML][CONF_NAME]) self.topic_prefix = mqtt.get(CONF_TOPIC_PREFIX, config[CONF_ESPHOME][CONF_NAME])
birth_message = mqtt.get(CONF_BIRTH_MESSAGE) birth_message = mqtt.get(CONF_BIRTH_MESSAGE)
if CONF_BIRTH_MESSAGE not in mqtt: if CONF_BIRTH_MESSAGE not in mqtt:
birth_message = { birth_message = {
@ -337,3 +343,7 @@ def setup_mqtt_component(obj, config):
else: else:
add(obj.set_availability(availability[CONF_TOPIC], availability[CONF_PAYLOAD_AVAILABLE], add(obj.set_availability(availability[CONF_TOPIC], availability[CONF_PAYLOAD_AVAILABLE],
availability[CONF_PAYLOAD_NOT_AVAILABLE])) availability[CONF_PAYLOAD_NOT_AVAILABLE]))
LIB_DEPS = 'AsyncMqttClient@0.8.2'
BUILD_FLAGS = '-DUSE_MQTT'

View file

@ -1,13 +1,13 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml import pins from esphome import pins
from esphomeyaml.components import output from esphome.components import output
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import (CONF_BIT_DEPTH, CONF_CLOCK_PIN, CONF_DATA_PIN, CONF_ID, from esphome.const import (CONF_BIT_DEPTH, CONF_CLOCK_PIN, CONF_DATA_PIN, CONF_ID,
CONF_NUM_CHANNELS, CONF_NUM_CHIPS, CONF_UPDATE_ON_BOOT) CONF_NUM_CHANNELS, CONF_NUM_CHIPS, CONF_UPDATE_ON_BOOT)
from esphomeyaml.cpp_generator import Pvariable, add from esphome.cpp_generator import Pvariable, add
from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component from esphome.cpp_helpers import gpio_output_pin_expression, setup_component
from esphomeyaml.cpp_types import App, Component from esphome.cpp_types import App, Component
MY9231OutputComponent = output.output_ns.class_('MY9231OutputComponent', Component) MY9231OutputComponent = output.output_ns.class_('MY9231OutputComponent', Component)
MULTI_CONF = True MULTI_CONF = True

View file

@ -2,15 +2,15 @@ import logging
import voluptuous as vol import voluptuous as vol
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_ID, CONF_OTA, CONF_PASSWORD, CONF_PORT, CONF_SAFE_MODE from esphome.const import CONF_ID, CONF_OTA, CONF_PASSWORD, CONF_PORT, CONF_SAFE_MODE
from esphomeyaml.core import CORE from esphome.core import CORE
from esphomeyaml.cpp_generator import Pvariable, add from esphome.cpp_generator import Pvariable, add
from esphomeyaml.cpp_types import App, Component, esphomelib_ns from esphome.cpp_types import App, Component, esphome_ns
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
OTAComponent = esphomelib_ns.class_('OTAComponent', Component) OTAComponent = esphome_ns.class_('OTAComponent', Component)
CONFIG_SCHEMA = vol.Schema({ CONFIG_SCHEMA = vol.Schema({
cv.GenerateID(): cv.declare_variable_id(OTAComponent), cv.GenerateID(): cv.declare_variable_id(OTAComponent),

View file

@ -1,12 +1,12 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY from esphome.automation import ACTION_REGISTRY, maybe_simple_id
import esphomeyaml.config_validation as cv from esphome.components.power_supply import PowerSupplyComponent
from esphomeyaml.components.power_supply import PowerSupplyComponent import esphome.config_validation as cv
from esphomeyaml.const import CONF_INVERTED, CONF_MAX_POWER, CONF_POWER_SUPPLY, CONF_ID, CONF_LEVEL from esphome.const import CONF_ID, CONF_INVERTED, CONF_LEVEL, CONF_MAX_POWER, CONF_POWER_SUPPLY
from esphomeyaml.core import CORE from esphome.core import CORE
from esphomeyaml.cpp_generator import add, get_variable, Pvariable, templatable from esphome.cpp_generator import Pvariable, add, get_variable, templatable
from esphomeyaml.cpp_types import esphomelib_ns, Action, float_ from esphome.cpp_types import Action, esphome_ns, float_
PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
@ -25,7 +25,7 @@ FLOAT_OUTPUT_SCHEMA = BINARY_OUTPUT_SCHEMA.extend({
FLOAT_OUTPUT_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(FLOAT_OUTPUT_SCHEMA.schema) FLOAT_OUTPUT_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(FLOAT_OUTPUT_SCHEMA.schema)
output_ns = esphomelib_ns.namespace('output') output_ns = esphome_ns.namespace('output')
BinaryOutput = output_ns.class_('BinaryOutput') BinaryOutput = output_ns.class_('BinaryOutput')
BinaryOutputPtr = BinaryOutput.operator('ptr') BinaryOutputPtr = BinaryOutput.operator('ptr')
FloatOutput = output_ns.class_('FloatOutput', BinaryOutput) FloatOutput = output_ns.class_('FloatOutput', BinaryOutput)
@ -60,7 +60,6 @@ def register_output(var, config):
BUILD_FLAGS = '-DUSE_OUTPUT' BUILD_FLAGS = '-DUSE_OUTPUT'
CONF_OUTPUT_TURN_ON = 'output.turn_on' CONF_OUTPUT_TURN_ON = 'output.turn_on'
OUTPUT_TURN_ON_ACTION = maybe_simple_id({ OUTPUT_TURN_ON_ACTION = maybe_simple_id({
vol.Required(CONF_ID): cv.use_variable_id(BinaryOutput), vol.Required(CONF_ID): cv.use_variable_id(BinaryOutput),

View file

@ -1,10 +1,10 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.components import output from esphome.components import output
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_ID, CONF_LAMBDA, CONF_OUTPUTS, CONF_TYPE from esphome.const import CONF_ID, CONF_LAMBDA, CONF_OUTPUTS, CONF_TYPE
from esphomeyaml.cpp_generator import process_lambda, variable from esphome.cpp_generator import process_lambda, variable
from esphomeyaml.cpp_types import std_vector from esphome.cpp_types import std_vector
CustomBinaryOutputConstructor = output.output_ns.class_('CustomBinaryOutputConstructor') CustomBinaryOutputConstructor = output.output_ns.class_('CustomBinaryOutputConstructor')
CustomFloatOutputConstructor = output.output_ns.class_('CustomFloatOutputConstructor') CustomFloatOutputConstructor = output.output_ns.class_('CustomFloatOutputConstructor')
@ -12,6 +12,7 @@ CustomFloatOutputConstructor = output.output_ns.class_('CustomFloatOutputConstru
BINARY_SCHEMA = output.PLATFORM_SCHEMA.extend({ BINARY_SCHEMA = output.PLATFORM_SCHEMA.extend({
cv.GenerateID(): cv.declare_variable_id(CustomBinaryOutputConstructor), cv.GenerateID(): cv.declare_variable_id(CustomBinaryOutputConstructor),
vol.Required(CONF_LAMBDA): cv.lambda_, vol.Required(CONF_LAMBDA): cv.lambda_,
vol.Required(CONF_TYPE): 'binary',
vol.Required(CONF_OUTPUTS): vol.Required(CONF_OUTPUTS):
cv.ensure_list(output.BINARY_OUTPUT_SCHEMA.extend({ cv.ensure_list(output.BINARY_OUTPUT_SCHEMA.extend({
cv.GenerateID(): cv.declare_variable_id(output.BinaryOutput), cv.GenerateID(): cv.declare_variable_id(output.BinaryOutput),
@ -21,8 +22,9 @@ BINARY_SCHEMA = output.PLATFORM_SCHEMA.extend({
FLOAT_SCHEMA = output.PLATFORM_SCHEMA.extend({ FLOAT_SCHEMA = output.PLATFORM_SCHEMA.extend({
cv.GenerateID(): cv.declare_variable_id(CustomFloatOutputConstructor), cv.GenerateID(): cv.declare_variable_id(CustomFloatOutputConstructor),
vol.Required(CONF_LAMBDA): cv.lambda_, vol.Required(CONF_LAMBDA): cv.lambda_,
vol.Required(CONF_TYPE): 'float',
vol.Required(CONF_OUTPUTS): vol.Required(CONF_OUTPUTS):
cv.ensure_list(output.FLOAT_OUTPUT_PLATFORM_SCHEMA.extend({ cv.ensure_list(output.FLOAT_OUTPUT_SCHEMA.extend({
cv.GenerateID(): cv.declare_variable_id(output.FloatOutput), cv.GenerateID(): cv.declare_variable_id(output.FloatOutput),
})), })),
}) })
@ -59,8 +61,8 @@ def to_code(config):
rhs = klass(template_) rhs = klass(template_)
custom = variable(config[CONF_ID], rhs) custom = variable(config[CONF_ID], rhs)
for i, sens in enumerate(config[CONF_OUTPUTS]): for i, conf in enumerate(config[CONF_OUTPUTS]):
output.register_output(custom.get_output(i), sens) output.register_output(custom.get_output(i), conf)
BUILD_FLAGS = '-DUSE_CUSTOM_OUTPUT' BUILD_FLAGS = '-DUSE_CUSTOM_OUTPUT'

View file

@ -1,19 +1,19 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml import pins from esphome import pins
from esphomeyaml.components import output from esphome.components import output
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_FREQUENCY, CONF_ID, CONF_NUMBER, CONF_PIN, ESP_PLATFORM_ESP8266 from esphome.const import CONF_FREQUENCY, CONF_ID, CONF_NUMBER, CONF_PIN, ESP_PLATFORM_ESP8266
from esphomeyaml.cpp_generator import Pvariable, add from esphome.cpp_generator import Pvariable, add
from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component from esphome.cpp_helpers import gpio_output_pin_expression, setup_component
from esphomeyaml.cpp_types import App, Component from esphome.cpp_types import App, Component
ESP_PLATFORMS = [ESP_PLATFORM_ESP8266] ESP_PLATFORMS = [ESP_PLATFORM_ESP8266]
def valid_pwm_pin(value): def valid_pwm_pin(value):
num = value[CONF_NUMBER] num = value[CONF_NUMBER]
cv.one_of(0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16)(num) cv.one_of(0, 1, 2, 3, 4, 5, 9, 10, 12, 13, 14, 15, 16)(num)
return value return value

View file

@ -1,12 +1,12 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml import pins from esphome import pins
from esphomeyaml.components import output from esphome.components import output
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_ID, CONF_PIN from esphome.const import CONF_ID, CONF_PIN
from esphomeyaml.cpp_generator import Pvariable from esphome.cpp_generator import Pvariable
from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component from esphome.cpp_helpers import gpio_output_pin_expression, setup_component
from esphomeyaml.cpp_types import App, Component from esphome.cpp_types import App, Component
GPIOBinaryOutputComponent = output.output_ns.class_('GPIOBinaryOutputComponent', GPIOBinaryOutputComponent = output.output_ns.class_('GPIOBinaryOutputComponent',
output.BinaryOutput, Component) output.BinaryOutput, Component)

View file

@ -1,13 +1,13 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml import pins from esphome import pins
from esphomeyaml.components import output from esphome.components import output
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import APB_CLOCK_FREQ, CONF_BIT_DEPTH, CONF_CHANNEL, CONF_FREQUENCY, \ from esphome.const import APB_CLOCK_FREQ, CONF_BIT_DEPTH, CONF_CHANNEL, CONF_FREQUENCY, \
CONF_ID, CONF_PIN, ESP_PLATFORM_ESP32 CONF_ID, CONF_PIN, ESP_PLATFORM_ESP32
from esphomeyaml.cpp_generator import Pvariable, add from esphome.cpp_generator import Pvariable, add
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App, Component from esphome.cpp_types import App, Component
ESP_PLATFORMS = [ESP_PLATFORM_ESP32] ESP_PLATFORMS = [ESP_PLATFORM_ESP32]

View file

@ -1,11 +1,11 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.components import output from esphome.components import output
from esphomeyaml.components.my9231 import MY9231OutputComponent from esphome.components.my9231 import MY9231OutputComponent
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_CHANNEL, CONF_ID, CONF_MY9231_ID, CONF_POWER_SUPPLY from esphome.const import CONF_CHANNEL, CONF_ID, CONF_MY9231_ID, CONF_POWER_SUPPLY
from esphomeyaml.cpp_generator import Pvariable, get_variable from esphome.cpp_generator import Pvariable, get_variable
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
DEPENDENCIES = ['my9231'] DEPENDENCIES = ['my9231']

View file

@ -1,10 +1,10 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.components import output from esphome.components import output
from esphomeyaml.components.pca9685 import PCA9685OutputComponent from esphome.components.pca9685 import PCA9685OutputComponent
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_CHANNEL, CONF_ID, CONF_PCA9685_ID, CONF_POWER_SUPPLY from esphome.const import CONF_CHANNEL, CONF_ID, CONF_PCA9685_ID, CONF_POWER_SUPPLY
from esphomeyaml.cpp_generator import Pvariable, get_variable from esphome.cpp_generator import Pvariable, get_variable
DEPENDENCIES = ['pca9685'] DEPENDENCIES = ['pca9685']

View file

@ -1,11 +1,11 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml.components import i2c, output from esphome.components import i2c, output
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_ADDRESS, CONF_FREQUENCY, CONF_ID from esphome.const import CONF_ADDRESS, CONF_FREQUENCY, CONF_ID
from esphomeyaml.cpp_generator import Pvariable, add from esphome.cpp_generator import Pvariable, add
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App, Component from esphome.cpp_types import App, Component
DEPENDENCIES = ['i2c'] DEPENDENCIES = ['i2c']
MULTI_CONF = True MULTI_CONF = True

View file

@ -1,11 +1,11 @@
import voluptuous as vol import voluptuous as vol
from esphomeyaml import pins from esphome import pins
import esphomeyaml.config_validation as cv import esphome.config_validation as cv
from esphomeyaml.const import CONF_ADDRESS, CONF_ID, CONF_PCF8575 from esphome.const import CONF_ADDRESS, CONF_ID, CONF_PCF8575
from esphomeyaml.cpp_generator import Pvariable from esphome.cpp_generator import Pvariable
from esphomeyaml.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphomeyaml.cpp_types import App, GPIOInputPin, GPIOOutputPin, io_ns from esphome.cpp_types import App, GPIOInputPin, GPIOOutputPin, io_ns
DEPENDENCIES = ['i2c'] DEPENDENCIES = ['i2c']
MULTI_CONF = True MULTI_CONF = True

Some files were not shown because too many files have changed in this diff Show more