diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 52ee89e4f6..0000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -name: Bug report -about: Create a report to help esphomelib improve - ---- - - - -**Operating environment (Hass.io/Docker/pip/etc.):** - - -**ESP (ESP32/ESP8266/Board/Sonoff):** - - -**Affected component:** - - - -**Description of problem:** - - -**Problem-relevant YAML-configuration entries:** -```yaml -PASTE YAML FILE HERE -``` - -**Traceback (if applicable):** - -``` - -``` - -**Additional information:** diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 2a033e374e..0000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project - ---- - - - -**Is your feature request related to a problem/use-case? Please describe.** - - -**Describe the solution you'd like:** - - -**Additional context:** - diff --git a/.github/ISSUE_TEMPLATE/new-integration.md b/.github/ISSUE_TEMPLATE/new-integration.md deleted file mode 100644 index 34fdb086ad..0000000000 --- a/.github/ISSUE_TEMPLATE/new-integration.md +++ /dev/null @@ -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! diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index f0fdd660ae..64780a340d 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -3,8 +3,8 @@ **Related issue (if applicable):** fixes -**Pull request in [esphomedocs](https://github.com/OttoWinter/esphomedocs) with documentation (if applicable):** OttoWinter/esphomedocs# -**Pull request in [esphomelib](https://github.com/OttoWinter/esphomelib) with C++ framework changes (if applicable):** OttoWinter/esphomelib# +**Pull request in [esphome-docs](https://github.com/esphome/esphome-docs) with documentation (if applicable):** esphome/esphome-docs# +**Pull request in [esphome-core](https://github.com/esphome/esphome-core) with C++ framework changes (if applicable):** esphome/esphome-core# ## Checklist: - [ ] The code change is tested and works locally. diff --git a/.gitignore b/.gitignore index d871a420e0..c8a36dfd3a 100644 --- a/.gitignore +++ b/.gitignore @@ -105,4 +105,4 @@ venv.bak/ config/ tests/build/ -tests/.esphomeyaml/ +tests/.esphome/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 78566baff8..720df87efa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,293 +2,126 @@ # Based on https://gitlab.com/hassio-addons/addon-node-red/blob/master/.gitlab-ci.yml variables: DOCKER_DRIVER: overlay2 + DOCKER_HOST: tcp://docker:2375/ stages: - lint - test - - build - deploy .lint: &lint + image: esphome/esphome-base-amd64 stage: lint before_script: - pip install -e . + - pip install flake8==3.6.0 pylint==1.9.4 pillow tags: - - python2.7 - - esphomeyaml-lint + - docker .test: &test + image: esphome/esphome-base-amd64 stage: test before_script: - pip install -e . tags: - - python2.7 - - esphomeyaml-test + - docker variables: TZ: UTC -.docker-builder: &docker-builder +.docker-base: &docker-base + image: esphome/esphome-base-builder before_script: - 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: - docker:dind tags: - - hassio-builder + - docker + stage: deploy flake8: <<: *lint script: - - flake8 esphomeyaml + - flake8 esphome pylint: <<: *lint script: - - pylint esphomeyaml + - pylint esphome test1: <<: *test script: - - esphomeyaml tests/test1.yaml compile + - esphome tests/test1.yaml compile test2: <<: *test script: - - esphomeyaml tests/test2.yaml compile + - esphome tests/test2.yaml compile -.build-hassio: &build-hassio - <<: *docker-builder - stage: build +test3: + <<: *test script: - - docker run --rm --privileged hassioaddons/qemu-user-static:latest - - 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 + - esphome tests/test3.yaml compile .deploy-pypi: &deploy-pypi stage: deploy + image: python:2.7 before_script: - pip install -e . - pip install twine @@ -296,8 +129,7 @@ deploy-beta:amd64: - python setup.py sdist - twine upload dist/* tags: - - python2.7 - - esphomeyaml-test + - docker deploy-release:pypi: <<: *deploy-pypi @@ -312,3 +144,204 @@ deploy-beta:pypi: - /^v\d+\.\d+\.\d+b\d+$/ except: - /^(?!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" diff --git a/.travis.yml b/.travis.yml index ce9b00e2e0..f2895cd950 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,23 +8,24 @@ matrix: env: TARGET=Lint2.7 install: pip install -e . && pip install flake8==3.6.0 pylint==1.9.4 pillow script: - - flake8 esphomeyaml - - pylint esphomeyaml + - flake8 esphome + - pylint esphome - python: "3.5.3" 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 script: - - flake8 esphomeyaml - - pylint esphomeyaml + - flake8 esphome + - pylint esphome - python: "2.7" env: TARGET=Test2.7 install: pip install -e . && pip install flake8==3.6.0 pylint==1.9.4 pillow script: - - esphomeyaml tests/test1.yaml compile - - esphomeyaml tests/test2.yaml compile - - python: "3.5.3" - env: TARGET=Test3.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 - script: - - esphomeyaml tests/test1.yaml compile - - esphomeyaml tests/test2.yaml compile + - esphome tests/test1.yaml compile + - esphome tests/test2.yaml compile + - esphome tests/test3.yaml compile + #- python: "3.5.3" + # env: TARGET=Test3.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 + # script: + # - esphome tests/test1.yaml compile + # - esphome tests/test2.yaml compile diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b085ab82f8..43d5e79074 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -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 -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: - Please test your changes :) - 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. - 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. diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 4af3ac8a3e..0000000000 --- a/Dockerfile +++ /dev/null @@ -1,28 +0,0 @@ -ARG BUILD_FROM=python:2.7 -FROM ${BUILD_FROM} -MAINTAINER Otto Winter - -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"] diff --git a/MANIFEST.in b/MANIFEST.in index 83308b2be5..48ab2418e9 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,17 +1,17 @@ include README.md -include esphomeyaml/dashboard/templates/index.html -include esphomeyaml/dashboard/templates/login.html -include esphomeyaml/dashboard/static/ace.js -include esphomeyaml/dashboard/static/esphomeyaml.css -include esphomeyaml/dashboard/static/esphomeyaml.js -include esphomeyaml/dashboard/static/favicon.ico -include esphomeyaml/dashboard/static/jquery.min.js -include esphomeyaml/dashboard/static/jquery.validate.min.js -include esphomeyaml/dashboard/static/jquery-ui.min.js -include esphomeyaml/dashboard/static/materialize.min.css -include esphomeyaml/dashboard/static/materialize.min.js -include esphomeyaml/dashboard/static/materialize-stepper.min.css -include esphomeyaml/dashboard/static/materialize-stepper.min.js -include esphomeyaml/dashboard/static/mode-yaml.js -include esphomeyaml/dashboard/static/theme-dreamweaver.js -include esphomeyaml/dashboard/static/ext-searchbox.js +include esphome/dashboard/templates/index.html +include esphome/dashboard/templates/login.html +include esphome/dashboard/static/ace.js +include esphome/dashboard/static/esphome.css +include esphome/dashboard/static/esphome.js +include esphome/dashboard/static/favicon.ico +include esphome/dashboard/static/jquery.min.js +include esphome/dashboard/static/jquery.validate.min.js +include esphome/dashboard/static/jquery-ui.min.js +include esphome/dashboard/static/materialize.min.css +include esphome/dashboard/static/materialize.min.js +include esphome/dashboard/static/materialize-stepper.min.css +include esphome/dashboard/static/materialize-stepper.min.js +include esphome/dashboard/static/mode-yaml.js +include esphome/dashboard/static/theme-dreamweaver.js +include esphome/dashboard/static/ext-searchbox.js diff --git a/README.md b/README.md index 61b7e67c4f..f21e748d40 100644 --- a/README.md +++ b/README.md @@ -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: - - * 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. +For feature requests, please see [feature requests](https://github.com/esphome/feature-requests/issues). diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000000..08c74bb2c2 --- /dev/null +++ b/docker/Dockerfile @@ -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"] diff --git a/docker/Dockerfile.builder b/docker/Dockerfile.builder deleted file mode 100644 index 2077b7bde1..0000000000 --- a/docker/Dockerfile.builder +++ /dev/null @@ -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 diff --git a/docker/Dockerfile.hassio b/docker/Dockerfile.hassio index f0f4165263..f077b8ebf8 100644 --- a/docker/Dockerfile.hassio +++ b/docker/Dockerfile.hassio @@ -1,75 +1,20 @@ -ARG BUILD_FROM=hassioaddons/ubuntu-base:2.2.0 -# hadolint ignore=DL3006 +ARG BUILD_FROM=esphome/esphome-hassio-base-amd64:1.2.1 FROM ${BUILD_FROM} -# Set shell -SHELL ["/bin/bash", "-o", "pipefail", "-c"] - # Copy root filesystem -COPY esphomeyaml-edge/rootfs / -COPY setup.py setup.cfg MANIFEST.in /opt/esphomeyaml/ -COPY esphomeyaml /opt/esphomeyaml/esphomeyaml +COPY docker/rootfs/ / +COPY setup.py setup.cfg MANIFEST.in /opt/esphome/ +COPY esphome /opt/esphome/esphome RUN \ - # Temporarily move nginx.conf (otherwise dpkg fails) - 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/ + pip2 install --no-cache-dir --no-binary :all: -e /opt/esphome -# Build arugments -ARG BUILD_ARCH=amd64 -ARG BUILD_DATE -ARG BUILD_REF -ARG BUILD_VERSION +# Build arguments +ARG BUILD_VERSION=dev # Labels LABEL \ - io.hass.name="esphomeyaml" \ + io.hass.name="ESPHome" \ io.hass.description="Manage and program ESP8266/ESP32 microcontrollers through YAML configuration files" \ - io.hass.arch="${BUILD_ARCH}" \ io.hass.type="addon" \ - io.hass.version=${BUILD_VERSION} \ - maintainer="Otto Winter " \ - 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" \ No newline at end of file + io.hass.version=${BUILD_VERSION} diff --git a/docker/hooks/build b/docker/hooks/build new file mode 100644 index 0000000000..482dacafc4 --- /dev/null +++ b/docker/hooks/build @@ -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 diff --git a/docker/hooks/pre_build b/docker/hooks/pre_build new file mode 100644 index 0000000000..aff12dd3f5 --- /dev/null +++ b/docker/hooks/pre_build @@ -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 diff --git a/esphomeyaml-edge/rootfs/etc/cont-init.d/10-requirements.sh b/docker/rootfs/etc/cont-init.d/10-requirements.sh similarity index 91% rename from esphomeyaml-edge/rootfs/etc/cont-init.d/10-requirements.sh rename to docker/rootfs/etc/cont-init.d/10-requirements.sh index de37e10334..898e811d39 100644 --- a/esphomeyaml-edge/rootfs/etc/cont-init.d/10-requirements.sh +++ b/docker/rootfs/etc/cont-init.d/10-requirements.sh @@ -1,6 +1,6 @@ #!/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 # ============================================================================== # shellcheck disable=SC1091 @@ -22,7 +22,7 @@ if hass.config.true 'ssl'; then text="You enabled encrypted connections using the \"ssl\": true option. 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 - 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." hass.die "${text}" fi diff --git a/esphomeyaml-edge/rootfs/etc/cont-init.d/20-nginx.sh b/docker/rootfs/etc/cont-init.d/20-nginx.sh similarity index 89% rename from esphomeyaml-edge/rootfs/etc/cont-init.d/20-nginx.sh rename to docker/rootfs/etc/cont-init.d/20-nginx.sh index 281463b4dc..42fcd1ef36 100644 --- a/esphomeyaml-edge/rootfs/etc/cont-init.d/20-nginx.sh +++ b/docker/rootfs/etc/cont-init.d/20-nginx.sh @@ -1,7 +1,7 @@ #!/usr/bin/with-contenv bash # ============================================================================== -# Community Hass.io Add-ons: esphomeyaml -# Configures NGINX for use with esphomeyaml +# Community Hass.io Add-ons: ESPHome +# Configures NGINX for use with ESPHome # ============================================================================== # shellcheck disable=SC1091 source /usr/lib/hassio-addons/base.sh diff --git a/esphomeyaml-edge/rootfs/etc/cont-init.d/30-esphomeyaml.sh b/docker/rootfs/etc/cont-init.d/30-esphome.sh similarity index 50% rename from esphomeyaml-edge/rootfs/etc/cont-init.d/30-esphomeyaml.sh rename to docker/rootfs/etc/cont-init.d/30-esphome.sh index 0131b09b74..e4f6b506c0 100644 --- a/esphomeyaml-edge/rootfs/etc/cont-init.d/30-esphomeyaml.sh +++ b/docker/rootfs/etc/cont-init.d/30-esphome.sh @@ -1,14 +1,14 @@ #!/usr/bin/with-contenv bash # ============================================================================== -# Community Hass.io Add-ons: esphomeyaml -# This files installs the user esphomeyaml version if specified +# Community Hass.io Add-ons: ESPHome +# This files installs the user ESPHome version if specified # ============================================================================== # shellcheck disable=SC1091 source /usr/lib/hassio-addons/base.sh -declare esphomeyaml_version +declare esphome_version -if hass.config.has_value 'esphomeyaml_version'; then - esphomeyaml_version=$(hass.config.get 'esphomeyaml_version') - pip2 install --no-cache-dir --no-binary :all: "https://github.com/OttoWinter/esphomeyaml/archive/${esphomeyaml_version}.zip" +if hass.config.has_value 'esphome_version'; then + esphome_version=$(hass.config.get 'esphome_version') + pip2 install --no-cache-dir --no-binary :all: "https://github.com/esphome/esphome/archive/${esphome_version}.zip" fi diff --git a/docker/rootfs/etc/cont-init.d/40-migrate.sh b/docker/rootfs/etc/cont-init.d/40-migrate.sh new file mode 100644 index 0000000000..600440ff15 --- /dev/null +++ b/docker/rootfs/etc/cont-init.d/40-migrate.sh @@ -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 diff --git a/esphomeyaml-edge/rootfs/etc/nginx/nginx-ssl.conf b/docker/rootfs/etc/nginx/nginx-ssl.conf similarity index 93% rename from esphomeyaml-edge/rootfs/etc/nginx/nginx-ssl.conf rename to docker/rootfs/etc/nginx/nginx-ssl.conf index 1d761595a9..cd76036fde 100644 --- a/esphomeyaml-edge/rootfs/etc/nginx/nginx-ssl.conf +++ b/docker/rootfs/etc/nginx/nginx-ssl.conf @@ -13,9 +13,9 @@ http { sendfile on; keepalive_timeout 65; - upstream esphomeyaml { + upstream esphome { ip_hash; - server unix:/var/run/esphomeyaml.sock; + server unix:/var/run/esphome.sock; } map $http_upgrade $connection_upgrade { default upgrade; @@ -45,7 +45,7 @@ http { location / { proxy_redirect off; - proxy_pass http://esphomeyaml; + proxy_pass http://esphome; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; diff --git a/esphomeyaml-edge/rootfs/etc/nginx/nginx.conf b/docker/rootfs/etc/nginx/nginx.conf similarity index 90% rename from esphomeyaml-edge/rootfs/etc/nginx/nginx.conf rename to docker/rootfs/etc/nginx/nginx.conf index 596fc3e604..4a0067c12f 100644 --- a/esphomeyaml-edge/rootfs/etc/nginx/nginx.conf +++ b/docker/rootfs/etc/nginx/nginx.conf @@ -13,9 +13,9 @@ http { sendfile on; keepalive_timeout 65; - upstream esphomeyaml { + upstream esphome { ip_hash; - server unix:/var/run/esphomeyaml.sock; + server unix:/var/run/esphome.sock; } map $http_upgrade $connection_upgrade { default upgrade; @@ -29,7 +29,7 @@ http { location / { proxy_redirect off; - proxy_pass http://esphomeyaml; + proxy_pass http://esphome; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; diff --git a/esphomeyaml-edge/rootfs/etc/services.d/esphomeyaml/finish b/docker/rootfs/etc/services.d/esphome/finish similarity index 73% rename from esphomeyaml-edge/rootfs/etc/services.d/esphomeyaml/finish rename to docker/rootfs/etc/services.d/esphome/finish index 4d0e9a35ff..789a65e90c 100644 --- a/esphomeyaml-edge/rootfs/etc/services.d/esphomeyaml/finish +++ b/docker/rootfs/etc/services.d/esphome/finish @@ -1,7 +1,7 @@ #!/usr/bin/execlineb -S0 # ============================================================================== -# Community Hass.io Add-ons: esphomeyaml -# Take down the S6 supervision tree when esphomeyaml fails +# Community Hass.io Add-ons: ESPHome +# Take down the S6 supervision tree when ESPHome fails # ============================================================================== if -n { s6-test $# -ne 0 } if -n { s6-test ${1} -eq 256 } diff --git a/esphomeyaml-edge/rootfs/etc/services.d/esphomeyaml/run b/docker/rootfs/etc/services.d/esphome/run similarity index 62% rename from esphomeyaml-edge/rootfs/etc/services.d/esphomeyaml/run rename to docker/rootfs/etc/services.d/esphome/run index 8f71cd8095..8dea41abf4 100644 --- a/esphomeyaml-edge/rootfs/etc/services.d/esphomeyaml/run +++ b/docker/rootfs/etc/services.d/esphome/run @@ -1,7 +1,7 @@ #!/usr/bin/with-contenv bash # ============================================================================== -# Community Hass.io Add-ons: esphomeyaml -# Runs the esphomeyaml dashboard +# Community Hass.io Add-ons: ESPHome +# Runs the ESPHome dashboard # ============================================================================== # shellcheck disable=SC1091 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 fi -hass.log.info "Starting esphomeyaml dashboard..." -exec esphomeyaml /config/esphomeyaml dashboard --socket /var/run/esphomeyaml.sock --hassio +hass.log.info "Starting ESPHome dashboard..." +exec esphome /config/esphome dashboard --socket /var/run/esphome.sock --hassio diff --git a/esphomeyaml-edge/rootfs/etc/services.d/nginx/finish b/docker/rootfs/etc/services.d/nginx/finish similarity index 89% rename from esphomeyaml-edge/rootfs/etc/services.d/nginx/finish rename to docker/rootfs/etc/services.d/nginx/finish index e0c2ac25ef..953f3771e0 100644 --- a/esphomeyaml-edge/rootfs/etc/services.d/nginx/finish +++ b/docker/rootfs/etc/services.d/nginx/finish @@ -1,6 +1,6 @@ #!/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 # ============================================================================== if -n { s6-test $# -ne 0 } diff --git a/esphomeyaml-edge/rootfs/etc/services.d/nginx/run b/docker/rootfs/etc/services.d/nginx/run similarity index 89% rename from esphomeyaml-edge/rootfs/etc/services.d/nginx/run rename to docker/rootfs/etc/services.d/nginx/run index 51c18ab9a9..ab7e5db542 100644 --- a/esphomeyaml-edge/rootfs/etc/services.d/nginx/run +++ b/docker/rootfs/etc/services.d/nginx/run @@ -1,6 +1,6 @@ #!/usr/bin/with-contenv bash # ============================================================================== -# Community Hass.io Add-ons: esphomeyaml +# Community Hass.io Add-ons: ESPHome # Runs the NGINX proxy # ============================================================================== # shellcheck disable=SC1091 diff --git a/esphomeyaml/__init__.py b/esphome/__init__.py similarity index 100% rename from esphomeyaml/__init__.py rename to esphome/__init__.py diff --git a/esphomeyaml/__main__.py b/esphome/__main__.py similarity index 89% rename from esphomeyaml/__main__.py rename to esphome/__main__.py index 26f42c14a2..1ba779d11d 100644 --- a/esphomeyaml/__main__.py +++ b/esphome/__main__.py @@ -8,22 +8,22 @@ import os import random import sys -from esphomeyaml import const, core_config, mqtt, platformio_api, wizard, writer, yaml_util -from esphomeyaml.api.client import run_logs -from esphomeyaml.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, \ - CONF_BROKER -from esphomeyaml.core import CORE, EsphomeyamlError -from esphomeyaml.cpp_generator import Expression, RawStatement, add, statement -from esphomeyaml.helpers import color, indent -from esphomeyaml.py_compat import safe_input, text_type, IS_PY2 -from esphomeyaml.storage_json import StorageJSON, esphomeyaml_storage_path, \ +from esphome import const, core_config, mqtt, platformio_api, wizard, writer, yaml_util +from esphome.api.client import run_logs +from esphome.config import get_component, iter_components, read_config, strip_default_ids +from esphome.const import CONF_BAUD_RATE, CONF_BROKER, CONF_ESPHOME, CONF_LOGGER, \ + CONF_USE_CUSTOM_CODE +from esphome.core import CORE, EsphomeError +from esphome.cpp_generator import Expression, RawStatement, add, statement +from esphome.helpers import color, indent +from esphome.py_compat import IS_PY2, safe_input, text_type +from esphome.storage_json import StorageJSON, esphome_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__) -PRE_INITIALIZE = ['esphomeyaml', 'logger', 'wifi', 'ethernet', 'ota', 'mqtt', 'web_server', 'api', +PRE_INITIALIZE = ['esphome', 'logger', 'wifi', 'ethernet', 'ota', 'mqtt', 'web_server', 'api', 'i2c'] @@ -127,9 +127,9 @@ def run_miniterm(config, port): def write_cpp(config): _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: - if domain == CONF_ESPHOMEYAML or domain not in config: + if domain == CONF_ESPHOME or domain not in config: continue CORE.add_job(get_component(domain).to_code, config[domain], domain=domain) @@ -143,7 +143,7 @@ def write_cpp(config): add(RawStatement('')) all_code = [] 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: continue all_code.append(text_type(statement(exp))) @@ -157,9 +157,9 @@ def write_cpp(config): def compile_program(args, config): _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: - 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) if update_check: thread.join() @@ -167,13 +167,16 @@ def compile_program(args, config): def upload_using_esptool(config, port): - import esptool - path = os.path.join(CORE.build_path, '.pioenvs', CORE.name, 'firmware.bin') cmd = ['esptool.py', '--before', 'default_reset', '--after', 'hard_reset', '--chip', 'esp8266', '--port', port, 'write_flash', '0x0', path] - # pylint: disable=protected-access - return run_external_command(esptool._main, *cmd) + + if os.environ.get('ESPHOME_USE_SUBPROCESS') is None: + import esptool + # pylint: disable=protected-access + return run_external_command(esptool._main, *cmd) + + return run_external_process(*cmd) def upload_program(config, args, host): @@ -183,13 +186,13 @@ def upload_program(config, args, host): return upload_using_esptool(config, host) return platformio_api.run_upload(config, args.verbose, host) - from esphomeyaml.components import ota - from esphomeyaml import espota2 + from esphome.components import ota + from esphome import espota2 if args.host_port is not None: host_port = args.host_port 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 remote_port = ota.get_port(config) @@ -212,7 +215,7 @@ def upload_program(config, args, host): def show_logs(config, args, port): if 'logger' not in config: - raise EsphomeyamlError("Logger is not configured!") + raise EsphomeError("Logger is not configured!") if get_port_type(port) == 'SERIAL': run_miniterm(config, port) return 0 @@ -342,7 +345,7 @@ def command_clean(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("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): - from esphomeyaml.dashboard import dashboard + from esphome.dashboard import dashboard return dashboard.start_web_server(args) @@ -389,8 +392,8 @@ POST_CONFIG_ACTIONS = { def parse_args(argv): - parser = argparse.ArgumentParser(prog='esphomeyaml') - parser.add_argument('-v', '--verbose', help="Enable verbose esphomeyaml logs.", + parser = argparse.ArgumentParser(prog='esphome') + parser.add_argument('-v', '--verbose', help="Enable verbose esphome logs.", action='store_true') parser.add_argument('--dashboard', help="Internal flag to set if the command is run from the " "dashboard.", action='store_true') @@ -441,11 +444,11 @@ def parse_args(argv): parser_clean.add_argument('--client-id', help='Manually set the client id.') 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('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.") @@ -458,7 +461,7 @@ def parse_args(argv): dashboard.add_argument("--open-ui", help="Open the dashboard UI in a browser.", action='store_true') 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.", action="store_true") dashboard.add_argument("--socket", @@ -471,7 +474,7 @@ def parse_args(argv): return parser.parse_args(argv[1:]) -def run_esphomeyaml(argv): +def run_esphome(argv): args = parse_args(argv) CORE.dashboard = args.dashboard @@ -479,7 +482,7 @@ def run_esphomeyaml(argv): if args.command in PRE_CONFIG_ACTIONS: try: return PRE_CONFIG_ACTIONS[args.command](args) - except EsphomeyamlError as e: + except EsphomeError as e: _LOGGER.error(e) return 1 @@ -493,7 +496,7 @@ def run_esphomeyaml(argv): if args.command in POST_CONFIG_ACTIONS: try: return POST_CONFIG_ACTIONS[args.command](args, config) - except EsphomeyamlError as e: + except EsphomeError as e: _LOGGER.error(e) return 1 safe_print(u"Unknown command {}".format(args.command)) @@ -502,8 +505,8 @@ def run_esphomeyaml(argv): def main(): try: - return run_esphomeyaml(sys.argv) - except EsphomeyamlError as e: + return run_esphome(sys.argv) + except EsphomeError as e: _LOGGER.error(e) return 1 except KeyboardInterrupt: diff --git a/esphomeyaml/api/__init__.py b/esphome/api/__init__.py similarity index 100% rename from esphomeyaml/api/__init__.py rename to esphome/api/__init__.py diff --git a/esphomeyaml/api/api.proto b/esphome/api/api.proto similarity index 99% rename from esphomeyaml/api/api.proto rename to esphome/api/api.proto index bde079be16..37cb792959 100644 --- a/esphomeyaml/api/api.proto +++ b/esphome/api/api.proto @@ -92,7 +92,7 @@ message DeviceInfoResponse { // 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. - // 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; // The model of the board. For example NodeMCU diff --git a/esphomeyaml/api/api_pb2.py b/esphome/api/api_pb2.py similarity index 100% rename from esphomeyaml/api/api_pb2.py rename to esphome/api/api_pb2.py diff --git a/esphomeyaml/api/client.py b/esphome/api/client.py similarity index 93% rename from esphomeyaml/api/client.py rename to esphome/api/client.py index 446de042b5..148dadc470 100644 --- a/esphomeyaml/api/client.py +++ b/esphome/api/client.py @@ -9,18 +9,18 @@ import time from typing import Optional # noqa from google.protobuf import message # noqa -from esphomeyaml import const -import esphomeyaml.api.api_pb2 as pb -from esphomeyaml.const import CONF_PASSWORD, CONF_PORT -from esphomeyaml.core import EsphomeyamlError -from esphomeyaml.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 esphomeyaml.util import safe_print +from esphome import const +import esphome.api.api_pb2 as pb +from esphome.const import CONF_PASSWORD, CONF_PORT +from esphome.core import EsphomeError +from esphome.helpers import resolve_ip_address, indent, color +from esphome.py_compat import text_type, IS_PY2, byte_to_bytes, char_to_byte, format_bytes +from esphome.util import safe_print _LOGGER = logging.getLogger(__name__) -class APIConnectionError(EsphomeyamlError): +class APIConnectionError(EsphomeError): pass @@ -179,11 +179,11 @@ class APIClient(threading.Thread): try: 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?", self._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) _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() hello = pb.HelloRequest() - hello.client_info = 'esphomeyaml v{}'.format(const.__version__) + hello.client_info = 'ESPHome v{}'.format(const.__version__) try: resp = self._send_message_await_response(hello, pb.HelloResponse) except APIConnectionError as err: @@ -423,12 +423,14 @@ def run_logs(config, address): conf = config['api'] port = conf[CONF_PORT] 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) stopping = False retry_timer = [] + has_connects = [] + def try_connect(tries=0, is_disconnect=True): if stopping: return @@ -451,8 +453,13 @@ def run_logs(config, address): return wait_time = min(2**tries, 300) - _LOGGER.warning(u"Couldn't connect to API (%s). Trying to reconnect in %s seconds", - error, wait_time) + 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", + error, wait_time) timer = threading.Timer(wait_time, functools.partial(try_connect, tries + 1, is_disconnect)) timer.start() retry_timer.append(timer) @@ -465,8 +472,6 @@ def run_logs(config, address): 'TCP buffer - This is only cosmetic)') safe_print(time_ + text) - has_connects = [] - def on_login(): try: cli.subscribe_logs(on_log, dump_config=not has_connects) diff --git a/esphomeyaml/automation.py b/esphome/automation.py similarity index 85% rename from esphomeyaml/automation.py rename to esphome/automation.py index fff90e3824..7e880d1ea7 100644 --- a/esphomeyaml/automation.py +++ b/esphome/automation.py @@ -2,16 +2,16 @@ import copy import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ABOVE, CONF_ACTION_ID, CONF_AND, CONF_AUTOMATION_ID, \ +import esphome.config_validation as cv +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_LAMBDA, CONF_OR, CONF_RANGE, CONF_THEN, CONF_TRIGGER_ID, CONF_WHILE -from esphomeyaml.core import CORE -from esphomeyaml.cpp_generator import ArrayInitializer, Pvariable, TemplateArguments, add, \ - get_variable, process_lambda, templatable -from esphomeyaml.cpp_types import Action, App, Component, PollingComponent, Trigger, \ - esphomelib_ns, float_, uint32, void, bool_ -from esphomeyaml.util import ServiceRegistry + CONF_LAMBDA, CONF_OR, CONF_RANGE, CONF_THEN, CONF_TRIGGER_ID, CONF_WHILE, CONF_WAIT_UNTIL +from esphome.core import CORE +from esphome.cpp_generator import Pvariable, TemplateArguments, add, get_variable, \ + process_lambda, templatable +from esphome.cpp_types import Action, App, Component, PollingComponent, Trigger, bool_, \ + esphome_ns, float_, uint32, void +from esphome.util import ServiceRegistry def maybe_simple_id(*validators): @@ -98,18 +98,19 @@ ACTION_REGISTRY = ServiceRegistry() CONDITION_REGISTRY = ServiceRegistry() # pylint: disable=invalid-name -DelayAction = esphomelib_ns.class_('DelayAction', Action, Component) -LambdaAction = esphomelib_ns.class_('LambdaAction', Action) -IfAction = esphomelib_ns.class_('IfAction', Action) -WhileAction = esphomelib_ns.class_('WhileAction', Action) -UpdateComponentAction = esphomelib_ns.class_('UpdateComponentAction', Action) -Automation = esphomelib_ns.class_('Automation') +DelayAction = esphome_ns.class_('DelayAction', Action, Component) +LambdaAction = esphome_ns.class_('LambdaAction', Action) +IfAction = esphome_ns.class_('IfAction', Action) +WhileAction = esphome_ns.class_('WhileAction', Action) +WaitUntilAction = esphome_ns.class_('WaitUntilAction', Action, Component) +UpdateComponentAction = esphome_ns.class_('UpdateComponentAction', Action) +Automation = esphome_ns.class_('Automation') -Condition = esphomelib_ns.class_('Condition') -AndCondition = esphomelib_ns.class_('AndCondition', Condition) -OrCondition = esphomelib_ns.class_('OrCondition', Condition) -RangeCondition = esphomelib_ns.class_('RangeCondition', Condition) -LambdaCondition = esphomelib_ns.class_('LambdaCondition', Condition) +Condition = esphome_ns.class_('Condition') +AndCondition = esphome_ns.class_('AndCondition', Condition) +OrCondition = esphome_ns.class_('OrCondition', Condition) +RangeCondition = esphome_ns.class_('RangeCondition', Condition) +LambdaCondition = esphome_ns.class_('LambdaCondition', Condition) 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 return [schema({CONF_THEN: value})] 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 try: return vol.Schema([schema])(value) @@ -265,6 +269,29 @@ def while_action_to_code(config, action_id, arg_type, template_arg): 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_ @@ -318,11 +345,10 @@ def build_action(full_config, arg_type): def build_actions(config, arg_type): actions = [] for conf in config: - action = None for action in build_action(conf, arg_type): yield None actions.append(action) - yield ArrayInitializer(*actions, multiline=False) + yield actions 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): yield None conditions.append(condition) - yield ArrayInitializer(*conditions, multiline=False) + yield conditions def build_automation_(trigger, arg_type, config): diff --git a/esphomeyaml/components/__init__.py b/esphome/components/__init__.py similarity index 100% rename from esphomeyaml/components/__init__.py rename to esphome/components/__init__.py diff --git a/esphomeyaml/components/ads1115.py b/esphome/components/ads1115.py similarity index 64% rename from esphomeyaml/components/ads1115.py rename to esphome/components/ads1115.py index 70be84ae7f..0bf25125b1 100644 --- a/esphomeyaml/components/ads1115.py +++ b/esphome/components/ads1115.py @@ -1,11 +1,11 @@ import voluptuous as vol -from esphomeyaml.components import i2c, sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ADDRESS, CONF_ID -from esphomeyaml.cpp_generator import Pvariable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Component +from esphome.components import i2c, sensor +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_ID +from esphome.cpp_generator import Pvariable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Component DEPENDENCIES = ['i2c'] MULTI_CONF = True diff --git a/esphomeyaml/components/apds9960.py b/esphome/components/apds9960.py similarity index 67% rename from esphomeyaml/components/apds9960.py rename to esphome/components/apds9960.py index e9f7782b43..bebe71e3fa 100644 --- a/esphomeyaml/components/apds9960.py +++ b/esphome/components/apds9960.py @@ -1,11 +1,11 @@ import voluptuous as vol -from esphomeyaml.components import i2c, sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ADDRESS, CONF_ID, CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, PollingComponent +from esphome.components import i2c, sensor +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_ID, CONF_UPDATE_INTERVAL +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, PollingComponent DEPENDENCIES = ['i2c'] MULTI_CONF = True diff --git a/esphomeyaml/components/api.py b/esphome/components/api.py similarity index 78% rename from esphomeyaml/components/api.py rename to esphome/components/api.py index eb8bc3b682..3acf0b9143 100644 --- a/esphomeyaml/components/api.py +++ b/esphome/components/api.py @@ -1,15 +1,15 @@ import voluptuous as vol -from esphomeyaml.automation import ACTION_REGISTRY -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_DATA, CONF_DATA_TEMPLATE, CONF_ID, CONF_PASSWORD, CONF_PORT, \ - CONF_SERVICE, CONF_VARIABLES, CONF_REBOOT_TIMEOUT -from esphomeyaml.core import CORE -from esphomeyaml.cpp_generator import ArrayInitializer, Pvariable, add, get_variable, process_lambda -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import Action, App, Component, StoringController, esphomelib_ns +from esphome.automation import ACTION_REGISTRY +import esphome.config_validation as cv +from esphome.const import CONF_DATA, CONF_DATA_TEMPLATE, CONF_ID, CONF_PASSWORD, CONF_PORT, \ + CONF_REBOOT_TIMEOUT, CONF_SERVICE, CONF_VARIABLES +from esphome.core import CORE +from esphome.cpp_generator import Pvariable, add, get_variable, process_lambda +from esphome.cpp_helpers import setup_component +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) HomeAssistantServiceCallAction = api_ns.class_('HomeAssistantServiceCallAction', Action) 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])) if CONF_DATA in config: 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: 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: datas = [] for key, value in config[CONF_VARIABLES].items(): for value_ in process_lambda(value, []): yield None datas.append(TemplatableKeyValuePair(key, value_)) - add(act.set_variables(ArrayInitializer(*datas))) + add(act.set_variables(datas)) yield act diff --git a/esphomeyaml/components/binary_sensor/__init__.py b/esphome/components/binary_sensor/__init__.py similarity index 86% rename from esphomeyaml/components/binary_sensor/__init__.py rename to esphome/components/binary_sensor/__init__.py index 6e08acd9d6..2cb2b2ef15 100644 --- a/esphomeyaml/components/binary_sensor/__init__.py +++ b/esphome/components/binary_sensor/__init__.py @@ -1,21 +1,19 @@ import voluptuous as vol -from esphomeyaml import automation, core -from esphomeyaml.automation import maybe_simple_id, CONDITION_REGISTRY, Condition -from esphomeyaml.components import mqtt -from esphomeyaml.components.mqtt import setup_mqtt_component -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_DELAYED_OFF, CONF_DELAYED_ON, CONF_DEVICE_CLASS, CONF_FILTERS, \ +from esphome import automation, core +from esphome.automation import CONDITION_REGISTRY, Condition, maybe_simple_id +from esphome.components import mqtt +from esphome.components.mqtt import setup_mqtt_component +import esphome.config_validation as cv +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_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_TIMING, CONF_TRIGGER_ID, CONF_ON_STATE -from esphomeyaml.core import CORE -from esphomeyaml.cpp_generator import process_lambda, ArrayInitializer, add, Pvariable, \ - StructInitializer, get_variable -from esphomeyaml.cpp_types import esphomelib_ns, Nameable, Trigger, NoArg, Component, App, bool_, \ - optional -from esphomeyaml.py_compat import string_types + CONF_ON_DOUBLE_CLICK, CONF_ON_MULTI_CLICK, CONF_ON_PRESS, CONF_ON_RELEASE, CONF_ON_STATE, \ + CONF_STATE, CONF_TIMING, CONF_TRIGGER_ID +from esphome.core import CORE +from esphome.cpp_generator import Pvariable, StructInitializer, add, get_variable, process_lambda +from esphome.cpp_types import App, Component, Nameable, NoArg, Trigger, bool_, esphome_ns, optional +from esphome.py_compat import string_types DEVICE_CLASSES = [ '', '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) BinarySensorPtr = BinarySensor.operator('ptr') 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) LambdaFilter = binary_sensor_ns.class_('LambdaFilter', Filter) - FILTER_KEYS = [CONF_INVERT, CONF_DELAYED_ON, CONF_DELAYED_OFF, CONF_LAMBDA, CONF_HEARTBEAT] FILTERS_SCHEMA = cv.ensure_list({ vol.Optional(CONF_INVERT): None, vol.Optional(CONF_DELAYED_ON): 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_HEARTBEAT): cv.invalid("The heartbeat filter has been removed in 1.11.0"), }, cv.has_exactly_one_key(*FILTER_KEYS)) MULTI_CLICK_TIMING_SCHEMA = vol.Schema({ @@ -191,7 +189,7 @@ BINARY_SENSOR_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend({ vol.Optional(CONF_INVERTED): cv.invalid( "The inverted binary_sensor property has been replaced by the " "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])) elif CONF_DELAYED_ON in config: 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: for lambda_ in process_lambda(config[CONF_LAMBDA], [(bool_, 'x')], return_type=optional.template(bool_)): @@ -217,14 +213,13 @@ def setup_filter(config): def setup_filters(config): filters = [] for conf in config: - filter = None for filter in setup_filter(conf): yield None 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: add(binary_sensor_var.set_internal(CONF_INTERNAL)) 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: add(binary_sensor_var.set_inverted(config[CONF_INVERTED])) if CONF_FILTERS in config: - filters = None for filters in setup_filters(config[CONF_FILTERS]): yield 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]), ('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)) trigger = Pvariable(conf[CONF_TRIGGER_ID], rhs) 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) 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): - binary_sensor_var = Pvariable(config[CONF_ID], binary_sensor_obj, - has_side_effects=False) - mqtt_var = Pvariable(config[CONF_MQTT_ID], mqtt_obj, - has_side_effects=False) - CORE.add_job(setup_binary_sensor_core_, binary_sensor_var, mqtt_var, config) +def setup_binary_sensor(binary_sensor_obj, config): + if not CORE.has_id(config[CONF_ID]): + binary_sensor_obj = Pvariable(config[CONF_ID], binary_sensor_obj, has_side_effects=True) + CORE.add_job(setup_binary_sensor_core_, binary_sensor_obj, config) def register_binary_sensor(var, config): binary_sensor_var = Pvariable(config[CONF_ID], var, has_side_effects=True) - rhs = 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, mqtt_var, config) + add(App.register_binary_sensor(binary_sensor_var)) + CORE.add_job(setup_binary_sensor_core_, binary_sensor_var, config) def core_to_hass_config(data, config): @@ -309,7 +299,6 @@ def core_to_hass_config(data, config): BUILD_FLAGS = '-DUSE_BINARY_SENSOR' - CONF_BINARY_SENSOR_IS_ON = 'binary_sensor.is_on' BINARY_SENSOR_IS_ON_CONDITION_SCHEMA = maybe_simple_id({ vol.Required(CONF_ID): cv.use_variable_id(BinarySensor), diff --git a/esphomeyaml/components/binary_sensor/apds9960.py b/esphome/components/binary_sensor/apds9960.py similarity index 78% rename from esphomeyaml/components/binary_sensor/apds9960.py rename to esphome/components/binary_sensor/apds9960.py index 11444bce88..ba394f954e 100644 --- a/esphomeyaml/components/binary_sensor/apds9960.py +++ b/esphome/components/binary_sensor/apds9960.py @@ -1,10 +1,10 @@ import voluptuous as vol -from esphomeyaml.components import binary_sensor, sensor -from esphomeyaml.components.apds9960 import APDS9960, CONF_APDS9960_ID -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_DIRECTION, CONF_NAME -from esphomeyaml.cpp_generator import get_variable +from esphome.components import binary_sensor, sensor +from esphome.components.apds9960 import APDS9960, CONF_APDS9960_ID +import esphome.config_validation as cv +from esphome.const import CONF_DIRECTION, CONF_NAME +from esphome.cpp_generator import get_variable DEPENDENCIES = ['apds9960'] APDS9960GestureDirectionBinarySensor = sensor.sensor_ns.class_( diff --git a/esphomeyaml/components/binary_sensor/custom.py b/esphome/components/binary_sensor/custom.py similarity index 67% rename from esphomeyaml/components/binary_sensor/custom.py rename to esphome/components/binary_sensor/custom.py index c170793b99..a2b907aaed 100644 --- a/esphomeyaml/components/binary_sensor/custom.py +++ b/esphome/components/binary_sensor/custom.py @@ -1,10 +1,10 @@ import voluptuous as vol -from esphomeyaml.components import binary_sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_BINARY_SENSORS, CONF_ID, CONF_LAMBDA -from esphomeyaml.cpp_generator import process_lambda, variable -from esphomeyaml.cpp_types import std_vector +from esphome.components import binary_sensor +import esphome.config_validation as cv +from esphome.const import CONF_BINARY_SENSORS, CONF_ID, CONF_LAMBDA, CONF_NAME +from esphome.cpp_generator import add, process_lambda, variable +from esphome.cpp_types import std_vector CustomBinarySensorConstructor = binary_sensor.binary_sensor_ns.class_( 'CustomBinarySensorConstructor') @@ -26,8 +26,10 @@ def to_code(config): rhs = CustomBinarySensorConstructor(template_) custom = variable(config[CONF_ID], rhs) - for i, sens in enumerate(config[CONF_BINARY_SENSORS]): - binary_sensor.register_binary_sensor(custom.get_binary_sensor(i), sens) + for i, conf in enumerate(config[CONF_BINARY_SENSORS]): + 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' diff --git a/esphomeyaml/components/binary_sensor/esp32_ble_tracker.py b/esphome/components/binary_sensor/esp32_ble_tracker.py similarity index 61% rename from esphomeyaml/components/binary_sensor/esp32_ble_tracker.py rename to esphome/components/binary_sensor/esp32_ble_tracker.py index 25c389e2cd..6a66184b47 100644 --- a/esphomeyaml/components/binary_sensor/esp32_ble_tracker.py +++ b/esphome/components/binary_sensor/esp32_ble_tracker.py @@ -1,15 +1,15 @@ import voluptuous as vol -from esphomeyaml.components import binary_sensor -from esphomeyaml.components.esp32_ble_tracker import CONF_ESP32_BLE_ID, ESP32BLETracker, \ +from esphome.components import binary_sensor +from esphome.components.esp32_ble_tracker import CONF_ESP32_BLE_ID, ESP32BLETracker, \ make_address_array -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_MAC_ADDRESS, CONF_NAME -from esphomeyaml.cpp_generator import get_variable -from esphomeyaml.cpp_types import esphomelib_ns +import esphome.config_validation as cv +from esphome.const import CONF_MAC_ADDRESS, CONF_NAME +from esphome.cpp_generator import get_variable +from esphome.cpp_types import esphome_ns 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({ 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): - hub = None for hub in get_variable(config[CONF_ESP32_BLE_ID]): yield rhs = hub.make_presence_sensor(config[CONF_NAME], make_address_array(config[CONF_MAC_ADDRESS])) diff --git a/esphomeyaml/components/binary_sensor/esp32_touch.py b/esphome/components/binary_sensor/esp32_touch.py similarity index 80% rename from esphomeyaml/components/binary_sensor/esp32_touch.py rename to esphome/components/binary_sensor/esp32_touch.py index 6c90846276..ecaa30605f 100644 --- a/esphomeyaml/components/binary_sensor/esp32_touch.py +++ b/esphome/components/binary_sensor/esp32_touch.py @@ -1,12 +1,12 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml.components import binary_sensor -from esphomeyaml.components.esp32_touch import ESP32TouchComponent -from esphomeyaml.const import CONF_NAME, CONF_PIN, CONF_THRESHOLD, ESP_PLATFORM_ESP32 -from esphomeyaml.cpp_generator import get_variable -from esphomeyaml.cpp_types import global_ns -from esphomeyaml.pins import validate_gpio_pin +from esphome.components import binary_sensor +from esphome.components.esp32_touch import ESP32TouchComponent +import esphome.config_validation as cv +from esphome.const import CONF_NAME, CONF_PIN, CONF_THRESHOLD, ESP_PLATFORM_ESP32 +from esphome.cpp_generator import get_variable +from esphome.cpp_types import global_ns +from esphome.pins import validate_gpio_pin ESP_PLATFORMS = [ESP_PLATFORM_ESP32] diff --git a/esphomeyaml/components/binary_sensor/gpio.py b/esphome/components/binary_sensor/gpio.py similarity index 55% rename from esphomeyaml/components/binary_sensor/gpio.py rename to esphome/components/binary_sensor/gpio.py index feb470d299..361796fa7e 100644 --- a/esphomeyaml/components/binary_sensor/gpio.py +++ b/esphome/components/binary_sensor/gpio.py @@ -1,21 +1,19 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml import pins -from esphomeyaml.components import binary_sensor -from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_PIN -from esphomeyaml.cpp_generator import variable -from esphomeyaml.cpp_helpers import gpio_input_pin_expression, setup_component -from esphomeyaml.cpp_types import Application, Component, App +from esphome import pins +from esphome.components import binary_sensor +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_NAME, CONF_PIN +from esphome.cpp_generator import Pvariable +from esphome.cpp_helpers import gpio_input_pin_expression, setup_component +from esphome.cpp_types import App, Component -MakeGPIOBinarySensor = Application.struct('MakeGPIOBinarySensor') GPIOBinarySensorComponent = binary_sensor.binary_sensor_ns.class_('GPIOBinarySensorComponent', binary_sensor.BinarySensor, Component) PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({ 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 }).extend(cv.COMPONENT_SCHEMA.schema)) @@ -25,9 +23,9 @@ def to_code(config): for pin in gpio_input_pin_expression(config[CONF_PIN]): yield rhs = App.make_gpio_binary_sensor(config[CONF_NAME], pin) - gpio = variable(config[CONF_MAKE_ID], rhs) - binary_sensor.setup_binary_sensor(gpio.Pgpio, gpio.Pmqtt, config) - setup_component(gpio.Pgpio, config) + gpio = Pvariable(config[CONF_ID], rhs) + binary_sensor.setup_binary_sensor(gpio, config) + setup_component(gpio, config) BUILD_FLAGS = '-DUSE_GPIO_BINARY_SENSOR' diff --git a/esphome/components/binary_sensor/homeassistant.py b/esphome/components/binary_sensor/homeassistant.py new file mode 100644 index 0000000000..4b5f78335d --- /dev/null +++ b/esphome/components/binary_sensor/homeassistant.py @@ -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) diff --git a/esphomeyaml/components/binary_sensor/nextion.py b/esphome/components/binary_sensor/nextion.py similarity index 76% rename from esphomeyaml/components/binary_sensor/nextion.py rename to esphome/components/binary_sensor/nextion.py index ff4e9d34d2..fde96b76c2 100644 --- a/esphomeyaml/components/binary_sensor/nextion.py +++ b/esphome/components/binary_sensor/nextion.py @@ -1,10 +1,10 @@ import voluptuous as vol -from esphomeyaml.components import binary_sensor, display -from esphomeyaml.components.display.nextion import Nextion -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_COMPONENT_ID, CONF_NAME, CONF_PAGE_ID -from esphomeyaml.cpp_generator import get_variable +from esphome.components import binary_sensor, display +from esphome.components.display.nextion import Nextion +import esphome.config_validation as cv +from esphome.const import CONF_COMPONENT_ID, CONF_NAME, CONF_PAGE_ID +from esphome.cpp_generator import get_variable DEPENDENCIES = ['display'] diff --git a/esphomeyaml/components/binary_sensor/pn532.py b/esphome/components/binary_sensor/pn532.py similarity index 77% rename from esphomeyaml/components/binary_sensor/pn532.py rename to esphome/components/binary_sensor/pn532.py index f0681ff6d7..4f4e159e87 100644 --- a/esphomeyaml/components/binary_sensor/pn532.py +++ b/esphome/components/binary_sensor/pn532.py @@ -1,11 +1,11 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml.components import binary_sensor -from esphomeyaml.components.pn532 import PN532Component -from esphomeyaml.const import CONF_NAME, CONF_UID -from esphomeyaml.core import HexInt -from esphomeyaml.cpp_generator import get_variable, ArrayInitializer +from esphome.components import binary_sensor +from esphome.components.pn532 import PN532Component +import esphome.config_validation as cv +from esphome.const import CONF_NAME, CONF_UID +from esphome.core import HexInt +from esphome.cpp_generator import get_variable DEPENDENCIES = ['pn532'] @@ -41,7 +41,7 @@ def to_code(config): for hub in get_variable(config[CONF_PN532_ID]): yield 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) diff --git a/esphomeyaml/components/binary_sensor/rdm6300.py b/esphome/components/binary_sensor/rdm6300.py similarity index 80% rename from esphomeyaml/components/binary_sensor/rdm6300.py rename to esphome/components/binary_sensor/rdm6300.py index 24aa69f0fa..0041ea6d0b 100644 --- a/esphomeyaml/components/binary_sensor/rdm6300.py +++ b/esphome/components/binary_sensor/rdm6300.py @@ -1,9 +1,9 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml.components import binary_sensor, rdm6300 -from esphomeyaml.const import CONF_NAME, CONF_UID -from esphomeyaml.cpp_generator import get_variable +from esphome.components import binary_sensor, rdm6300 +import esphome.config_validation as cv +from esphome.const import CONF_NAME, CONF_UID +from esphome.cpp_generator import get_variable DEPENDENCIES = ['rdm6300'] diff --git a/esphomeyaml/components/binary_sensor/remote_receiver.py b/esphome/components/binary_sensor/remote_receiver.py similarity index 73% rename from esphomeyaml/components/binary_sensor/remote_receiver.py rename to esphome/components/binary_sensor/remote_receiver.py index f189a2225b..1089eb4da4 100644 --- a/esphomeyaml/components/binary_sensor/remote_receiver.py +++ b/esphome/components/binary_sensor/remote_receiver.py @@ -1,42 +1,60 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml.components import binary_sensor -from esphomeyaml.components.remote_receiver import RemoteReceiverComponent, remote_ns -from esphomeyaml.components.remote_transmitter import RC_SWITCH_RAW_SCHEMA, \ +from esphome.components import binary_sensor +from esphome.components.remote_receiver import RemoteReceiverComponent, remote_ns +from esphome.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_D_SCHEMA, binary_code, build_rc_switch_protocol -from esphomeyaml.const import CONF_ADDRESS, CONF_CHANNEL, CONF_CODE, CONF_COMMAND, CONF_DATA, \ - CONF_DEVICE, CONF_FAMILY, CONF_GROUP, CONF_LG, CONF_NAME, CONF_NBITS, CONF_NEC, \ - CONF_PANASONIC, CONF_PROTOCOL, CONF_RAW, CONF_RC_SWITCH_RAW, CONF_RC_SWITCH_TYPE_A, \ +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_CHANNEL, CONF_CODE, CONF_COMMAND, CONF_DATA, \ + 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_STATE -from esphomeyaml.cpp_generator import ArrayInitializer, get_variable, Pvariable + CONF_STATE, CONF_RC5 +from esphome.cpp_generator import Pvariable, get_variable, progmem_array +from esphome.cpp_types import int32 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_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_RECEIVER_ID = 'receiver_id' RemoteReceiver = remote_ns.class_('RemoteReceiver', binary_sensor.BinarySensor) +JVCReceiver = remote_ns.class_('JVCReceiver', RemoteReceiver) LGReceiver = remote_ns.class_('LGReceiver', RemoteReceiver) NECReceiver = remote_ns.class_('NECReceiver', RemoteReceiver) PanasonicReceiver = remote_ns.class_('PanasonicReceiver', RemoteReceiver) RawReceiver = remote_ns.class_('RawReceiver', RemoteReceiver) SamsungReceiver = remote_ns.class_('SamsungReceiver', RemoteReceiver) SonyReceiver = remote_ns.class_('SonyReceiver', RemoteReceiver) +RC5Receiver = remote_ns.class_('RC5Receiver', RemoteReceiver) RCSwitchRawReceiver = remote_ns.class_('RCSwitchRawReceiver', RemoteReceiver) RCSwitchTypeAReceiver = remote_ns.class_('RCSwitchTypeAReceiver', RCSwitchRawReceiver) RCSwitchTypeBReceiver = remote_ns.class_('RCSwitchTypeBReceiver', RCSwitchRawReceiver) RCSwitchTypeCReceiver = remote_ns.class_('RCSwitchTypeCReceiver', 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({ 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.Required(CONF_DATA): cv.hex_uint32_t, 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_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_TYPE_A): RC_SWITCH_TYPE_A_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): name = full_config[CONF_NAME] 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: return LGReceiver.new(name, config[CONF_DATA], config[CONF_NBITS]) if key == CONF_NEC: @@ -81,9 +105,11 @@ def receiver_base(full_config): return SamsungReceiver.new(name, config[CONF_DATA]) if key == CONF_SONY: 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: - data = ArrayInitializer(*config, multiline=False) - return RawReceiver.new(name, data) + arr = progmem_array(config[CONF_ID], config[CONF_DATA]) + return RawReceiver.new(name, arr, len(config[CONF_DATA])) if key == CONF_RC_SWITCH_RAW: return RCSwitchRawReceiver.new(name, build_rc_switch_protocol(config[CONF_PROTOCOL]), binary_code(config[CONF_CODE]), len(config[CONF_CODE])) diff --git a/esphomeyaml/components/binary_sensor/status.py b/esphome/components/binary_sensor/status.py similarity index 50% rename from esphomeyaml/components/binary_sensor/status.py rename to esphome/components/binary_sensor/status.py index 93e11dd24b..f879d9c346 100644 --- a/esphomeyaml/components/binary_sensor/status.py +++ b/esphome/components/binary_sensor/status.py @@ -1,27 +1,24 @@ -import esphomeyaml.config_validation as cv -from esphomeyaml.components import binary_sensor -from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME -from esphomeyaml.cpp_generator import variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import Application, Component, App +from esphome.components import binary_sensor +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_NAME +from esphome.cpp_generator import Pvariable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Component - -MakeStatusBinarySensor = Application.struct('MakeStatusBinarySensor') StatusBinarySensor = binary_sensor.binary_sensor_ns.class_('StatusBinarySensor', binary_sensor.BinarySensor, Component) 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), }).extend(cv.COMPONENT_SCHEMA.schema)) def to_code(config): rhs = App.make_status_binary_sensor(config[CONF_NAME]) - status = variable(config[CONF_MAKE_ID], rhs) - binary_sensor.setup_binary_sensor(status.Pstatus, status.Pmqtt, config) - setup_component(status.Pstatus, config) + status = Pvariable(config[CONF_ID], rhs) + binary_sensor.setup_binary_sensor(status, config) + setup_component(status, config) BUILD_FLAGS = '-DUSE_STATUS_BINARY_SENSOR' diff --git a/esphome/components/binary_sensor/template.py b/esphome/components/binary_sensor/template.py new file mode 100644 index 0000000000..a02709626d --- /dev/null +++ b/esphome/components/binary_sensor/template.py @@ -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) diff --git a/esphomeyaml/components/cover/__init__.py b/esphome/components/cover/__init__.py similarity index 75% rename from esphomeyaml/components/cover/__init__.py rename to esphome/components/cover/__init__.py index 1ff00054e6..48c9dc90fa 100644 --- a/esphomeyaml/components/cover/__init__.py +++ b/esphome/components/cover/__init__.py @@ -1,18 +1,19 @@ import voluptuous as vol -from esphomeyaml.automation import ACTION_REGISTRY, maybe_simple_id -from esphomeyaml.components import mqtt -from esphomeyaml.components.mqtt import setup_mqtt_component -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ID, CONF_INTERNAL, CONF_MQTT_ID -from esphomeyaml.cpp_generator import Pvariable, add, get_variable -from esphomeyaml.cpp_types import Action, Nameable, esphomelib_ns +from esphome.automation import ACTION_REGISTRY, maybe_simple_id +from esphome.components import mqtt +from esphome.components.mqtt import setup_mqtt_component +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_INTERNAL, CONF_MQTT_ID +from esphome.core import CORE +from esphome.cpp_generator import Pvariable, add, get_variable +from esphome.cpp_types import Action, Nameable, esphome_ns PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ }) -cover_ns = esphomelib_ns.namespace('cover') +cover_ns = esphome_ns.namespace('cover') Cover = cover_ns.class_('Cover', Nameable) MQTTCoverComponent = cover_ns.class_('MQTTCoverComponent', mqtt.MQTTComponent) @@ -21,6 +22,12 @@ CoverState = cover_ns.class_('CoverState') COVER_OPEN = cover_ns.COVER_OPEN 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 OpenAction = cover_ns.class_('OpenAction', 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) -def setup_cover_core_(cover_var, mqtt_var, config): +def setup_cover_core_(cover_var, config): if CONF_INTERNAL in config: 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): - cover_var = Pvariable(config[CONF_ID], cover_obj, has_side_effects=False) - mqtt_var = Pvariable(config[CONF_MQTT_ID], mqtt_obj, has_side_effects=False) - setup_cover_core_(cover_var, mqtt_var, config) +def setup_cover(cover_obj, config): + CORE.add_job(setup_cover_core_, cover_obj, config) BUILD_FLAGS = '-DUSE_COVER' diff --git a/esphome/components/cover/template.py b/esphome/components/cover/template.py new file mode 100644 index 0000000000..5f278da7bc --- /dev/null +++ b/esphome/components/cover/template.py @@ -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 diff --git a/esphomeyaml/components/custom_component.py b/esphome/components/custom_component.py similarity index 54% rename from esphomeyaml/components/custom_component.py rename to esphome/components/custom_component.py index da85785fb6..2af824f50e 100644 --- a/esphomeyaml/components/custom_component.py +++ b/esphome/components/custom_component.py @@ -1,12 +1,12 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ID, CONF_LAMBDA, CONF_COMPONENTS -from esphomeyaml.cpp_generator import process_lambda, variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import Component, ComponentPtr, esphomelib_ns, std_vector +import esphome.config_validation as cv +from esphome.const import CONF_COMPONENTS, CONF_ID, CONF_LAMBDA +from esphome.cpp_generator import Pvariable, process_lambda, variable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import Component, ComponentPtr, esphome_ns, std_vector -CustomComponentConstructor = esphomelib_ns.class_('CustomComponentConstructor') +CustomComponentConstructor = esphome_ns.class_('CustomComponentConstructor') MULTI_CONF = True CONFIG_SCHEMA = vol.Schema({ @@ -25,8 +25,9 @@ def to_code(config): rhs = CustomComponentConstructor(template_) custom = variable(config[CONF_ID], rhs) - for i, comp in enumerate(config.get(CONF_COMPONENTS, [])): - setup_component(custom.get_component(i), comp) + for i, comp_config in enumerate(config.get(CONF_COMPONENTS, [])): + comp = Pvariable(comp_config[CONF_ID], custom.get_component(i)) + setup_component(comp, comp_config) BUILD_FLAGS = '-DUSE_CUSTOM_COMPONENT' diff --git a/esphomeyaml/components/dallas.py b/esphome/components/dallas.py similarity index 63% rename from esphomeyaml/components/dallas.py rename to esphome/components/dallas.py index 5fc99f8288..7bfc8144fe 100644 --- a/esphomeyaml/components/dallas.py +++ b/esphome/components/dallas.py @@ -1,12 +1,12 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ID, CONF_PIN, CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import Pvariable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, PollingComponent +from esphome import pins +from esphome.components import sensor +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_PIN, CONF_UPDATE_INTERVAL +from esphome.cpp_generator import Pvariable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, PollingComponent DallasComponent = sensor.sensor_ns.class_('DallasComponent', PollingComponent) MULTI_CONF = True diff --git a/esphomeyaml/components/debug.py b/esphome/components/debug.py similarity index 69% rename from esphomeyaml/components/debug.py rename to esphome/components/debug.py index 5751f1517f..1105105914 100644 --- a/esphomeyaml/components/debug.py +++ b/esphome/components/debug.py @@ -1,7 +1,7 @@ import voluptuous as vol -from esphomeyaml.cpp_generator import add -from esphomeyaml.cpp_types import App +from esphome.cpp_generator import add +from esphome.cpp_types import App DEPENDENCIES = ['logger'] diff --git a/esphomeyaml/components/deep_sleep.py b/esphome/components/deep_sleep.py similarity index 79% rename from esphomeyaml/components/deep_sleep.py rename to esphome/components/deep_sleep.py index 7019c4d718..9313130b70 100644 --- a/esphomeyaml/components/deep_sleep.py +++ b/esphome/components/deep_sleep.py @@ -1,12 +1,12 @@ import voluptuous as vol -from esphomeyaml import config_validation as cv, pins -from esphomeyaml.automation import ACTION_REGISTRY, maybe_simple_id -from esphomeyaml.const import CONF_ID, CONF_MODE, CONF_NUMBER, CONF_PINS, CONF_RUN_CYCLES, \ +from esphome import config_validation as cv, pins +from esphome.automation import ACTION_REGISTRY, maybe_simple_id +from esphome.const import CONF_ID, CONF_MODE, CONF_NUMBER, CONF_PINS, CONF_RUN_CYCLES, \ CONF_RUN_DURATION, CONF_SLEEP_DURATION, CONF_WAKEUP_PIN -from esphomeyaml.cpp_generator import Pvariable, StructInitializer, add, get_variable -from esphomeyaml.cpp_helpers import gpio_input_pin_expression, setup_component -from esphomeyaml.cpp_types import Action, App, Component, esphomelib_ns, global_ns +from esphome.cpp_generator import Pvariable, StructInitializer, add, get_variable +from esphome.cpp_helpers import gpio_input_pin_expression, setup_component +from esphome.cpp_types import Action, App, Component, esphome_ns, global_ns def validate_pin_number(value): @@ -17,11 +17,11 @@ def validate_pin_number(value): return value -DeepSleepComponent = esphomelib_ns.class_('DeepSleepComponent', Component) -EnterDeepSleepAction = esphomelib_ns.class_('EnterDeepSleepAction', Action) -PreventDeepSleepAction = esphomelib_ns.class_('PreventDeepSleepAction', Action) +DeepSleepComponent = esphome_ns.class_('DeepSleepComponent', Component) +EnterDeepSleepAction = esphome_ns.class_('EnterDeepSleepAction', Action) +PreventDeepSleepAction = esphome_ns.class_('PreventDeepSleepAction', Action) -WakeupPinMode = esphomelib_ns.enum('WakeupPinMode') +WakeupPinMode = esphome_ns.enum('WakeupPinMode') WAKEUP_PIN_MODES = { 'IGNORE': WakeupPinMode.WAKEUP_PIN_MODE_IGNORE, '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') -Ext1Wakeup = esphomelib_ns.struct('Ext1Wakeup') +Ext1Wakeup = esphome_ns.struct('Ext1Wakeup') EXT1_WAKEUP_MODES = { '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, @@ -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_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_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) @@ -65,8 +68,6 @@ def to_code(config): add(deep_sleep.set_wakeup_pin(pin)) if CONF_WAKEUP_PIN_MODE in config: 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: add(deep_sleep.set_run_duration(config[CONF_RUN_DURATION])) diff --git a/esphome/components/display/__init__.py b/esphome/components/display/__init__.py new file mode 100644 index 0000000000..aa568059c9 --- /dev/null +++ b/esphome/components/display/__init__.py @@ -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' diff --git a/esphomeyaml/components/display/lcd_gpio.py b/esphome/components/display/lcd_gpio.py similarity index 84% rename from esphomeyaml/components/display/lcd_gpio.py rename to esphome/components/display/lcd_gpio.py index c796ed3f28..ac2a781e5f 100644 --- a/esphomeyaml/components/display/lcd_gpio.py +++ b/esphome/components/display/lcd_gpio.py @@ -1,13 +1,13 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import display -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_DATA_PINS, CONF_DIMENSIONS, CONF_ENABLE_PIN, CONF_ID, \ +from esphome import pins +from esphome.components import display +import esphome.config_validation as cv +from esphome.const import CONF_DATA_PINS, CONF_DIMENSIONS, CONF_ENABLE_PIN, CONF_ID, \ CONF_LAMBDA, CONF_RS_PIN, CONF_RW_PIN -from esphomeyaml.cpp_generator import Pvariable, add, process_lambda -from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component -from esphomeyaml.cpp_types import App, PollingComponent, void +from esphome.cpp_generator import Pvariable, add, process_lambda +from esphome.cpp_helpers import gpio_output_pin_expression, setup_component +from esphome.cpp_types import App, PollingComponent, void LCDDisplay = display.display_ns.class_('LCDDisplay', PollingComponent) LCDDisplayRef = LCDDisplay.operator('ref') diff --git a/esphomeyaml/components/display/lcd_pcf8574.py b/esphome/components/display/lcd_pcf8574.py similarity index 71% rename from esphomeyaml/components/display/lcd_pcf8574.py rename to esphome/components/display/lcd_pcf8574.py index cc3792f992..0a96c65bf9 100644 --- a/esphomeyaml/components/display/lcd_pcf8574.py +++ b/esphome/components/display/lcd_pcf8574.py @@ -1,13 +1,13 @@ import voluptuous as vol -from esphomeyaml.components import display, i2c -from esphomeyaml.components.display.lcd_gpio import LCDDisplay, LCDDisplayRef, \ +from esphome.components import display, i2c +from esphome.components.display.lcd_gpio import LCDDisplay, LCDDisplayRef, \ validate_lcd_dimensions -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ADDRESS, CONF_DIMENSIONS, CONF_ID, CONF_LAMBDA -from esphomeyaml.cpp_generator import Pvariable, add, process_lambda -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, void +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_DIMENSIONS, CONF_ID, CONF_LAMBDA +from esphome.cpp_generator import Pvariable, add, process_lambda +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, void DEPENDENCIES = ['i2c'] diff --git a/esphomeyaml/components/display/max7219.py b/esphome/components/display/max7219.py similarity index 74% rename from esphomeyaml/components/display/max7219.py rename to esphome/components/display/max7219.py index fcca07154b..28f5924613 100644 --- a/esphomeyaml/components/display/max7219.py +++ b/esphome/components/display/max7219.py @@ -1,14 +1,14 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import display, spi -from esphomeyaml.components.spi import SPIComponent -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_CS_PIN, CONF_ID, CONF_INTENSITY, CONF_LAMBDA, CONF_NUM_CHIPS, \ +from esphome import pins +from esphome.components import display, spi +from esphome.components.spi import SPIComponent +import esphome.config_validation as cv +from esphome.const import CONF_CS_PIN, CONF_ID, CONF_INTENSITY, CONF_LAMBDA, CONF_NUM_CHIPS, \ CONF_SPI_ID -from esphomeyaml.cpp_generator import Pvariable, add, get_variable, process_lambda -from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component -from esphomeyaml.cpp_types import App, PollingComponent, void +from esphome.cpp_generator import Pvariable, add, get_variable, process_lambda +from esphome.cpp_helpers import gpio_output_pin_expression, setup_component +from esphome.cpp_types import App, PollingComponent, void DEPENDENCIES = ['spi'] diff --git a/esphomeyaml/components/display/nextion.py b/esphome/components/display/nextion.py similarity index 68% rename from esphomeyaml/components/display/nextion.py rename to esphome/components/display/nextion.py index 4d051c39b6..9e921d68ca 100644 --- a/esphomeyaml/components/display/nextion.py +++ b/esphome/components/display/nextion.py @@ -1,10 +1,10 @@ -from esphomeyaml.components import display, uart -from esphomeyaml.components.uart import UARTComponent -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ID, CONF_LAMBDA, CONF_UART_ID -from esphomeyaml.cpp_generator import Pvariable, add, get_variable, process_lambda -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, PollingComponent, void +from esphome.components import display, uart +from esphome.components.uart import UARTComponent +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_LAMBDA, CONF_UART_ID +from esphome.cpp_generator import Pvariable, add, get_variable, process_lambda +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, PollingComponent, void DEPENDENCIES = ['uart'] diff --git a/esphomeyaml/components/display/ssd1306_i2c.py b/esphome/components/display/ssd1306_i2c.py similarity index 66% rename from esphomeyaml/components/display/ssd1306_i2c.py rename to esphome/components/display/ssd1306_i2c.py index 966ecdc844..0daaa1b868 100644 --- a/esphomeyaml/components/display/ssd1306_i2c.py +++ b/esphome/components/display/ssd1306_i2c.py @@ -1,26 +1,26 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import display -from esphomeyaml.components.display import ssd1306_spi -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ADDRESS, CONF_EXTERNAL_VCC, CONF_ID, CONF_LAMBDA, CONF_MODEL, \ - CONF_RESET_PIN -from esphomeyaml.cpp_generator import Pvariable, add, process_lambda -from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component -from esphomeyaml.cpp_types import App, void +from esphome import pins +from esphome.components import display +from esphome.components.display import ssd1306_spi +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_EXTERNAL_VCC, CONF_ID, CONF_LAMBDA, CONF_MODEL, \ + CONF_PAGES, CONF_RESET_PIN +from esphome.cpp_generator import Pvariable, add, process_lambda +from esphome.cpp_helpers import gpio_output_pin_expression, setup_component +from esphome.cpp_types import App, void DEPENDENCIES = ['i2c'] 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), vol.Required(CONF_MODEL): ssd1306_spi.SSD1306_MODEL, vol.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema, vol.Optional(CONF_EXTERNAL_VCC): cv.boolean, 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): diff --git a/esphomeyaml/components/display/ssd1306_spi.py b/esphome/components/display/ssd1306_spi.py similarity index 76% rename from esphomeyaml/components/display/ssd1306_spi.py rename to esphome/components/display/ssd1306_spi.py index 635ccde046..f8fe14127e 100644 --- a/esphomeyaml/components/display/ssd1306_spi.py +++ b/esphome/components/display/ssd1306_spi.py @@ -1,14 +1,14 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import display, spi -from esphomeyaml.components.spi import SPIComponent -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_CS_PIN, CONF_DC_PIN, CONF_EXTERNAL_VCC, CONF_ID, CONF_LAMBDA, \ - CONF_MODEL, CONF_RESET_PIN, CONF_SPI_ID -from esphomeyaml.cpp_generator import Pvariable, add, get_variable, process_lambda -from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component -from esphomeyaml.cpp_types import App, PollingComponent, void +from esphome import pins +from esphome.components import display, spi +from esphome.components.spi import SPIComponent +import esphome.config_validation as cv +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_PAGES +from esphome.cpp_generator import Pvariable, add, get_variable, process_lambda +from esphome.cpp_helpers import gpio_output_pin_expression, setup_component +from esphome.cpp_types import App, PollingComponent, void DEPENDENCIES = ['spi'] @@ -29,7 +29,7 @@ MODELS = { 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(CONF_SPI_ID): cv.use_variable_id(SPIComponent), 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.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema, 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): diff --git a/esphomeyaml/components/display/waveshare_epaper.py b/esphome/components/display/waveshare_epaper.py similarity index 83% rename from esphomeyaml/components/display/waveshare_epaper.py rename to esphome/components/display/waveshare_epaper.py index bfca5bb3fd..b1058eb9da 100644 --- a/esphomeyaml/components/display/waveshare_epaper.py +++ b/esphome/components/display/waveshare_epaper.py @@ -1,15 +1,15 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml import pins -from esphomeyaml.components import display, spi -from esphomeyaml.components.spi import SPIComponent -from esphomeyaml.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 -from esphomeyaml.cpp_generator import get_variable, Pvariable, process_lambda, add -from esphomeyaml.cpp_helpers import gpio_output_pin_expression, gpio_input_pin_expression, \ +from esphome import pins +from esphome.components import display, spi +from esphome.components.spi import SPIComponent +import esphome.config_validation as cv +from esphome.const import CONF_BUSY_PIN, CONF_CS_PIN, CONF_DC_PIN, CONF_FULL_UPDATE_EVERY, \ + CONF_ID, CONF_LAMBDA, CONF_MODEL, CONF_PAGES, CONF_RESET_PIN, CONF_SPI_ID +from esphome.cpp_generator import Pvariable, add, get_variable, process_lambda +from esphome.cpp_helpers import gpio_input_pin_expression, gpio_output_pin_expression, \ setup_component -from esphomeyaml.cpp_types import PollingComponent, App, void +from esphome.cpp_types import App, PollingComponent, void DEPENDENCIES = ['spi'] @@ -17,7 +17,6 @@ WaveshareEPaperTypeA = display.display_ns.WaveshareEPaperTypeA WaveshareEPaper = display.display_ns.class_('WaveshareEPaper', PollingComponent, spi.SPIDevice, display.DisplayBuffer) - WaveshareEPaperTypeAModel = display.display_ns.enum('WaveshareEPaperTypeAModel') 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_BUSY_PIN): pins.gpio_input_pin_schema, 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): diff --git a/esphomeyaml/components/esp32_ble_beacon.py b/esphome/components/esp32_ble_beacon.py similarity index 64% rename from esphomeyaml/components/esp32_ble_beacon.py rename to esphome/components/esp32_ble_beacon.py index 326314756f..3996f298d8 100644 --- a/esphomeyaml/components/esp32_ble_beacon.py +++ b/esphome/components/esp32_ble_beacon.py @@ -1,14 +1,14 @@ import voluptuous as vol -from esphomeyaml import config_validation as cv -from esphomeyaml.const import CONF_ID, CONF_SCAN_INTERVAL, CONF_TYPE, CONF_UUID, ESP_PLATFORM_ESP32 -from esphomeyaml.cpp_generator import ArrayInitializer, Pvariable, RawExpression, add -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Component, esphomelib_ns +from esphome import config_validation as cv +from esphome.const import CONF_ID, CONF_SCAN_INTERVAL, CONF_TYPE, CONF_UUID, ESP_PLATFORM_ESP32 +from esphome.cpp_generator import Pvariable, RawExpression, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Component, esphome_ns ESP_PLATFORMS = [ESP_PLATFORM_ESP32] -ESP32BLEBeacon = esphomelib_ns.class_('ESP32BLEBeacon', Component) +ESP32BLEBeacon = esphome_ns.class_('ESP32BLEBeacon', Component) CONF_MAJOR = 'major' CONF_MINOR = 'minor' @@ -26,7 +26,7 @@ CONFIG_SCHEMA = vol.Schema({ def to_code(config): uuid = config[CONF_UUID].hex 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) if CONF_MAJOR in config: add(ble.set_major(config[CONF_MAJOR])) diff --git a/esphome/components/esp32_ble_tracker.py b/esphome/components/esp32_ble_tracker.py new file mode 100644 index 0000000000..2e1f3c9d51 --- /dev/null +++ b/esphome/components/esp32_ble_tracker.py @@ -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' diff --git a/esphomeyaml/components/esp32_touch.py b/esphome/components/esp32_touch.py similarity index 89% rename from esphomeyaml/components/esp32_touch.py rename to esphome/components/esp32_touch.py index e6eb33e6e0..02eedcdc8e 100644 --- a/esphomeyaml/components/esp32_touch.py +++ b/esphome/components/esp32_touch.py @@ -1,14 +1,14 @@ import voluptuous as vol -from esphomeyaml import config_validation as cv -from esphomeyaml.components import binary_sensor -from esphomeyaml.const import CONF_HIGH_VOLTAGE_REFERENCE, CONF_ID, CONF_IIR_FILTER, \ +from esphome import config_validation as cv +from esphome.components import binary_sensor +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_VOLTAGE_ATTENUATION, ESP_PLATFORM_ESP32 -from esphomeyaml.core import TimePeriod -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Component, global_ns +from esphome.core import TimePeriod +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Component, global_ns ESP_PLATFORMS = [ESP_PLATFORM_ESP32] diff --git a/esphomeyaml/components/ethernet.py b/esphome/components/ethernet.py similarity index 63% rename from esphomeyaml/components/ethernet.py rename to esphome/components/ethernet.py index 51ff308bbc..0ce83d3586 100644 --- a/esphomeyaml/components/ethernet.py +++ b/esphome/components/ethernet.py @@ -1,13 +1,14 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import wifi -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_DOMAIN, CONF_HOSTNAME, CONF_ID, CONF_MANUAL_IP, CONF_TYPE, \ - ESP_PLATFORM_ESP32 -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_helpers import gpio_output_pin_expression -from esphomeyaml.cpp_types import App, Component, esphomelib_ns, global_ns +from esphome import pins +from esphome.components import wifi +import esphome.config_validation as cv +from esphome.const import CONF_DOMAIN, CONF_ID, CONF_MANUAL_IP, CONF_STATIC_IP, CONF_TYPE, \ + CONF_USE_ADDRESS, ESP_PLATFORM_ESP32 +from esphome.core import CORE +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import gpio_output_pin_expression +from esphome.cpp_types import App, Component, esphome_ns, global_ns CONFLICTS_WITH = ['wifi'] ESP_PLATFORMS = [ESP_PLATFORM_ESP32] @@ -18,7 +19,7 @@ CONF_MDIO_PIN = 'mdio_pin' CONF_CLK_MODE = 'clk_mode' CONF_POWER_PIN = 'power_pin' -EthernetType = esphomelib_ns.enum('EthernetType') +EthernetType = esphome_ns.enum('EthernetType') ETHERNET_TYPES = { 'LAN8720': EthernetType.ETHERNET_TYPE_LAN8720, 'TLK110': EthernetType.ETHERNET_TYPE_TLK110, @@ -32,9 +33,20 @@ CLK_MODES = { '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), vol.Required(CONF_TYPE): cv.one_of(*ETHERNET_TYPES, upper=True), 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_POWER_PIN): pins.gpio_output_pin_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_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): @@ -57,15 +71,13 @@ def to_code(config): add(eth.set_mdio_pin(config[CONF_MDIO_PIN])) add(eth.set_type(ETHERNET_TYPES[config[CONF_TYPE]])) 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: for pin in gpio_output_pin_expression(config[CONF_POWER_PIN]): yield add(eth.set_power_pin(pin)) - if CONF_HOSTNAME in config: - add(eth.set_hostname(config[CONF_HOSTNAME])) - if CONF_MANUAL_IP in config: add(eth.set_manual_ip(wifi.manual_ip(config[CONF_MANUAL_IP]))) diff --git a/esphomeyaml/components/fan/__init__.py b/esphome/components/fan/__init__.py similarity index 78% rename from esphomeyaml/components/fan/__init__.py rename to esphome/components/fan/__init__.py index cc7ac78c09..35ad3f389b 100644 --- a/esphomeyaml/components/fan/__init__.py +++ b/esphome/components/fan/__init__.py @@ -1,20 +1,22 @@ import voluptuous as vol -from esphomeyaml.automation import ACTION_REGISTRY, maybe_simple_id -from esphomeyaml.components import mqtt -from esphomeyaml.components.mqtt import setup_mqtt_component -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ID, CONF_INTERNAL, CONF_MQTT_ID, CONF_NAME, CONF_OSCILLATING, \ +from esphome.automation import ACTION_REGISTRY, maybe_simple_id +from esphome.components import mqtt +from esphome.components.mqtt import setup_mqtt_component +import esphome.config_validation as cv +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_SPEED, CONF_SPEED_COMMAND_TOPIC, CONF_SPEED_STATE_TOPIC -from esphomeyaml.cpp_generator import add, Pvariable, get_variable, templatable -from esphomeyaml.cpp_types import Application, Component, Nameable, esphomelib_ns, Action, bool_ +from esphome.core import CORE +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({ }) -fan_ns = esphomelib_ns.namespace('fan') +fan_ns = esphome_ns.namespace('fan') FanState = fan_ns.class_('FanState', Nameable, Component) MQTTFanComponent = fan_ns.class_('MQTTFanComponent', mqtt.MQTTComponent) 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: add(fan_var.set_internal(config[CONF_INTERNAL])) + mqtt_ = fan_var.Pget_mqtt() 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: - 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: - 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: - add(mqtt_var.set_custom_speed_command_topic(config[CONF_SPEED_COMMAND_TOPIC])) - setup_mqtt_component(mqtt_var, config) + add(mqtt_.set_custom_speed_command_topic(config[CONF_SPEED_COMMAND_TOPIC])) + 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) - mqtt_var = Pvariable(config[CONF_MQTT_ID], mqtt_obj, has_side_effects=False) - setup_fan_core_(fan_var, mqtt_var, config) + CORE.add_job(setup_fan_core_, fan_var, config) 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: for template_ in templatable(config[CONF_SPEED], arg_type, FanSpeed): yield None + if isinstance(template_, string_types): + template_ = FAN_SPEEDS[template_] add(action.set_speed(template_)) yield action diff --git a/esphomeyaml/components/fan/binary.py b/esphome/components/fan/binary.py similarity index 69% rename from esphomeyaml/components/fan/binary.py rename to esphome/components/fan/binary.py index f4dd31b2f3..eb880d5dfb 100644 --- a/esphomeyaml/components/fan/binary.py +++ b/esphome/components/fan/binary.py @@ -1,11 +1,11 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml.components import fan, output -from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_OSCILLATION_OUTPUT, CONF_OUTPUT -from esphomeyaml.cpp_generator import get_variable, variable, add -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App +from esphome.components import fan, output +import esphome.config_validation as cv +from esphome.const import CONF_MAKE_ID, CONF_NAME, CONF_OSCILLATION_OUTPUT, CONF_OUTPUT +from esphome.cpp_generator import add, get_variable, variable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App PLATFORM_SCHEMA = cv.nameable(fan.FAN_PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(fan.MakeFan), @@ -26,7 +26,7 @@ def to_code(config): yield 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) diff --git a/esphomeyaml/components/fan/speed.py b/esphome/components/fan/speed.py similarity index 85% rename from esphomeyaml/components/fan/speed.py rename to esphome/components/fan/speed.py index 8ad8944fc6..62a1274487 100644 --- a/esphomeyaml/components/fan/speed.py +++ b/esphome/components/fan/speed.py @@ -1,12 +1,12 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml.components import fan, mqtt, output -from esphomeyaml.const import CONF_HIGH, CONF_LOW, CONF_MAKE_ID, CONF_MEDIUM, CONF_NAME, \ +from esphome.components import fan, mqtt, output +import esphome.config_validation as cv +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_SPEED_STATE_TOPIC -from esphomeyaml.cpp_generator import get_variable, variable, add -from esphomeyaml.cpp_types import App +from esphome.cpp_generator import add, get_variable, variable +from esphome.cpp_types import App PLATFORM_SCHEMA = cv.nameable(fan.FAN_PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(fan.MakeFan), @@ -41,7 +41,7 @@ def to_code(config): yield 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): diff --git a/esphomeyaml/components/font.py b/esphome/components/font.py similarity index 77% rename from esphomeyaml/components/font.py rename to esphome/components/font.py index c69ffbd46e..a6907240fd 100644 --- a/esphomeyaml/components/font.py +++ b/esphome/components/font.py @@ -1,14 +1,14 @@ # coding=utf-8 import voluptuous as vol -from esphomeyaml import core -from esphomeyaml.components import display -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_FILE, CONF_GLYPHS, CONF_ID, CONF_SIZE -from esphomeyaml.core import CORE, HexInt -from esphomeyaml.cpp_generator import ArrayInitializer, MockObj, Pvariable, RawExpression, add -from esphomeyaml.cpp_types import App -from esphomeyaml.py_compat import sort_by_cmp +from esphome import core +from esphome.components import display +import esphome.config_validation as cv +from esphome.const import CONF_FILE, CONF_GLYPHS, CONF_ID, CONF_SIZE +from esphome.core import CORE, HexInt +from esphome.cpp_generator import Pvariable, progmem_array, safe_exp +from esphome.cpp_types import App, uint8 +from esphome.py_compat import sort_by_cmp DEPENDENCIES = ['display'] MULTI_CONF = True @@ -74,7 +74,7 @@ FONT_SCHEMA = vol.Schema({ vol.Required(CONF_FILE): validate_truetype_file, vol.Optional(CONF_GLYPHS, default=DEFAULT_GLYPHS): validate_glyphs, 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) @@ -87,7 +87,7 @@ def to_code(config): try: font = ImageFont.truetype(path, config[CONF_SIZE]) 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() @@ -108,14 +108,12 @@ def to_code(config): glyph_args[glyph] = (len(data), offset_x, offset_y, width, height) data += glyph_data - raw_data = MockObj(config[CONF_RAW_DATA_ID]) - add(RawExpression('static const uint8_t {}[{}] PROGMEM = {}'.format( - raw_data, len(data), - ArrayInitializer(*[HexInt(x) for x in data], multiline=False)))) + rhs = safe_exp([HexInt(x) for x in data]) + prog_arr = progmem_array(config[CONF_RAW_DATA_ID], rhs) 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) diff --git a/esphomeyaml/components/globals.py b/esphome/components/globals.py similarity index 68% rename from esphomeyaml/components/globals.py rename to esphome/components/globals.py index 03da1a11ec..749c63d923 100644 --- a/esphomeyaml/components/globals.py +++ b/esphome/components/globals.py @@ -1,12 +1,12 @@ import voluptuous as vol -from esphomeyaml import config_validation as cv -from esphomeyaml.const import CONF_ID, CONF_INITIAL_VALUE, CONF_RESTORE_VALUE, CONF_TYPE -from esphomeyaml.cpp_generator import Pvariable, RawExpression, TemplateArguments, add -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Component, esphomelib_ns +from esphome import config_validation as cv +from esphome.const import CONF_ID, CONF_INITIAL_VALUE, CONF_RESTORE_VALUE, CONF_TYPE +from esphome.cpp_generator import Pvariable, RawExpression, TemplateArguments, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Component, esphome_ns -GlobalVariableComponent = esphomelib_ns.class_('GlobalVariableComponent', Component) +GlobalVariableComponent = esphome_ns.class_('GlobalVariableComponent', Component) MULTI_CONF = True diff --git a/esphomeyaml/components/i2c.py b/esphome/components/i2c.py similarity index 63% rename from esphomeyaml/components/i2c.py rename to esphome/components/i2c.py index b5c216745a..2226b51f83 100644 --- a/esphomeyaml/components/i2c.py +++ b/esphome/components/i2c.py @@ -1,20 +1,20 @@ import voluptuous as vol -from esphomeyaml import pins -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_FREQUENCY, CONF_ID, CONF_RECEIVE_TIMEOUT, CONF_SCAN, CONF_SCL, \ +from esphome import pins +import esphome.config_validation as cv +from esphome.const import CONF_FREQUENCY, CONF_ID, CONF_RECEIVE_TIMEOUT, CONF_SCAN, CONF_SCL, \ CONF_SDA -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Component, esphomelib_ns +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Component, esphome_ns -I2CComponent = esphomelib_ns.class_('I2CComponent', Component) +I2CComponent = esphome_ns.class_('I2CComponent', Component) I2CDevice = pins.I2CDevice CONFIG_SCHEMA = vol.Schema({ cv.GenerateID(): cv.declare_variable_id(I2CComponent), - vol.Optional(CONF_SDA, default='SDA'): pins.input_pullup_pin, - vol.Optional(CONF_SCL, default='SCL'): pins.input_pullup_pin, + vol.Optional(CONF_SDA, default='SDA'): pins.input_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_SCAN): cv.boolean, diff --git a/esphomeyaml/components/image.py b/esphome/components/image.py similarity index 62% rename from esphomeyaml/components/image.py rename to esphome/components/image.py index adfeffe7d3..01b469b382 100644 --- a/esphomeyaml/components/image.py +++ b/esphome/components/image.py @@ -3,13 +3,13 @@ import logging import voluptuous as vol -from esphomeyaml import core -from esphomeyaml.components import display, font -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_FILE, CONF_ID, CONF_RESIZE -from esphomeyaml.core import CORE, HexInt -from esphomeyaml.cpp_generator import ArrayInitializer, MockObj, Pvariable, RawExpression, add -from esphomeyaml.cpp_types import App +from esphome import core +from esphome.components import display, font +import esphome.config_validation as cv +from esphome.const import CONF_FILE, CONF_ID, CONF_RESIZE +from esphome.core import CORE, HexInt +from esphome.cpp_generator import Pvariable, progmem_array, safe_exp +from esphome.cpp_types import App, uint8 _LOGGER = logging.getLogger(__name__) @@ -24,7 +24,7 @@ IMAGE_SCHEMA = vol.Schema({ vol.Required(CONF_ID): cv.declare_variable_id(Image_), vol.Required(CONF_FILE): cv.file_, 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) @@ -37,7 +37,7 @@ def to_code(config): try: image = Image.open(path) 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: image.thumbnail(config[CONF_RESIZE]) @@ -56,10 +56,8 @@ def to_code(config): pos = x + y * width8 data[pos // 8] |= 0x80 >> (pos % 8) - raw_data = MockObj(config[CONF_RAW_DATA_ID]) - add(RawExpression('static const uint8_t {}[{}] PROGMEM = {}'.format( - raw_data, len(data), - ArrayInitializer(*[HexInt(x) for x in data], multiline=False)))) + rhs = safe_exp([HexInt(x) for x in data]) + prog_arr = progmem_array(config[CONF_RAW_DATA_ID], rhs) - rhs = App.make_image(raw_data, width, height) + rhs = App.make_image(prog_arr, width, height) Pvariable(config[CONF_ID], rhs) diff --git a/esphomeyaml/components/interval.py b/esphome/components/interval.py similarity index 55% rename from esphomeyaml/components/interval.py rename to esphome/components/interval.py index 8429f6aed9..f51fd163af 100644 --- a/esphomeyaml/components/interval.py +++ b/esphome/components/interval.py @@ -1,13 +1,13 @@ import voluptuous as vol -from esphomeyaml import automation -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ID, CONF_INTERVAL -from esphomeyaml.cpp_generator import Pvariable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, NoArg, PollingComponent, Trigger, esphomelib_ns +from esphome import automation +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_INTERVAL +from esphome.cpp_generator import Pvariable +from esphome.cpp_helpers import setup_component +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({ cv.GenerateID(): cv.declare_variable_id(IntervalTrigger), diff --git a/esphomeyaml/components/light/__init__.py b/esphome/components/light/__init__.py similarity index 93% rename from esphomeyaml/components/light/__init__.py rename to esphome/components/light/__init__.py index 0997d1fd5b..783f1400b6 100644 --- a/esphomeyaml/components/light/__init__.py +++ b/esphome/components/light/__init__.py @@ -1,28 +1,29 @@ import voluptuous as vol -from esphomeyaml.automation import ACTION_REGISTRY, maybe_simple_id -from esphomeyaml.components import mqtt -from esphomeyaml.components.mqtt import setup_mqtt_component -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ALPHA, CONF_BLUE, CONF_BRIGHTNESS, CONF_COLORS, \ - CONF_DEFAULT_TRANSITION_LENGTH, CONF_DURATION, CONF_EFFECTS, CONF_EFFECT_ID, \ - CONF_GAMMA_CORRECT, CONF_GREEN, CONF_ID, CONF_INTERNAL, CONF_LAMBDA, CONF_MQTT_ID, CONF_NAME, \ - CONF_NUM_LEDS, CONF_RANDOM, CONF_RED, CONF_SPEED, CONF_STATE, CONF_TRANSITION_LENGTH, \ - CONF_UPDATE_INTERVAL, CONF_WHITE, CONF_WIDTH, CONF_FLASH_LENGTH, CONF_COLOR_TEMPERATURE, \ - CONF_EFFECT -from esphomeyaml.core import CORE -from esphomeyaml.cpp_generator import process_lambda, Pvariable, add, StructInitializer, \ - ArrayInitializer, get_variable, templatable -from esphomeyaml.cpp_types import esphomelib_ns, Application, Component, Nameable, Action, uint32, \ - float_, std_string, void +from esphome.automation import ACTION_REGISTRY, maybe_simple_id +from esphome.components import mqtt +from esphome.components.mqtt import setup_mqtt_component +import esphome.config_validation as cv +from esphome.const import CONF_ALPHA, CONF_BLUE, CONF_BRIGHTNESS, CONF_COLORS, \ + CONF_COLOR_TEMPERATURE, CONF_DEFAULT_TRANSITION_LENGTH, CONF_DURATION, CONF_EFFECT, \ + CONF_EFFECTS, CONF_EFFECT_ID, CONF_FLASH_LENGTH, CONF_GAMMA_CORRECT, CONF_GREEN, CONF_ID, \ + CONF_INTERNAL, CONF_LAMBDA, CONF_MQTT_ID, CONF_NAME, CONF_NUM_LEDS, CONF_RANDOM, CONF_RED, \ + CONF_SPEED, CONF_STATE, CONF_TRANSITION_LENGTH, CONF_UPDATE_INTERVAL, CONF_WHITE, CONF_WIDTH +from esphome.core import CORE +from esphome.cpp_generator import Pvariable, StructInitializer, add, get_variable, process_lambda, \ + templatable +from esphome.cpp_types import Action, Application, Component, Nameable, esphome_ns, float_, \ + std_string, uint32, void PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ }) # Base -light_ns = esphomelib_ns.namespace('light') +light_ns = esphome_ns.namespace('light') LightState = light_ns.class_('LightState', Nameable, Component) +# Fake class for addressable lights +AddressableLightState = light_ns.class_('LightState', LightState) MakeLight = Application.struct('MakeLight') LightOutput = light_ns.class_('LightOutput') AddressableLight = light_ns.class_('AddressableLight') @@ -279,7 +280,7 @@ def build_effect(full_config): ('duration', color[CONF_DURATION]), )) if colors: - add(effect.set_colors(ArrayInitializer(*colors))) + add(effect.set_colors(colors)) yield effect elif key == CONF_FLICKER: rhs = FlickerLightEffect.new(config[CONF_NAME]) @@ -322,7 +323,7 @@ def build_effect(full_config): ('num_leds', color[CONF_NUM_LEDS]), )) if colors: - add(effect.set_colors(ArrayInitializer(*colors))) + add(effect.set_colors(colors)) yield effect elif key == CONF_ADDRESSABLE_SCAN: rhs = AddressableScanEffect.new(config[CONF_NAME]) @@ -370,7 +371,7 @@ def build_effect(full_config): 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: add(light_var.set_internal(config[CONF_INTERNAL])) if CONF_DEFAULT_TRANSITION_LENGTH in config: @@ -383,15 +384,14 @@ def setup_light_core_(light_var, mqtt_var, config): yield effects.append(effect) 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) - mqtt_var = Pvariable(config[CONF_MQTT_ID], mqtt_obj, has_side_effects=False) - CORE.add_job(setup_light_core_, light_var, mqtt_var, config) + CORE.add_job(setup_light_core_, light_var, config) BUILD_FLAGS = '-DUSE_LIGHT' diff --git a/esphomeyaml/components/light/binary.py b/esphome/components/light/binary.py similarity index 67% rename from esphomeyaml/components/light/binary.py rename to esphome/components/light/binary.py index 2f705e1d80..85b56ab202 100644 --- a/esphomeyaml/components/light/binary.py +++ b/esphome/components/light/binary.py @@ -1,11 +1,11 @@ import voluptuous as vol -from esphomeyaml.components import light, output -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_EFFECTS, CONF_MAKE_ID, CONF_NAME, CONF_OUTPUT -from esphomeyaml.cpp_generator import get_variable, variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App +from esphome.components import light, output +import esphome.config_validation as cv +from esphome.const import CONF_EFFECTS, CONF_MAKE_ID, CONF_NAME, CONF_OUTPUT +from esphome.cpp_generator import get_variable, variable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), @@ -19,7 +19,7 @@ def to_code(config): yield rhs = App.make_binary_light(config[CONF_NAME], output_) 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) diff --git a/esphomeyaml/components/light/cwww.py b/esphome/components/light/cwww.py similarity index 77% rename from esphomeyaml/components/light/cwww.py rename to esphome/components/light/cwww.py index c8df6ee203..9fb4dd0568 100644 --- a/esphomeyaml/components/light/cwww.py +++ b/esphome/components/light/cwww.py @@ -1,15 +1,15 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml.components import light, output -from esphomeyaml.components.light.rgbww import validate_cold_white_colder, \ +from esphome.components import light, output +from esphome.components.light.rgbww import validate_cold_white_colder, \ 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_NAME, CONF_WARM_WHITE, CONF_WARM_WHITE_COLOR_TEMPERATURE -from esphomeyaml.cpp_generator import get_variable, variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App +from esphome.cpp_generator import get_variable, variable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ 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], cold_white, warm_white) 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) diff --git a/esphomeyaml/components/light/fastled_clockless.py b/esphome/components/light/fastled_clockless.py similarity index 82% rename from esphomeyaml/components/light/fastled_clockless.py rename to esphome/components/light/fastled_clockless.py index f1d12b6d7e..4380e00993 100644 --- a/esphomeyaml/components/light/fastled_clockless.py +++ b/esphome/components/light/fastled_clockless.py @@ -1,15 +1,15 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import light -from esphomeyaml.components.power_supply import PowerSupplyComponent -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_CHIPSET, CONF_COLOR_CORRECT, CONF_DEFAULT_TRANSITION_LENGTH, \ +from esphome import pins +from esphome.components import light +from esphome.components.power_supply import PowerSupplyComponent +import esphome.config_validation as cv +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_NUM_LEDS, CONF_PIN, CONF_POWER_SUPPLY, CONF_RGB_ORDER -from esphomeyaml.cpp_generator import RawExpression, TemplateArguments, add, get_variable, variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Application +from esphome.cpp_generator import RawExpression, TemplateArguments, add, get_variable, variable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Application TYPES = [ 'NEOPIXEL', @@ -57,6 +57,7 @@ def validate(value): MakeFastLEDLight = Application.struct('MakeFastLEDLight') 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), 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] 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) -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' diff --git a/esphomeyaml/components/light/fastled_spi.py b/esphome/components/light/fastled_spi.py similarity index 80% rename from esphomeyaml/components/light/fastled_spi.py rename to esphome/components/light/fastled_spi.py index 957130f247..43ecfe4209 100644 --- a/esphomeyaml/components/light/fastled_spi.py +++ b/esphome/components/light/fastled_spi.py @@ -1,15 +1,15 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import light -from esphomeyaml.components.power_supply import PowerSupplyComponent -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_CHIPSET, CONF_CLOCK_PIN, CONF_COLOR_CORRECT, CONF_DATA_PIN, \ +from esphome import pins +from esphome.components import light +from esphome.components.power_supply import PowerSupplyComponent +import esphome.config_validation as cv +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_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 esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Application +from esphome.cpp_generator import RawExpression, TemplateArguments, add, get_variable, variable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Application CHIPSETS = [ 'LPD8806', @@ -34,6 +34,7 @@ RGB_ORDERS = [ MakeFastLEDLight = Application.struct('MakeFastLEDLight') 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), 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] 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) -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' diff --git a/esphomeyaml/components/light/monochromatic.py b/esphome/components/light/monochromatic.py similarity index 70% rename from esphomeyaml/components/light/monochromatic.py rename to esphome/components/light/monochromatic.py index 0e9a1ccb48..0aecc22312 100644 --- a/esphomeyaml/components/light/monochromatic.py +++ b/esphome/components/light/monochromatic.py @@ -1,12 +1,12 @@ import voluptuous as vol -from esphomeyaml.components import light, output -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_GAMMA_CORRECT, \ +from esphome.components import light, output +import esphome.config_validation as cv +from esphome.const import CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_GAMMA_CORRECT, \ CONF_MAKE_ID, CONF_NAME, CONF_OUTPUT -from esphomeyaml.cpp_generator import get_variable, variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App +from esphome.cpp_generator import get_variable, variable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), @@ -22,7 +22,7 @@ def to_code(config): yield rhs = App.make_monochromatic_light(config[CONF_NAME], output_) 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) diff --git a/esphomeyaml/components/light/neopixelbus.py b/esphome/components/light/neopixelbus.py similarity index 77% rename from esphomeyaml/components/light/neopixelbus.py rename to esphome/components/light/neopixelbus.py index 01841094e7..30d7ab7854 100644 --- a/esphomeyaml/components/light/neopixelbus.py +++ b/esphome/components/light/neopixelbus.py @@ -1,17 +1,17 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import light -from esphomeyaml.components.light import AddressableLight -from esphomeyaml.components.power_supply import PowerSupplyComponent -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_CLOCK_PIN, CONF_COLOR_CORRECT, CONF_DATA_PIN, \ +from esphome import pins +from esphome.components import light +from esphome.components.light import AddressableLight +from esphome.components.power_supply import PowerSupplyComponent +import esphome.config_validation as cv +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_NAME, CONF_NUM_LEDS, CONF_PIN, CONF_POWER_SUPPLY, CONF_TYPE, CONF_VARIANT -from esphomeyaml.core import CORE -from esphomeyaml.cpp_generator import TemplateArguments, add, get_variable, variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Application, Component, global_ns +from esphome.core import CORE +from esphome.cpp_generator import TemplateArguments, add, get_variable, variable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Application, Component, global_ns NeoPixelBusLightOutputBase = light.light_ns.class_('NeoPixelBusLightOutputBase', Component, AddressableLight) @@ -60,6 +60,30 @@ def validate_method(value): 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 = { 'WS2812X': 'Ws2812x', 'SK6812': 'Sk6812', @@ -107,6 +131,7 @@ def validate(config): MakeNeoPixelBusLight = Application.struct('MakeNeoPixelBusLight') 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), 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_POWER_SUPPLY): cv.use_variable_id(PowerSupplyComponent), 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): @@ -156,11 +181,11 @@ def to_code(config): if CONF_COLOR_CORRECT in config: 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) -BUILD_FLAGS = '-DUSE_NEO_PIXEL_BUS_LIGHT' +REQUIRED_BUILD_FLAGS = '-DUSE_NEO_PIXEL_BUS_LIGHT' LIB_DEPS = 'NeoPixelBus@2.4.1' diff --git a/esphome/components/light/partition.py b/esphome/components/light/partition.py new file mode 100644 index 0000000000..0495841765 --- /dev/null +++ b/esphome/components/light/partition.py @@ -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) diff --git a/esphomeyaml/components/light/rgb.py b/esphome/components/light/rgb.py similarity index 75% rename from esphomeyaml/components/light/rgb.py rename to esphome/components/light/rgb.py index 11dde11525..418f4b83c4 100644 --- a/esphomeyaml/components/light/rgb.py +++ b/esphome/components/light/rgb.py @@ -1,12 +1,12 @@ import voluptuous as vol -from esphomeyaml.components import light, output -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_BLUE, CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, \ +from esphome.components import light, output +import esphome.config_validation as cv +from esphome.const import CONF_BLUE, CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, \ CONF_GAMMA_CORRECT, CONF_GREEN, CONF_MAKE_ID, CONF_NAME, CONF_RED -from esphomeyaml.cpp_generator import get_variable, variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App +from esphome.cpp_generator import get_variable, variable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), @@ -28,7 +28,7 @@ def to_code(config): yield rhs = App.make_rgb_light(config[CONF_NAME], red, green, blue) 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) diff --git a/esphomeyaml/components/light/rgbw.py b/esphome/components/light/rgbw.py similarity index 77% rename from esphomeyaml/components/light/rgbw.py rename to esphome/components/light/rgbw.py index 21d41536c8..22166f2a47 100644 --- a/esphomeyaml/components/light/rgbw.py +++ b/esphome/components/light/rgbw.py @@ -1,12 +1,12 @@ import voluptuous as vol -from esphomeyaml.components import light, output -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_BLUE, CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, \ +from esphome.components import light, output +import esphome.config_validation as cv +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 -from esphomeyaml.cpp_generator import get_variable, variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App +from esphome.cpp_generator import get_variable, variable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), @@ -31,7 +31,7 @@ def to_code(config): yield rhs = App.make_rgbw_light(config[CONF_NAME], red, green, blue, white) 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) diff --git a/esphomeyaml/components/light/rgbww.py b/esphome/components/light/rgbww.py similarity index 86% rename from esphomeyaml/components/light/rgbww.py rename to esphome/components/light/rgbww.py index a6a65116f8..6ed5556b5a 100644 --- a/esphomeyaml/components/light/rgbww.py +++ b/esphome/components/light/rgbww.py @@ -1,13 +1,13 @@ import voluptuous as vol -from esphomeyaml.components import light, output -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_BLUE, CONF_COLD_WHITE, CONF_COLD_WHITE_COLOR_TEMPERATURE, \ +from esphome.components import light, output +import esphome.config_validation as cv +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_NAME, CONF_RED, CONF_WARM_WHITE, CONF_WARM_WHITE_COLOR_TEMPERATURE -from esphomeyaml.cpp_generator import get_variable, variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App +from esphome.cpp_generator import get_variable, variable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App def validate_color_temperature(value): @@ -61,7 +61,7 @@ def to_code(config): config[CONF_WARM_WHITE_COLOR_TEMPERATURE], red, green, blue, cold_white, warm_white) 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) diff --git a/esphomeyaml/components/logger.py b/esphome/components/logger.py similarity index 65% rename from esphomeyaml/components/logger.py rename to esphome/components/logger.py index ad713a4c2d..3115930a0b 100644 --- a/esphomeyaml/components/logger.py +++ b/esphome/components/logger.py @@ -2,24 +2,23 @@ import re import voluptuous as vol -from esphomeyaml.automation import ACTION_REGISTRY, LambdaAction -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ARGS, CONF_BAUD_RATE, CONF_FORMAT, CONF_ID, CONF_LEVEL, \ - CONF_LOGS, CONF_TAG, CONF_TX_BUFFER_SIZE -from esphomeyaml.core import EsphomeyamlError, Lambda, CORE -from esphomeyaml.cpp_generator import Pvariable, RawExpression, add, process_lambda, statement -from esphomeyaml.cpp_types import App, Component, esphomelib_ns, global_ns, void - -from esphomeyaml.py_compat import text_type +from esphome.automation import ACTION_REGISTRY, LambdaAction +import esphome.config_validation as cv +from esphome.const import CONF_ARGS, CONF_BAUD_RATE, CONF_FORMAT, CONF_HARDWARE_UART, CONF_ID, \ + CONF_LEVEL, CONF_LOGS, CONF_TAG, CONF_TX_BUFFER_SIZE +from esphome.core import CORE, EsphomeError, Lambda +from esphome.cpp_generator import Pvariable, RawExpression, add, process_lambda, statement +from esphome.cpp_types import App, Component, esphome_ns, global_ns, void +from esphome.py_compat import text_type LOG_LEVELS = { - 'NONE': global_ns.ESPHOMELIB_LOG_LEVEL_NONE, - 'ERROR': global_ns.ESPHOMELIB_LOG_LEVEL_ERROR, - 'WARN': global_ns.ESPHOMELIB_LOG_LEVEL_WARN, - 'INFO': global_ns.ESPHOMELIB_LOG_LEVEL_INFO, - 'DEBUG': global_ns.ESPHOMELIB_LOG_LEVEL_DEBUG, - 'VERBOSE': global_ns.ESPHOMELIB_LOG_LEVEL_VERBOSE, - 'VERY_VERBOSE': global_ns.ESPHOMELIB_LOG_LEVEL_VERY_VERBOSE, + 'NONE': global_ns.ESPHOME_LOG_LEVEL_NONE, + 'ERROR': global_ns.ESPHOME_LOG_LEVEL_ERROR, + 'WARN': global_ns.ESPHOME_LOG_LEVEL_WARN, + 'INFO': global_ns.ESPHOME_LOG_LEVEL_INFO, + 'DEBUG': global_ns.ESPHOME_LOG_LEVEL_DEBUG, + 'VERBOSE': global_ns.ESPHOME_LOG_LEVEL_VERBOSE, + 'VERY_VERBOSE': global_ns.ESPHOME_LOG_LEVEL_VERY_VERBOSE, } 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'] +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 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): global_level = value.get(CONF_LEVEL, 'DEBUG') for tag, level in value.get(CONF_LOGS, {}).items(): 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 " - u"global log level {}.".format(level, tag, global_level)) + raise EsphomeError(u"The local log level {} for {} must be less severe than the " + u"global log level {}.".format(level, tag, global_level)) return value -LogComponent = esphomelib_ns.class_('LogComponent', Component) +LogComponent = esphome_ns.class_('LogComponent', Component) CONFIG_SCHEMA = vol.All(vol.Schema({ cv.GenerateID(): cv.declare_variable_id(LogComponent), 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_LOGS): vol.Schema({ cv.string: is_log_level, @@ -60,10 +86,10 @@ CONFIG_SCHEMA = vol.All(vol.Schema({ 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) - if CONF_TX_BUFFER_SIZE in config: - add(log.set_tx_buffer_size(config[CONF_TX_BUFFER_SIZE])) if CONF_LEVEL in config: add(log.set_global_log_level(LOG_LEVELS[config[CONF_LEVEL]])) for tag, level in config.get(CONF_LOGS, {}).items(): @@ -73,13 +99,14 @@ def to_code(config): def required_build_flags(config): flags = [] 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]) verbose_severity = LOG_LEVEL_SEVERITY.index('VERBOSE') is_at_least_verbose = this_severity >= verbose_severity has_serial_logging = config.get(CONF_BAUD_RATE) != 0 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") DEBUG_COMPONENTS = { 'HTTP_CLIENT', diff --git a/esphomeyaml/components/mqtt.py b/esphome/components/mqtt.py similarity index 89% rename from esphomeyaml/components/mqtt.py rename to esphome/components/mqtt.py index f6289ea02a..b98898c54f 100644 --- a/esphomeyaml/components/mqtt.py +++ b/esphome/components/mqtt.py @@ -3,22 +3,22 @@ import re import voluptuous as vol -from esphomeyaml import automation -from esphomeyaml.automation import ACTION_REGISTRY -from esphomeyaml.components import logger -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_AVAILABILITY, CONF_BIRTH_MESSAGE, CONF_BROKER, CONF_CLIENT_ID, \ +from esphome import automation +from esphome.automation import ACTION_REGISTRY +from esphome.components import logger +import esphome.config_validation as cv +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_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_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_TOPIC_PREFIX, CONF_TRIGGER_ID, CONF_USERNAME, CONF_WILL_MESSAGE -from esphomeyaml.core import EsphomeyamlError -from esphomeyaml.cpp_generator import ArrayInitializer, Pvariable, RawExpression, \ - StructInitializer, TemplateArguments, add, process_lambda, templatable -from esphomeyaml.cpp_types import Action, App, Component, JsonObjectConstRef, JsonObjectRef, \ - Trigger, bool_, esphomelib_ns, optional, std_string, uint8, void +from esphome.core import EsphomeError +from esphome.cpp_generator import Pvariable, RawExpression, StructInitializer, TemplateArguments, \ + add, get_variable, process_lambda, templatable +from esphome.cpp_types import Action, App, Component, JsonObjectConstRef, JsonObjectRef, \ + Trigger, bool_, esphome_ns, optional, std_string, uint8, void 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, })) -mqtt_ns = esphomelib_ns.namespace('mqtt') +mqtt_ns = esphome_ns.namespace('mqtt') MQTTMessage = mqtt_ns.struct('MQTTMessage') MQTTClientComponent = mqtt_ns.class_('MQTTClientComponent', Component) MQTTPublishAction = mqtt_ns.class_('MQTTPublishAction', Action) @@ -163,13 +163,13 @@ def to_code(config): else: add(mqtt.set_log_message_template(exp_mqtt_message(log_topic))) - if CONF_LEVEL in config: - add(mqtt.set_log_level(logger.LOG_LEVELS[config[CONF_LEVEL]])) + if CONF_LEVEL in log_topic: + add(mqtt.set_log_level(logger.LOG_LEVELS[log_topic[CONF_LEVEL]])) if CONF_SSL_FINGERPRINTS in config: for fingerprint in config[CONF_SSL_FINGERPRINTS]: 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: add(mqtt.set_keep_alive(config[CONF_KEEPALIVE])) @@ -194,6 +194,7 @@ def to_code(config): CONF_MQTT_PUBLISH = 'mqtt.publish' 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_PAYLOAD): cv.templatable(cv.mqtt_payload), 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) 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) action = Pvariable(action_id, rhs, type=type) 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' 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_PAYLOAD): cv.lambda_, 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) 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) action = Pvariable(action_id, rhs, type=type) 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): def __init__(self, config): if 'mqtt' not in config: - raise EsphomeyamlError("Cannot generate Home Assistant MQTT config if MQTT is not " - "used!") + raise EsphomeError("Cannot generate Home Assistant MQTT config if MQTT is not " + "used!") 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) if CONF_BIRTH_MESSAGE not in mqtt: birth_message = { @@ -337,3 +343,7 @@ def setup_mqtt_component(obj, config): else: add(obj.set_availability(availability[CONF_TOPIC], availability[CONF_PAYLOAD_AVAILABLE], availability[CONF_PAYLOAD_NOT_AVAILABLE])) + + +LIB_DEPS = 'AsyncMqttClient@0.8.2' +BUILD_FLAGS = '-DUSE_MQTT' diff --git a/esphomeyaml/components/my9231.py b/esphome/components/my9231.py similarity index 76% rename from esphomeyaml/components/my9231.py rename to esphome/components/my9231.py index 602d1f52ad..096a782875 100644 --- a/esphomeyaml/components/my9231.py +++ b/esphome/components/my9231.py @@ -1,13 +1,13 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import output -import esphomeyaml.config_validation as cv -from esphomeyaml.const import (CONF_BIT_DEPTH, CONF_CLOCK_PIN, CONF_DATA_PIN, CONF_ID, - CONF_NUM_CHANNELS, CONF_NUM_CHIPS, CONF_UPDATE_ON_BOOT) -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component -from esphomeyaml.cpp_types import App, Component +from esphome import pins +from esphome.components import output +import esphome.config_validation as cv +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) +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import gpio_output_pin_expression, setup_component +from esphome.cpp_types import App, Component MY9231OutputComponent = output.output_ns.class_('MY9231OutputComponent', Component) MULTI_CONF = True diff --git a/esphomeyaml/components/ota.py b/esphome/components/ota.py similarity index 77% rename from esphomeyaml/components/ota.py rename to esphome/components/ota.py index deac3d28d8..61cb870c46 100644 --- a/esphomeyaml/components/ota.py +++ b/esphome/components/ota.py @@ -2,15 +2,15 @@ import logging import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ID, CONF_OTA, CONF_PASSWORD, CONF_PORT, CONF_SAFE_MODE -from esphomeyaml.core import CORE -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_types import App, Component, esphomelib_ns +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_OTA, CONF_PASSWORD, CONF_PORT, CONF_SAFE_MODE +from esphome.core import CORE +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_types import App, Component, esphome_ns _LOGGER = logging.getLogger(__name__) -OTAComponent = esphomelib_ns.class_('OTAComponent', Component) +OTAComponent = esphome_ns.class_('OTAComponent', Component) CONFIG_SCHEMA = vol.Schema({ cv.GenerateID(): cv.declare_variable_id(OTAComponent), diff --git a/esphomeyaml/components/output/__init__.py b/esphome/components/output/__init__.py similarity index 87% rename from esphomeyaml/components/output/__init__.py rename to esphome/components/output/__init__.py index b5a575c6f2..fde09ab321 100644 --- a/esphomeyaml/components/output/__init__.py +++ b/esphome/components/output/__init__.py @@ -1,12 +1,12 @@ import voluptuous as vol -from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY -import esphomeyaml.config_validation as cv -from esphomeyaml.components.power_supply import PowerSupplyComponent -from esphomeyaml.const import CONF_INVERTED, CONF_MAX_POWER, CONF_POWER_SUPPLY, CONF_ID, CONF_LEVEL -from esphomeyaml.core import CORE -from esphomeyaml.cpp_generator import add, get_variable, Pvariable, templatable -from esphomeyaml.cpp_types import esphomelib_ns, Action, float_ +from esphome.automation import ACTION_REGISTRY, maybe_simple_id +from esphome.components.power_supply import PowerSupplyComponent +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_INVERTED, CONF_LEVEL, CONF_MAX_POWER, CONF_POWER_SUPPLY +from esphome.core import CORE +from esphome.cpp_generator import Pvariable, add, get_variable, templatable +from esphome.cpp_types import Action, esphome_ns, float_ 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) -output_ns = esphomelib_ns.namespace('output') +output_ns = esphome_ns.namespace('output') BinaryOutput = output_ns.class_('BinaryOutput') BinaryOutputPtr = BinaryOutput.operator('ptr') FloatOutput = output_ns.class_('FloatOutput', BinaryOutput) @@ -60,7 +60,6 @@ def register_output(var, config): BUILD_FLAGS = '-DUSE_OUTPUT' - CONF_OUTPUT_TURN_ON = 'output.turn_on' OUTPUT_TURN_ON_ACTION = maybe_simple_id({ vol.Required(CONF_ID): cv.use_variable_id(BinaryOutput), diff --git a/esphomeyaml/components/output/custom.py b/esphome/components/output/custom.py similarity index 79% rename from esphomeyaml/components/output/custom.py rename to esphome/components/output/custom.py index 6343a52853..4abb0873f0 100644 --- a/esphomeyaml/components/output/custom.py +++ b/esphome/components/output/custom.py @@ -1,10 +1,10 @@ import voluptuous as vol -from esphomeyaml.components import output -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ID, CONF_LAMBDA, CONF_OUTPUTS, CONF_TYPE -from esphomeyaml.cpp_generator import process_lambda, variable -from esphomeyaml.cpp_types import std_vector +from esphome.components import output +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_LAMBDA, CONF_OUTPUTS, CONF_TYPE +from esphome.cpp_generator import process_lambda, variable +from esphome.cpp_types import std_vector CustomBinaryOutputConstructor = output.output_ns.class_('CustomBinaryOutputConstructor') CustomFloatOutputConstructor = output.output_ns.class_('CustomFloatOutputConstructor') @@ -12,6 +12,7 @@ CustomFloatOutputConstructor = output.output_ns.class_('CustomFloatOutputConstru BINARY_SCHEMA = output.PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(CustomBinaryOutputConstructor), vol.Required(CONF_LAMBDA): cv.lambda_, + vol.Required(CONF_TYPE): 'binary', vol.Required(CONF_OUTPUTS): cv.ensure_list(output.BINARY_OUTPUT_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(output.BinaryOutput), @@ -21,8 +22,9 @@ BINARY_SCHEMA = output.PLATFORM_SCHEMA.extend({ FLOAT_SCHEMA = output.PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(CustomFloatOutputConstructor), vol.Required(CONF_LAMBDA): cv.lambda_, + vol.Required(CONF_TYPE): 'float', 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), })), }) @@ -59,8 +61,8 @@ def to_code(config): rhs = klass(template_) custom = variable(config[CONF_ID], rhs) - for i, sens in enumerate(config[CONF_OUTPUTS]): - output.register_output(custom.get_output(i), sens) + for i, conf in enumerate(config[CONF_OUTPUTS]): + output.register_output(custom.get_output(i), conf) BUILD_FLAGS = '-DUSE_CUSTOM_OUTPUT' diff --git a/esphomeyaml/components/output/esp8266_pwm.py b/esphome/components/output/esp8266_pwm.py similarity index 68% rename from esphomeyaml/components/output/esp8266_pwm.py rename to esphome/components/output/esp8266_pwm.py index a42ff604be..b8496206bb 100644 --- a/esphomeyaml/components/output/esp8266_pwm.py +++ b/esphome/components/output/esp8266_pwm.py @@ -1,19 +1,19 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import output -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_FREQUENCY, CONF_ID, CONF_NUMBER, CONF_PIN, ESP_PLATFORM_ESP8266 -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component -from esphomeyaml.cpp_types import App, Component +from esphome import pins +from esphome.components import output +import esphome.config_validation as cv +from esphome.const import CONF_FREQUENCY, CONF_ID, CONF_NUMBER, CONF_PIN, ESP_PLATFORM_ESP8266 +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import gpio_output_pin_expression, setup_component +from esphome.cpp_types import App, Component ESP_PLATFORMS = [ESP_PLATFORM_ESP8266] def valid_pwm_pin(value): 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 diff --git a/esphomeyaml/components/output/gpio.py b/esphome/components/output/gpio.py similarity index 68% rename from esphomeyaml/components/output/gpio.py rename to esphome/components/output/gpio.py index fb4949c1e5..82cd30ce41 100644 --- a/esphomeyaml/components/output/gpio.py +++ b/esphome/components/output/gpio.py @@ -1,12 +1,12 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import output -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ID, CONF_PIN -from esphomeyaml.cpp_generator import Pvariable -from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component -from esphomeyaml.cpp_types import App, Component +from esphome import pins +from esphome.components import output +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_PIN +from esphome.cpp_generator import Pvariable +from esphome.cpp_helpers import gpio_output_pin_expression, setup_component +from esphome.cpp_types import App, Component GPIOBinaryOutputComponent = output.output_ns.class_('GPIOBinaryOutputComponent', output.BinaryOutput, Component) diff --git a/esphomeyaml/components/output/ledc.py b/esphome/components/output/ledc.py similarity index 80% rename from esphomeyaml/components/output/ledc.py rename to esphome/components/output/ledc.py index bd42ba3569..70d500efbf 100644 --- a/esphomeyaml/components/output/ledc.py +++ b/esphome/components/output/ledc.py @@ -1,13 +1,13 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import output -import esphomeyaml.config_validation as cv -from esphomeyaml.const import APB_CLOCK_FREQ, CONF_BIT_DEPTH, CONF_CHANNEL, CONF_FREQUENCY, \ +from esphome import pins +from esphome.components import output +import esphome.config_validation as cv +from esphome.const import APB_CLOCK_FREQ, CONF_BIT_DEPTH, CONF_CHANNEL, CONF_FREQUENCY, \ CONF_ID, CONF_PIN, ESP_PLATFORM_ESP32 -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Component +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Component ESP_PLATFORMS = [ESP_PLATFORM_ESP32] diff --git a/esphomeyaml/components/output/my9231.py b/esphome/components/output/my9231.py similarity index 74% rename from esphomeyaml/components/output/my9231.py rename to esphome/components/output/my9231.py index ee9f7f494b..0cbb5be882 100644 --- a/esphomeyaml/components/output/my9231.py +++ b/esphome/components/output/my9231.py @@ -1,11 +1,11 @@ import voluptuous as vol -from esphomeyaml.components import output -from esphomeyaml.components.my9231 import MY9231OutputComponent -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_CHANNEL, CONF_ID, CONF_MY9231_ID, CONF_POWER_SUPPLY -from esphomeyaml.cpp_generator import Pvariable, get_variable -from esphomeyaml.cpp_helpers import setup_component +from esphome.components import output +from esphome.components.my9231 import MY9231OutputComponent +import esphome.config_validation as cv +from esphome.const import CONF_CHANNEL, CONF_ID, CONF_MY9231_ID, CONF_POWER_SUPPLY +from esphome.cpp_generator import Pvariable, get_variable +from esphome.cpp_helpers import setup_component DEPENDENCIES = ['my9231'] diff --git a/esphomeyaml/components/output/pca9685.py b/esphome/components/output/pca9685.py similarity index 75% rename from esphomeyaml/components/output/pca9685.py rename to esphome/components/output/pca9685.py index b43c0f767b..bb51a2490e 100644 --- a/esphomeyaml/components/output/pca9685.py +++ b/esphome/components/output/pca9685.py @@ -1,10 +1,10 @@ import voluptuous as vol -from esphomeyaml.components import output -from esphomeyaml.components.pca9685 import PCA9685OutputComponent -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_CHANNEL, CONF_ID, CONF_PCA9685_ID, CONF_POWER_SUPPLY -from esphomeyaml.cpp_generator import Pvariable, get_variable +from esphome.components import output +from esphome.components.pca9685 import PCA9685OutputComponent +import esphome.config_validation as cv +from esphome.const import CONF_CHANNEL, CONF_ID, CONF_PCA9685_ID, CONF_POWER_SUPPLY +from esphome.cpp_generator import Pvariable, get_variable DEPENDENCIES = ['pca9685'] diff --git a/esphomeyaml/components/pca9685.py b/esphome/components/pca9685.py similarity index 72% rename from esphomeyaml/components/pca9685.py rename to esphome/components/pca9685.py index e30758b310..0906db90d0 100644 --- a/esphomeyaml/components/pca9685.py +++ b/esphome/components/pca9685.py @@ -1,11 +1,11 @@ import voluptuous as vol -from esphomeyaml.components import i2c, output -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ADDRESS, CONF_FREQUENCY, CONF_ID -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Component +from esphome.components import i2c, output +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_FREQUENCY, CONF_ID +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Component DEPENDENCIES = ['i2c'] MULTI_CONF = True diff --git a/esphomeyaml/components/pcf8574.py b/esphome/components/pcf8574.py similarity index 74% rename from esphomeyaml/components/pcf8574.py rename to esphome/components/pcf8574.py index ef68413552..a5ab90a441 100644 --- a/esphomeyaml/components/pcf8574.py +++ b/esphome/components/pcf8574.py @@ -1,11 +1,11 @@ import voluptuous as vol -from esphomeyaml import pins -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ADDRESS, CONF_ID, CONF_PCF8575 -from esphomeyaml.cpp_generator import Pvariable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, GPIOInputPin, GPIOOutputPin, io_ns +from esphome import pins +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_ID, CONF_PCF8575 +from esphome.cpp_generator import Pvariable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, GPIOInputPin, GPIOOutputPin, io_ns DEPENDENCIES = ['i2c'] MULTI_CONF = True diff --git a/esphomeyaml/components/pn532.py b/esphome/components/pn532.py similarity index 72% rename from esphomeyaml/components/pn532.py rename to esphome/components/pn532.py index 9d2afbf0e5..ea188d3ae1 100644 --- a/esphomeyaml/components/pn532.py +++ b/esphome/components/pn532.py @@ -1,14 +1,14 @@ import voluptuous as vol -from esphomeyaml import automation, pins -from esphomeyaml.components import binary_sensor, spi -from esphomeyaml.components.spi import SPIComponent -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_CS_PIN, CONF_ID, CONF_ON_TAG, CONF_SPI_ID, CONF_TRIGGER_ID, \ +from esphome import automation, pins +from esphome.components import binary_sensor, spi +from esphome.components.spi import SPIComponent +import esphome.config_validation as cv +from esphome.const import CONF_CS_PIN, CONF_ID, CONF_ON_TAG, CONF_SPI_ID, CONF_TRIGGER_ID, \ CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import Pvariable, get_variable -from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component -from esphomeyaml.cpp_types import App, PollingComponent, Trigger, std_string +from esphome.cpp_generator import Pvariable, get_variable +from esphome.cpp_helpers import gpio_output_pin_expression, setup_component +from esphome.cpp_types import App, PollingComponent, Trigger, std_string DEPENDENCIES = ['spi'] MULTI_CONF = True diff --git a/esphomeyaml/components/power_supply.py b/esphome/components/power_supply.py similarity index 65% rename from esphomeyaml/components/power_supply.py rename to esphome/components/power_supply.py index de02c708e5..bb8501eb0d 100644 --- a/esphomeyaml/components/power_supply.py +++ b/esphome/components/power_supply.py @@ -1,13 +1,13 @@ import voluptuous as vol -from esphomeyaml import pins -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ENABLE_TIME, CONF_ID, CONF_KEEP_ON_TIME, CONF_PIN -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component -from esphomeyaml.cpp_types import App, Component, esphomelib_ns +from esphome import pins +import esphome.config_validation as cv +from esphome.const import CONF_ENABLE_TIME, CONF_ID, CONF_KEEP_ON_TIME, CONF_PIN +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import gpio_output_pin_expression, setup_component +from esphome.cpp_types import App, Component, esphome_ns -PowerSupplyComponent = esphomelib_ns.class_('PowerSupplyComponent', Component) +PowerSupplyComponent = esphome_ns.class_('PowerSupplyComponent', Component) MULTI_CONF = True diff --git a/esphomeyaml/components/rdm6300.py b/esphome/components/rdm6300.py similarity index 67% rename from esphomeyaml/components/rdm6300.py rename to esphome/components/rdm6300.py index 7f38895e98..5c89d83fb3 100644 --- a/esphomeyaml/components/rdm6300.py +++ b/esphome/components/rdm6300.py @@ -1,11 +1,11 @@ import voluptuous as vol -from esphomeyaml.components import binary_sensor, uart -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ID, CONF_UART_ID -from esphomeyaml.cpp_generator import Pvariable, get_variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Component +from esphome.components import binary_sensor, uart +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_UART_ID +from esphome.cpp_generator import Pvariable, get_variable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Component DEPENDENCIES = ['uart'] diff --git a/esphomeyaml/components/remote_receiver.py b/esphome/components/remote_receiver.py similarity index 81% rename from esphomeyaml/components/remote_receiver.py rename to esphome/components/remote_receiver.py index d1d6147379..cb909ef72f 100644 --- a/esphomeyaml/components/remote_receiver.py +++ b/esphome/components/remote_receiver.py @@ -1,15 +1,15 @@ import voluptuous as vol -from esphomeyaml import pins -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_BUFFER_SIZE, CONF_DUMP, CONF_FILTER, CONF_ID, CONF_IDLE, \ +from esphome import pins +import esphome.config_validation as cv +from esphome.const import CONF_BUFFER_SIZE, CONF_DUMP, CONF_FILTER, CONF_ID, CONF_IDLE, \ CONF_PIN, CONF_TOLERANCE -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_helpers import gpio_input_pin_expression, setup_component -from esphomeyaml.cpp_types import App, Component, esphomelib_ns -from esphomeyaml.py_compat import string_types +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import gpio_input_pin_expression, setup_component +from esphome.cpp_types import App, Component, esphome_ns +from esphome.py_compat import string_types -remote_ns = esphomelib_ns.namespace('remote') +remote_ns = esphome_ns.namespace('remote') MULTI_CONF = True RemoteControlComponentBase = remote_ns.class_('RemoteControlComponentBase') @@ -20,6 +20,7 @@ RemoteReceiverComponent = remote_ns.class_('RemoteReceiverComponent', RemoteReceiveDumper = remote_ns.class_('RemoteReceiveDumper') DUMPERS = { + 'jvc': remote_ns.class_('JVCDumper', RemoteReceiveDumper), 'lg': remote_ns.class_('LGDumper', RemoteReceiveDumper), 'nec': remote_ns.class_('NECDumper', RemoteReceiveDumper), 'panasonic': remote_ns.class_('PanasonicDumper', RemoteReceiveDumper), @@ -27,6 +28,7 @@ DUMPERS = { 'samsung': remote_ns.class_('SamsungDumper', RemoteReceiveDumper), 'sony': remote_ns.class_('SonyDumper', RemoteReceiveDumper), 'rc_switch': remote_ns.class_('RCSwitchDumper', RemoteReceiveDumper), + 'rc5': remote_ns.class_('RC5Dumper', RemoteReceiveDumper), } diff --git a/esphomeyaml/components/remote_transmitter.py b/esphome/components/remote_transmitter.py similarity index 89% rename from esphomeyaml/components/remote_transmitter.py rename to esphome/components/remote_transmitter.py index f0ae3636fa..d0e82826ee 100644 --- a/esphomeyaml/components/remote_transmitter.py +++ b/esphome/components/remote_transmitter.py @@ -1,16 +1,16 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components.remote_receiver import RemoteControlComponentBase, remote_ns -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ADDRESS, CONF_CARRIER_DUTY_PERCENT, CONF_CHANNEL, CONF_CODE, \ +from esphome import pins +from esphome.components.remote_receiver import RemoteControlComponentBase, remote_ns +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_CARRIER_DUTY_PERCENT, CONF_CHANNEL, CONF_CODE, \ CONF_DEVICE, CONF_FAMILY, CONF_GROUP, CONF_ID, CONF_INVERTED, CONF_ONE, CONF_PIN, \ CONF_PROTOCOL, CONF_PULSE_LENGTH, CONF_STATE, CONF_SYNC, CONF_ZERO -from esphomeyaml.core import HexInt -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component -from esphomeyaml.cpp_types import App, Component -from esphomeyaml.py_compat import text_type +from esphome.core import HexInt +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import gpio_output_pin_expression, setup_component +from esphome.cpp_types import App, Component +from esphome.py_compat import text_type RemoteTransmitterComponent = remote_ns.class_('RemoteTransmitterComponent', RemoteControlComponentBase, Component) diff --git a/esphomeyaml/components/script.py b/esphome/components/script.py similarity index 71% rename from esphomeyaml/components/script.py rename to esphome/components/script.py index 834179b121..b2641b2d6b 100644 --- a/esphomeyaml/components/script.py +++ b/esphome/components/script.py @@ -1,15 +1,15 @@ import voluptuous as vol -from esphomeyaml import automation -from esphomeyaml.automation import ACTION_REGISTRY, maybe_simple_id -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ID -from esphomeyaml.cpp_generator import Pvariable, get_variable -from esphomeyaml.cpp_types import Action, NoArg, Trigger, esphomelib_ns +from esphome import automation +from esphome.automation import ACTION_REGISTRY, maybe_simple_id +import esphome.config_validation as cv +from esphome.const import CONF_ID +from esphome.cpp_generator import Pvariable, get_variable +from esphome.cpp_types import Action, NoArg, Trigger, esphome_ns -Script = esphomelib_ns.class_('Script', Trigger.template(NoArg)) -ScriptExecuteAction = esphomelib_ns.class_('ScriptExecuteAction', Action) -ScriptStopAction = esphomelib_ns.class_('ScriptStopAction', Action) +Script = esphome_ns.class_('Script', Trigger.template(NoArg)) +ScriptExecuteAction = esphome_ns.class_('ScriptExecuteAction', Action) +ScriptStopAction = esphome_ns.class_('ScriptStopAction', Action) CONFIG_SCHEMA = automation.validate_automation({ vol.Required(CONF_ID): cv.declare_variable_id(Script), diff --git a/esphomeyaml/components/sensor/__init__.py b/esphome/components/sensor/__init__.py similarity index 82% rename from esphomeyaml/components/sensor/__init__.py rename to esphome/components/sensor/__init__.py index 5f8f52152f..3ec49b3728 100644 --- a/esphomeyaml/components/sensor/__init__.py +++ b/esphome/components/sensor/__init__.py @@ -1,22 +1,21 @@ import voluptuous as vol -from esphomeyaml import automation -from esphomeyaml.automation import CONDITION_REGISTRY -from esphomeyaml.components import mqtt -from esphomeyaml.components.mqtt import setup_mqtt_component -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ABOVE, CONF_ACCURACY_DECIMALS, CONF_ALPHA, CONF_BELOW, \ +from esphome import automation +from esphome.automation import CONDITION_REGISTRY +from esphome.components import mqtt +from esphome.components.mqtt import setup_mqtt_component +import esphome.config_validation as cv +from esphome.const import CONF_ABOVE, CONF_ACCURACY_DECIMALS, CONF_ALPHA, CONF_BELOW, \ CONF_DEBOUNCE, CONF_DELTA, CONF_EXPIRE_AFTER, CONF_EXPONENTIAL_MOVING_AVERAGE, CONF_FILTERS, \ CONF_FILTER_NAN, CONF_FILTER_OUT, CONF_HEARTBEAT, CONF_ICON, CONF_ID, CONF_INTERNAL, \ CONF_LAMBDA, CONF_MQTT_ID, CONF_MULTIPLY, CONF_OFFSET, CONF_ON_RAW_VALUE, CONF_ON_VALUE, \ CONF_ON_VALUE_RANGE, CONF_OR, CONF_SEND_EVERY, CONF_SEND_FIRST_AT, \ CONF_SLIDING_WINDOW_MOVING_AVERAGE, CONF_THROTTLE, CONF_TRIGGER_ID, CONF_UNIQUE, \ CONF_UNIT_OF_MEASUREMENT, CONF_WINDOW_SIZE -from esphomeyaml.core import CORE -from esphomeyaml.cpp_generator import ArrayInitializer, Pvariable, add, process_lambda, \ - templatable, get_variable -from esphomeyaml.cpp_types import App, Component, Nameable, PollingComponent, Trigger, \ - esphomelib_ns, float_, optional +from esphome.core import CORE +from esphome.cpp_generator import Pvariable, add, get_variable, process_lambda, templatable +from esphome.cpp_types import App, Component, Nameable, PollingComponent, Trigger, \ + esphome_ns, float_, optional PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ @@ -64,7 +63,7 @@ FILTERS_SCHEMA = cv.ensure_list({ }, cv.has_exactly_one_key(*FILTER_KEYS)) # Base -sensor_ns = esphomelib_ns.namespace('sensor') +sensor_ns = esphome_ns.namespace('sensor') Sensor = sensor_ns.class_('Sensor', Nameable) SensorPtr = Sensor.operator('ptr') MQTTSensorComponent = sensor_ns.class_('MQTTSensorComponent', mqtt.MQTTComponent) @@ -100,7 +99,8 @@ SENSOR_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend({ vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string_strict, vol.Optional(CONF_ICON): cv.icon, vol.Optional(CONF_ACCURACY_DECIMALS): vol.Coerce(int), - vol.Optional(CONF_EXPIRE_AFTER): vol.Any(None, cv.positive_time_period_milliseconds), + vol.Optional(CONF_EXPIRE_AFTER): vol.All(cv.requires_component('mqtt'), + vol.Any(None, cv.positive_time_period_milliseconds)), vol.Optional(CONF_FILTERS): FILTERS_SCHEMA, vol.Optional(CONF_ON_VALUE): automation.validate_automation({ cv.GenerateID(CONF_TRIGGER_ID): cv.declare_variable_id(SensorStateTrigger), @@ -135,7 +135,6 @@ def setup_filter(config): conf = config[CONF_EXPONENTIAL_MOVING_AVERAGE] yield ExponentialMovingAverageFilter.new(conf[CONF_ALPHA], conf[CONF_SEND_EVERY]) elif CONF_LAMBDA in config: - lambda_ = None for lambda_ in process_lambda(config[CONF_LAMBDA], [(float_, 'x')], return_type=optional.template(float_)): yield None @@ -145,7 +144,6 @@ def setup_filter(config): elif CONF_DELTA in config: yield DeltaFilter.new(config[CONF_DELTA]) elif CONF_OR in config: - filters = None for filters in setup_filters(config[CONF_OR]): yield None yield OrFilter.new(filters) @@ -160,14 +158,13 @@ def setup_filter(config): def setup_filters(config): filters = [] for conf in config: - filter = None for filter in setup_filter(conf): yield None filters.append(filter) - yield ArrayInitializer(*filters) + yield filters -def setup_sensor_core_(sensor_var, mqtt_var, config): +def setup_sensor_core_(sensor_var, config): if CONF_INTERNAL in config: add(sensor_var.set_internal(config[CONF_INTERNAL])) if CONF_UNIT_OF_MEASUREMENT in config: @@ -177,7 +174,6 @@ def setup_sensor_core_(sensor_var, mqtt_var, config): if CONF_ACCURACY_DECIMALS in config: add(sensor_var.set_accuracy_decimals(config[CONF_ACCURACY_DECIMALS])) if CONF_FILTERS in config: - filters = None for filters in setup_filters(config[CONF_FILTERS]): yield add(sensor_var.set_filters(filters)) @@ -204,29 +200,52 @@ def setup_sensor_core_(sensor_var, mqtt_var, config): add(trigger.set_max(template_)) automation.build_automation(trigger, float_, conf) + mqtt_ = sensor_var.Pget_mqtt() if CONF_EXPIRE_AFTER in config: if config[CONF_EXPIRE_AFTER] is None: - add(mqtt_var.disable_expire_after()) + add(mqtt_.disable_expire_after()) else: - add(mqtt_var.set_expire_after(config[CONF_EXPIRE_AFTER])) - setup_mqtt_component(mqtt_var, config) + add(mqtt_.set_expire_after(config[CONF_EXPIRE_AFTER])) + setup_mqtt_component(mqtt_, config) -def setup_sensor(sensor_obj, mqtt_obj, config): - sensor_var = Pvariable(config[CONF_ID], sensor_obj, has_side_effects=False) - mqtt_var = Pvariable(config[CONF_MQTT_ID], mqtt_obj, has_side_effects=False) - CORE.add_job(setup_sensor_core_, sensor_var, mqtt_var, config) +def setup_sensor(sensor_obj, config): + if not CORE.has_id(config[CONF_ID]): + sensor_obj = Pvariable(config[CONF_ID], sensor_obj, has_side_effects=True) + CORE.add_job(setup_sensor_core_, sensor_obj, config) def register_sensor(var, config): sensor_var = Pvariable(config[CONF_ID], var, has_side_effects=True) - rhs = App.register_sensor(sensor_var) - mqtt_var = Pvariable(config[CONF_MQTT_ID], rhs, has_side_effects=True) - CORE.add_job(setup_sensor_core_, sensor_var, mqtt_var, config) + add(App.register_sensor(sensor_var)) + CORE.add_job(setup_sensor_core_, sensor_var, config) BUILD_FLAGS = '-DUSE_SENSOR' +CONF_SENSOR_IN_RANGE = 'sensor.in_range' +SENSOR_IN_RANGE_CONDITION_SCHEMA = vol.All({ + vol.Required(CONF_ID): cv.use_variable_id(Sensor), + vol.Optional(CONF_ABOVE): cv.float_, + vol.Optional(CONF_BELOW): cv.float_, +}, cv.has_at_least_one_key(CONF_ABOVE, CONF_BELOW)) + + +@CONDITION_REGISTRY.register(CONF_SENSOR_IN_RANGE, SENSOR_IN_RANGE_CONDITION_SCHEMA) +def sensor_in_range_to_code(config, condition_id, arg_type, template_arg): + for var in get_variable(config[CONF_ID]): + yield None + rhs = var.make_sensor_in_range_condition(template_arg) + type = SensorInRangeCondition.template(arg_type) + cond = Pvariable(condition_id, rhs, type=type) + + if CONF_ABOVE in config: + add(cond.set_min(config[CONF_ABOVE])) + if CONF_BELOW in config: + add(cond.set_max(config[CONF_BELOW])) + + yield cond + CONF_SENSOR_IN_RANGE = 'sensor.in_range' SENSOR_IN_RANGE_CONDITION_SCHEMA = vol.All({ diff --git a/esphomeyaml/components/sensor/adc.py b/esphome/components/sensor/adc.py similarity index 71% rename from esphomeyaml/components/sensor/adc.py rename to esphome/components/sensor/adc.py index 7bf9ae9101..aacc544215 100644 --- a/esphomeyaml/components/sensor/adc.py +++ b/esphome/components/sensor/adc.py @@ -1,13 +1,12 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ATTENUATION, CONF_MAKE_ID, CONF_NAME, CONF_PIN, \ - CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import add, variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Application, global_ns +from esphome import pins +from esphome.components import sensor +import esphome.config_validation as cv +from esphome.const import CONF_ATTENUATION, CONF_ID, CONF_NAME, CONF_PIN, CONF_UPDATE_INTERVAL +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, global_ns ATTENUATION_MODES = { '0db': global_ns.ADC_0db, @@ -24,12 +23,10 @@ def validate_adc_pin(value): return pins.analog_pin(value) -MakeADCSensor = Application.struct('MakeADCSensor') ADCSensorComponent = sensor.sensor_ns.class_('ADCSensorComponent', sensor.PollingSensorComponent) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(ADCSensorComponent), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeADCSensor), vol.Required(CONF_PIN): validate_adc_pin, vol.Optional(CONF_ATTENUATION): vol.All(cv.only_on_esp32, cv.one_of(*ATTENUATION_MODES, lower=True)), @@ -43,11 +40,10 @@ def to_code(config): pin = 0 rhs = App.make_adc_sensor(config[CONF_NAME], pin, config.get(CONF_UPDATE_INTERVAL)) - make = variable(config[CONF_MAKE_ID], rhs) - adc = make.Padc + adc = Pvariable(config[CONF_ID], rhs) if CONF_ATTENUATION in config: add(adc.set_attenuation(ATTENUATION_MODES[config[CONF_ATTENUATION]])) - sensor.setup_sensor(adc, make.Pmqtt, config) + sensor.setup_sensor(adc, config) setup_component(adc, config) diff --git a/esphomeyaml/components/sensor/ads1115.py b/esphome/components/sensor/ads1115.py similarity index 86% rename from esphomeyaml/components/sensor/ads1115.py rename to esphome/components/sensor/ads1115.py index a5ae2eadbe..8d03fcc558 100644 --- a/esphomeyaml/components/sensor/ads1115.py +++ b/esphome/components/sensor/ads1115.py @@ -1,12 +1,12 @@ import voluptuous as vol -from esphomeyaml.components import sensor -from esphomeyaml.components.ads1115 import ADS1115Component -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ADS1115_ID, CONF_GAIN, CONF_MULTIPLEXER, CONF_NAME, \ +from esphome.components import sensor +from esphome.components.ads1115 import ADS1115Component +import esphome.config_validation as cv +from esphome.const import CONF_ADS1115_ID, CONF_GAIN, CONF_MULTIPLEXER, CONF_NAME, \ CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import get_variable -from esphomeyaml.py_compat import string_types +from esphome.cpp_generator import get_variable +from esphome.py_compat import string_types DEPENDENCIES = ['ads1115'] diff --git a/esphomeyaml/components/sensor/apds9960.py b/esphome/components/sensor/apds9960.py similarity index 75% rename from esphomeyaml/components/sensor/apds9960.py rename to esphome/components/sensor/apds9960.py index ddd9fd7d5b..225ab8ed06 100644 --- a/esphomeyaml/components/sensor/apds9960.py +++ b/esphome/components/sensor/apds9960.py @@ -1,10 +1,10 @@ import voluptuous as vol -from esphomeyaml.components import sensor -from esphomeyaml.components.apds9960 import APDS9960, CONF_APDS9960_ID -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_NAME, CONF_TYPE -from esphomeyaml.cpp_generator import get_variable +from esphome.components import sensor +from esphome.components.apds9960 import APDS9960, CONF_APDS9960_ID +import esphome.config_validation as cv +from esphome.const import CONF_NAME, CONF_TYPE +from esphome.cpp_generator import get_variable DEPENDENCIES = ['apds9960'] diff --git a/esphomeyaml/components/sensor/bh1750.py b/esphome/components/sensor/bh1750.py similarity index 67% rename from esphomeyaml/components/sensor/bh1750.py rename to esphome/components/sensor/bh1750.py index c4f36faaea..5a416a5d01 100644 --- a/esphomeyaml/components/sensor/bh1750.py +++ b/esphome/components/sensor/bh1750.py @@ -1,12 +1,12 @@ import voluptuous as vol -from esphomeyaml.components import i2c, sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ADDRESS, CONF_MAKE_ID, CONF_NAME, CONF_RESOLUTION, \ +from esphome.components import i2c, sensor +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_ID, CONF_NAME, CONF_RESOLUTION, \ CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import add, variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Application +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App DEPENDENCIES = ['i2c'] @@ -17,13 +17,11 @@ BH1750_RESOLUTIONS = { 0.5: BH1750Resolution.BH1750_RESOLUTION_0P5_LX, } -MakeBH1750Sensor = Application.struct('MakeBH1750Sensor') BH1750Sensor = sensor.sensor_ns.class_('BH1750Sensor', sensor.PollingSensorComponent, i2c.I2CDevice) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(BH1750Sensor), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBH1750Sensor), vol.Optional(CONF_ADDRESS, default=0x23): cv.i2c_address, vol.Optional(CONF_RESOLUTION): vol.All(cv.positive_float, cv.one_of(*BH1750_RESOLUTIONS)), vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, @@ -33,11 +31,10 @@ PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ def to_code(config): rhs = App.make_bh1750_sensor(config[CONF_NAME], config[CONF_ADDRESS], config.get(CONF_UPDATE_INTERVAL)) - make_bh1750 = variable(config[CONF_MAKE_ID], rhs) - bh1750 = make_bh1750.Pbh1750 + bh1750 = Pvariable(config[CONF_ID], rhs) if CONF_RESOLUTION in config: add(bh1750.set_resolution(BH1750_RESOLUTIONS[config[CONF_RESOLUTION]])) - sensor.setup_sensor(bh1750, make_bh1750.Pmqtt, config) + sensor.setup_sensor(bh1750, config) setup_component(bh1750, config) diff --git a/esphomeyaml/components/sensor/ble_rssi.py b/esphome/components/sensor/ble_rssi.py similarity index 61% rename from esphomeyaml/components/sensor/ble_rssi.py rename to esphome/components/sensor/ble_rssi.py index f8856c5e89..ccdc157b0e 100644 --- a/esphomeyaml/components/sensor/ble_rssi.py +++ b/esphome/components/sensor/ble_rssi.py @@ -1,16 +1,16 @@ import voluptuous as vol -from esphomeyaml.components import sensor -from esphomeyaml.components.esp32_ble_tracker import CONF_ESP32_BLE_ID, ESP32BLETracker, \ +from esphome.components import sensor +from esphome.components.esp32_ble_tracker import CONF_ESP32_BLE_ID, ESP32BLETracker, \ make_address_array -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_MAC_ADDRESS, CONF_NAME -from esphomeyaml.cpp_generator import get_variable -from esphomeyaml.cpp_types import esphomelib_ns +import esphome.config_validation as cv +from esphome.const import CONF_MAC_ADDRESS, CONF_NAME +from esphome.cpp_generator import get_variable +from esphome.cpp_types import esphome_ns DEPENDENCIES = ['esp32_ble_tracker'] -ESP32BLERSSISensor = esphomelib_ns.class_('ESP32BLERSSISensor', sensor.Sensor) +ESP32BLERSSISensor = esphome_ns.class_('ESP32BLERSSISensor', sensor.Sensor) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(ESP32BLERSSISensor), diff --git a/esphomeyaml/components/sensor/bme280.py b/esphome/components/sensor/bme280.py similarity index 78% rename from esphomeyaml/components/sensor/bme280.py rename to esphome/components/sensor/bme280.py index b100c3579b..d4b8a5e10b 100644 --- a/esphomeyaml/components/sensor/bme280.py +++ b/esphome/components/sensor/bme280.py @@ -1,12 +1,12 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml.components import sensor -from esphomeyaml.const import CONF_ADDRESS, CONF_HUMIDITY, CONF_IIR_FILTER, CONF_MAKE_ID, \ - CONF_NAME, CONF_OVERSAMPLING, CONF_PRESSURE, CONF_TEMPERATURE, CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import variable, add -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import Application, App +from esphome.components import i2c, sensor +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_HUMIDITY, CONF_ID, CONF_IIR_FILTER, CONF_NAME, \ + CONF_OVERSAMPLING, CONF_PRESSURE, CONF_TEMPERATURE, CONF_UPDATE_INTERVAL +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, PollingComponent DEPENDENCIES = ['i2c'] @@ -33,7 +33,7 @@ BME280_OVERSAMPLING_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({ vol.Optional(CONF_OVERSAMPLING): cv.one_of(*OVERSAMPLING_OPTIONS, upper=True), }) -MakeBME280Sensor = Application.struct('MakeBME280Sensor') +BME280Component = sensor.sensor_ns.class_('BME280Component', PollingComponent, i2c.I2CDevice) BME280TemperatureSensor = sensor.sensor_ns.class_('BME280TemperatureSensor', sensor.EmptyPollingParentSensor) BME280PressureSensor = sensor.sensor_ns.class_('BME280PressureSensor', @@ -42,7 +42,7 @@ BME280HumiditySensor = sensor.sensor_ns.class_('BME280HumiditySensor', sensor.EmptyPollingParentSensor) PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBME280Sensor), + cv.GenerateID(): cv.declare_variable_id(BME280Component), vol.Optional(CONF_ADDRESS, default=0x77): cv.i2c_address, vol.Required(CONF_TEMPERATURE): cv.nameable(BME280_OVERSAMPLING_SENSOR_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(BME280TemperatureSensor), @@ -64,8 +64,7 @@ def to_code(config): config[CONF_HUMIDITY][CONF_NAME], config[CONF_ADDRESS], config.get(CONF_UPDATE_INTERVAL)) - make = variable(config[CONF_MAKE_ID], rhs) - bme280 = make.Pbme280 + bme280 = Pvariable(config[CONF_ID], rhs) if CONF_OVERSAMPLING in config[CONF_TEMPERATURE]: constant = OVERSAMPLING_OPTIONS[config[CONF_TEMPERATURE][CONF_OVERSAMPLING]] add(bme280.set_temperature_oversampling(constant)) @@ -79,12 +78,9 @@ def to_code(config): constant = IIR_FILTER_OPTIONS[config[CONF_IIR_FILTER]] add(bme280.set_iir_filter(constant)) - sensor.setup_sensor(bme280.Pget_temperature_sensor(), make.Pmqtt_temperature, - config[CONF_TEMPERATURE]) - sensor.setup_sensor(bme280.Pget_pressure_sensor(), make.Pmqtt_pressure, - config[CONF_PRESSURE]) - sensor.setup_sensor(bme280.Pget_humidity_sensor(), make.Pmqtt_humidity, - config[CONF_HUMIDITY]) + sensor.setup_sensor(bme280.Pget_temperature_sensor(), config[CONF_TEMPERATURE]) + sensor.setup_sensor(bme280.Pget_pressure_sensor(), config[CONF_PRESSURE]) + sensor.setup_sensor(bme280.Pget_humidity_sensor(), config[CONF_HUMIDITY]) setup_component(bme280, config) diff --git a/esphomeyaml/components/sensor/bme680.py b/esphome/components/sensor/bme680.py similarity index 79% rename from esphomeyaml/components/sensor/bme680.py rename to esphome/components/sensor/bme680.py index 2864200c86..bc32f8d132 100644 --- a/esphomeyaml/components/sensor/bme680.py +++ b/esphome/components/sensor/bme680.py @@ -1,14 +1,14 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml import core -from esphomeyaml.components import sensor -from esphomeyaml.const import CONF_ADDRESS, CONF_GAS_RESISTANCE, CONF_HUMIDITY, CONF_IIR_FILTER, \ - CONF_MAKE_ID, CONF_NAME, CONF_OVERSAMPLING, CONF_PRESSURE, CONF_TEMPERATURE, \ - CONF_UPDATE_INTERVAL, CONF_HEATER, CONF_DURATION -from esphomeyaml.cpp_generator import variable, add -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import Application, App +from esphome import core +from esphome.components import i2c, sensor +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_DURATION, CONF_GAS_RESISTANCE, CONF_HEATER, \ + CONF_HUMIDITY, CONF_ID, CONF_IIR_FILTER, CONF_NAME, CONF_OVERSAMPLING, CONF_PRESSURE, \ + CONF_TEMPERATURE, CONF_UPDATE_INTERVAL +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, PollingComponent DEPENDENCIES = ['i2c'] @@ -38,7 +38,7 @@ BME680_OVERSAMPLING_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({ vol.Optional(CONF_OVERSAMPLING): cv.one_of(*OVERSAMPLING_OPTIONS, upper=True), }) -MakeBME680Sensor = Application.struct('MakeBME680Sensor') +BME680Component = sensor.sensor_ns.class_('BME680Component', PollingComponent, i2c.I2CDevice) BME680TemperatureSensor = sensor.sensor_ns.class_('BME680TemperatureSensor', sensor.EmptyPollingParentSensor) BME680PressureSensor = sensor.sensor_ns.class_('BME680PressureSensor', @@ -49,7 +49,7 @@ BME680GasResistanceSensor = sensor.sensor_ns.class_('BME680GasResistanceSensor', sensor.EmptyPollingParentSensor) PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBME680Sensor), + cv.GenerateID(): cv.declare_variable_id(BME680Component), vol.Optional(CONF_ADDRESS, default=0x76): cv.i2c_address, vol.Required(CONF_TEMPERATURE): cv.nameable(BME680_OVERSAMPLING_SENSOR_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(BME680TemperatureSensor), @@ -80,8 +80,7 @@ def to_code(config): config[CONF_GAS_RESISTANCE][CONF_NAME], config[CONF_ADDRESS], config.get(CONF_UPDATE_INTERVAL)) - make = variable(config[CONF_MAKE_ID], rhs) - bme680 = make.Pbme680 + bme680 = Pvariable(config[CONF_ID], rhs) if CONF_OVERSAMPLING in config[CONF_TEMPERATURE]: constant = OVERSAMPLING_OPTIONS[config[CONF_TEMPERATURE][CONF_OVERSAMPLING]] add(bme680.set_temperature_oversampling(constant)) @@ -101,14 +100,10 @@ def to_code(config): else: add(bme680.set_heater(conf[CONF_TEMPERATURE], conf[CONF_DURATION])) - sensor.setup_sensor(bme680.Pget_temperature_sensor(), make.Pmqtt_temperature, - config[CONF_TEMPERATURE]) - sensor.setup_sensor(bme680.Pget_pressure_sensor(), make.Pmqtt_pressure, - config[CONF_PRESSURE]) - sensor.setup_sensor(bme680.Pget_humidity_sensor(), make.Pmqtt_humidity, - config[CONF_HUMIDITY]) - sensor.setup_sensor(bme680.Pget_gas_resistance_sensor(), make.Pmqtt_gas_resistance, - config[CONF_GAS_RESISTANCE]) + sensor.setup_sensor(bme680.Pget_temperature_sensor(), config[CONF_TEMPERATURE]) + sensor.setup_sensor(bme680.Pget_pressure_sensor(), config[CONF_PRESSURE]) + sensor.setup_sensor(bme680.Pget_humidity_sensor(), config[CONF_HUMIDITY]) + sensor.setup_sensor(bme680.Pget_gas_resistance_sensor(), config[CONF_GAS_RESISTANCE]) setup_component(bme680, config) diff --git a/esphomeyaml/components/sensor/bmp085.py b/esphome/components/sensor/bmp085.py similarity index 59% rename from esphomeyaml/components/sensor/bmp085.py rename to esphome/components/sensor/bmp085.py index 2c622a7c8f..9886ce1766 100644 --- a/esphomeyaml/components/sensor/bmp085.py +++ b/esphome/components/sensor/bmp085.py @@ -1,23 +1,23 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml.components import sensor -from esphomeyaml.const import CONF_ADDRESS, CONF_MAKE_ID, CONF_NAME, CONF_PRESSURE, \ - CONF_TEMPERATURE, CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import variable, add, HexIntLiteral -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import Application, App +from esphome.components import i2c, sensor +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_ID, CONF_NAME, CONF_PRESSURE, CONF_TEMPERATURE, \ + CONF_UPDATE_INTERVAL +from esphome.cpp_generator import HexIntLiteral, Pvariable, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, PollingComponent DEPENDENCIES = ['i2c'] -MakeBMP085Sensor = Application.struct('MakeBMP085Sensor') +BMP085Component = sensor.sensor_ns.class_('BMP085Component', PollingComponent, i2c.I2CDevice) BMP085TemperatureSensor = sensor.sensor_ns.class_('BMP085TemperatureSensor', sensor.EmptyPollingParentSensor) BMP085PressureSensor = sensor.sensor_ns.class_('BMP085PressureSensor', sensor.EmptyPollingParentSensor) PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBMP085Sensor), + cv.GenerateID(): cv.declare_variable_id(BMP085Component), vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(BMP085TemperatureSensor), })), @@ -33,15 +33,13 @@ def to_code(config): rhs = App.make_bmp085_sensor(config[CONF_TEMPERATURE][CONF_NAME], config[CONF_PRESSURE][CONF_NAME], config.get(CONF_UPDATE_INTERVAL)) - bmp = variable(config[CONF_MAKE_ID], rhs) + bmp = Pvariable(config[CONF_ID], rhs) if CONF_ADDRESS in config: - add(bmp.Pbmp.set_address(HexIntLiteral(config[CONF_ADDRESS]))) + add(bmp.set_address(HexIntLiteral(config[CONF_ADDRESS]))) - sensor.setup_sensor(bmp.Pbmp.Pget_temperature_sensor(), bmp.Pmqtt_temperature, - config[CONF_TEMPERATURE]) - sensor.setup_sensor(bmp.Pbmp.Pget_pressure_sensor(), bmp.Pmqtt_pressure, - config[CONF_PRESSURE]) - setup_component(bmp.Pbmp, config) + sensor.setup_sensor(bmp.Pget_temperature_sensor(), config[CONF_TEMPERATURE]) + sensor.setup_sensor(bmp.Pget_pressure_sensor(), config[CONF_PRESSURE]) + setup_component(bmp, config) BUILD_FLAGS = '-DUSE_BMP085_SENSOR' diff --git a/esphomeyaml/components/sensor/bmp280.py b/esphome/components/sensor/bmp280.py similarity index 77% rename from esphomeyaml/components/sensor/bmp280.py rename to esphome/components/sensor/bmp280.py index 2182782b93..74deeb9501 100644 --- a/esphomeyaml/components/sensor/bmp280.py +++ b/esphome/components/sensor/bmp280.py @@ -1,12 +1,12 @@ import voluptuous as vol -from esphomeyaml.components import sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ADDRESS, CONF_IIR_FILTER, CONF_MAKE_ID, \ - CONF_NAME, CONF_OVERSAMPLING, CONF_PRESSURE, CONF_TEMPERATURE, CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import add, variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Application +from esphome.components import i2c, sensor +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_ID, CONF_IIR_FILTER, CONF_NAME, \ + CONF_OVERSAMPLING, CONF_PRESSURE, CONF_TEMPERATURE, CONF_UPDATE_INTERVAL +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, PollingComponent DEPENDENCIES = ['i2c'] @@ -33,14 +33,14 @@ BMP280_OVERSAMPLING_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({ vol.Optional(CONF_OVERSAMPLING): cv.one_of(*OVERSAMPLING_OPTIONS, upper=True), }) -MakeBMP280Sensor = Application.struct('MakeBMP280Sensor') +BMP280Component = sensor.sensor_ns.class_('BMP280Component', PollingComponent, i2c.I2CDevice) BMP280TemperatureSensor = sensor.sensor_ns.class_('BMP280TemperatureSensor', sensor.EmptyPollingParentSensor) BMP280PressureSensor = sensor.sensor_ns.class_('BMP280PressureSensor', sensor.EmptyPollingParentSensor) PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBMP280Sensor), + cv.GenerateID(): cv.declare_variable_id(BMP280Component), vol.Optional(CONF_ADDRESS, default=0x77): cv.i2c_address, vol.Required(CONF_TEMPERATURE): cv.nameable(BMP280_OVERSAMPLING_SENSOR_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(BMP280TemperatureSensor), @@ -58,8 +58,7 @@ def to_code(config): config[CONF_PRESSURE][CONF_NAME], config[CONF_ADDRESS], config.get(CONF_UPDATE_INTERVAL)) - make = variable(config[CONF_MAKE_ID], rhs) - bmp280 = make.Pbmp280 + bmp280 = Pvariable(config[CONF_ID], rhs) if CONF_OVERSAMPLING in config[CONF_TEMPERATURE]: constant = OVERSAMPLING_OPTIONS[config[CONF_TEMPERATURE][CONF_OVERSAMPLING]] add(bmp280.set_temperature_oversampling(constant)) @@ -70,10 +69,8 @@ def to_code(config): constant = IIR_FILTER_OPTIONS[config[CONF_IIR_FILTER]] add(bmp280.set_iir_filter(constant)) - sensor.setup_sensor(bmp280.Pget_temperature_sensor(), make.Pmqtt_temperature, - config[CONF_TEMPERATURE]) - sensor.setup_sensor(bmp280.Pget_pressure_sensor(), make.Pmqtt_pressure, - config[CONF_PRESSURE]) + sensor.setup_sensor(bmp280.Pget_temperature_sensor(), config[CONF_TEMPERATURE]) + sensor.setup_sensor(bmp280.Pget_pressure_sensor(), config[CONF_PRESSURE]) setup_component(bmp280, config) diff --git a/esphomeyaml/components/sensor/cse7766.py b/esphome/components/sensor/cse7766.py similarity index 85% rename from esphomeyaml/components/sensor/cse7766.py rename to esphome/components/sensor/cse7766.py index c436ac31c5..d2d38b8c76 100644 --- a/esphomeyaml/components/sensor/cse7766.py +++ b/esphome/components/sensor/cse7766.py @@ -1,13 +1,13 @@ import voluptuous as vol -from esphomeyaml.components import sensor, uart -from esphomeyaml.components.uart import UARTComponent -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_CURRENT, CONF_ID, CONF_NAME, CONF_POWER, CONF_UART_ID, \ +from esphome.components import sensor, uart +from esphome.components.uart import UARTComponent +import esphome.config_validation as cv +from esphome.const import CONF_CURRENT, CONF_ID, CONF_NAME, CONF_POWER, CONF_UART_ID, \ CONF_UPDATE_INTERVAL, CONF_VOLTAGE -from esphomeyaml.cpp_generator import Pvariable, get_variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, PollingComponent +from esphome.cpp_generator import Pvariable, get_variable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, PollingComponent DEPENDENCIES = ['uart'] diff --git a/esphomeyaml/components/sensor/custom.py b/esphome/components/sensor/custom.py similarity index 66% rename from esphomeyaml/components/sensor/custom.py rename to esphome/components/sensor/custom.py index a87fef6604..3e73ef3581 100644 --- a/esphomeyaml/components/sensor/custom.py +++ b/esphome/components/sensor/custom.py @@ -1,10 +1,10 @@ import voluptuous as vol -from esphomeyaml.components import sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ID, CONF_LAMBDA, CONF_SENSORS -from esphomeyaml.cpp_generator import process_lambda, variable -from esphomeyaml.cpp_types import std_vector +from esphome.components import sensor +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_LAMBDA, CONF_NAME, CONF_SENSORS +from esphome.cpp_generator import add, process_lambda, variable +from esphome.cpp_types import std_vector CustomSensorConstructor = sensor.sensor_ns.class_('CustomSensorConstructor') @@ -24,8 +24,10 @@ def to_code(config): rhs = CustomSensorConstructor(template_) custom = variable(config[CONF_ID], rhs) - for i, sens in enumerate(config[CONF_SENSORS]): - sensor.register_sensor(custom.get_sensor(i), sens) + for i, conf in enumerate(config[CONF_SENSORS]): + rhs = custom.Pget_sensor(i) + add(rhs.set_name(conf[CONF_NAME])) + sensor.register_sensor(rhs, conf) BUILD_FLAGS = '-DUSE_CUSTOM_SENSOR' diff --git a/esphomeyaml/components/sensor/dallas.py b/esphome/components/sensor/dallas.py similarity index 81% rename from esphomeyaml/components/sensor/dallas.py rename to esphome/components/sensor/dallas.py index c26917fced..aaf8603344 100644 --- a/esphomeyaml/components/sensor/dallas.py +++ b/esphome/components/sensor/dallas.py @@ -1,11 +1,11 @@ import voluptuous as vol -from esphomeyaml.components import sensor -from esphomeyaml.components.dallas import DallasComponent -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ADDRESS, CONF_DALLAS_ID, CONF_INDEX, CONF_NAME, \ +from esphome.components import sensor +from esphome.components.dallas import DallasComponent +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_DALLAS_ID, CONF_INDEX, CONF_NAME, \ CONF_RESOLUTION -from esphomeyaml.cpp_generator import HexIntLiteral, get_variable +from esphome.cpp_generator import HexIntLiteral, get_variable DallasTemperatureSensor = sensor.sensor_ns.class_('DallasTemperatureSensor', sensor.EmptyPollingParentSensor) diff --git a/esphomeyaml/components/sensor/dht.py b/esphome/components/sensor/dht.py similarity index 68% rename from esphomeyaml/components/sensor/dht.py rename to esphome/components/sensor/dht.py index 269687be36..8cc680d7cc 100644 --- a/esphomeyaml/components/sensor/dht.py +++ b/esphome/components/sensor/dht.py @@ -1,13 +1,13 @@ import voluptuous as vol -from esphomeyaml.components import sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_HUMIDITY, CONF_ID, CONF_MAKE_ID, CONF_MODEL, CONF_NAME, \ +from esphome.components import sensor +import esphome.config_validation as cv +from esphome.const import CONF_HUMIDITY, CONF_ID, CONF_MODEL, CONF_NAME, \ CONF_PIN, CONF_TEMPERATURE, CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import Pvariable, add, variable -from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component -from esphomeyaml.cpp_types import App, Application, PollingComponent -from esphomeyaml.pins import gpio_input_pullup_pin_schema +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import gpio_output_pin_expression, setup_component +from esphome.cpp_types import App, PollingComponent +from esphome.pins import gpio_input_pullup_pin_schema DHTModel = sensor.sensor_ns.enum('DHTModel') DHT_MODELS = { @@ -16,9 +16,9 @@ DHT_MODELS = { 'DHT22': DHTModel.DHT_MODEL_DHT22, 'AM2302': DHTModel.DHT_MODEL_AM2302, 'RHT03': DHTModel.DHT_MODEL_RHT03, + 'SI7021': DHTModel.DHT_MODEL_SI7021, } -MakeDHTSensor = Application.struct('MakeDHTSensor') DHTComponent = sensor.sensor_ns.class_('DHTComponent', PollingComponent) DHTTemperatureSensor = sensor.sensor_ns.class_('DHTTemperatureSensor', sensor.EmptyPollingParentSensor) @@ -26,7 +26,6 @@ DHTHumiditySensor = sensor.sensor_ns.class_('DHTHumiditySensor', sensor.EmptyPollingParentSensor) PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeDHTSensor), cv.GenerateID(): cv.declare_variable_id(DHTComponent), vol.Required(CONF_PIN): gpio_input_pullup_pin_schema, vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ @@ -46,18 +45,14 @@ def to_code(config): rhs = App.make_dht_sensor(config[CONF_TEMPERATURE][CONF_NAME], config[CONF_HUMIDITY][CONF_NAME], pin, config.get(CONF_UPDATE_INTERVAL)) - make = variable(config[CONF_MAKE_ID], rhs) - dht = make.Pdht - Pvariable(config[CONF_ID], dht) + dht = Pvariable(config[CONF_ID], rhs) if CONF_MODEL in config: constant = DHT_MODELS[config[CONF_MODEL]] add(dht.set_dht_model(constant)) - sensor.setup_sensor(dht.Pget_temperature_sensor(), - make.Pmqtt_temperature, config[CONF_TEMPERATURE]) - sensor.setup_sensor(dht.Pget_humidity_sensor(), - make.Pmqtt_humidity, config[CONF_HUMIDITY]) + sensor.setup_sensor(dht.Pget_temperature_sensor(), config[CONF_TEMPERATURE]) + sensor.setup_sensor(dht.Pget_humidity_sensor(), config[CONF_HUMIDITY]) setup_component(dht, config) diff --git a/esphomeyaml/components/sensor/dht12.py b/esphome/components/sensor/dht12.py similarity index 63% rename from esphomeyaml/components/sensor/dht12.py rename to esphome/components/sensor/dht12.py index f9a97d394f..c457eec803 100644 --- a/esphomeyaml/components/sensor/dht12.py +++ b/esphome/components/sensor/dht12.py @@ -1,16 +1,15 @@ import voluptuous as vol -from esphomeyaml.components import i2c, sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_HUMIDITY, CONF_ID, CONF_MAKE_ID, CONF_NAME, CONF_TEMPERATURE, \ +from esphome.components import i2c, sensor +import esphome.config_validation as cv +from esphome.const import CONF_HUMIDITY, CONF_ID, CONF_NAME, CONF_TEMPERATURE, \ CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import Pvariable, variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Application, PollingComponent +from esphome.cpp_generator import Pvariable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, PollingComponent DEPENDENCIES = ['i2c'] -MakeDHT12Sensor = Application.struct('MakeDHT12Sensor') DHT12Component = sensor.sensor_ns.class_('DHT12Component', PollingComponent, i2c.I2CDevice) DHT12TemperatureSensor = sensor.sensor_ns.class_('DHT12TemperatureSensor', sensor.EmptyPollingParentSensor) @@ -18,7 +17,6 @@ DHT12HumiditySensor = sensor.sensor_ns.class_('DHT12HumiditySensor', sensor.EmptyPollingParentSensor) PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeDHT12Sensor), cv.GenerateID(): cv.declare_variable_id(DHT12Component), vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(DHT12TemperatureSensor), @@ -34,14 +32,10 @@ def to_code(config): rhs = App.make_dht12_sensor(config[CONF_TEMPERATURE][CONF_NAME], config[CONF_HUMIDITY][CONF_NAME], config.get(CONF_UPDATE_INTERVAL)) - make = variable(config[CONF_MAKE_ID], rhs) - dht = make.Pdht12 - Pvariable(config[CONF_ID], dht) + dht = Pvariable(config[CONF_ID], rhs) - sensor.setup_sensor(dht.Pget_temperature_sensor(), make.Pmqtt_temperature, - config[CONF_TEMPERATURE]) - sensor.setup_sensor(dht.Pget_humidity_sensor(), make.Pmqtt_humidity, - config[CONF_HUMIDITY]) + sensor.setup_sensor(dht.Pget_temperature_sensor(), config[CONF_TEMPERATURE]) + sensor.setup_sensor(dht.Pget_humidity_sensor(), config[CONF_HUMIDITY]) setup_component(dht, config) diff --git a/esphomeyaml/components/sensor/duty_cycle.py b/esphome/components/sensor/duty_cycle.py similarity index 53% rename from esphomeyaml/components/sensor/duty_cycle.py rename to esphome/components/sensor/duty_cycle.py index 13f94d231f..a083015a3f 100644 --- a/esphomeyaml/components/sensor/duty_cycle.py +++ b/esphome/components/sensor/duty_cycle.py @@ -1,19 +1,17 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_PIN, CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import variable -from esphomeyaml.cpp_helpers import gpio_input_pin_expression, setup_component -from esphomeyaml.cpp_types import App, Application +from esphome import pins +from esphome.components import sensor +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_NAME, CONF_PIN, CONF_UPDATE_INTERVAL +from esphome.cpp_generator import Pvariable +from esphome.cpp_helpers import gpio_input_pin_expression, setup_component +from esphome.cpp_types import App -MakeDutyCycleSensor = Application.struct('MakeDutyCycleSensor') DutyCycleSensor = sensor.sensor_ns.class_('DutyCycleSensor', sensor.PollingSensorComponent) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(DutyCycleSensor), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeDutyCycleSensor), vol.Required(CONF_PIN): pins.internal_gpio_input_pin_schema, vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema)) @@ -24,9 +22,9 @@ def to_code(config): yield rhs = App.make_duty_cycle_sensor(config[CONF_NAME], pin, config.get(CONF_UPDATE_INTERVAL)) - make = variable(config[CONF_MAKE_ID], rhs) - sensor.setup_sensor(make.Pduty, make.Pmqtt, config) - setup_component(make.Pduty, config) + duty = Pvariable(config[CONF_ID], rhs) + sensor.setup_sensor(duty, config) + setup_component(duty, config) BUILD_FLAGS = '-DUSE_DUTY_CYCLE_SENSOR' diff --git a/esphomeyaml/components/sensor/esp32_hall.py b/esphome/components/sensor/esp32_hall.py similarity index 55% rename from esphomeyaml/components/sensor/esp32_hall.py rename to esphome/components/sensor/esp32_hall.py index dbcb540024..7cb31c1795 100644 --- a/esphomeyaml/components/sensor/esp32_hall.py +++ b/esphome/components/sensor/esp32_hall.py @@ -1,11 +1,11 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml.components import sensor -from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_UPDATE_INTERVAL, ESP_PLATFORM_ESP32 -from esphomeyaml.cpp_generator import variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import Application, App +from esphome.components import sensor +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_NAME, CONF_UPDATE_INTERVAL, ESP_PLATFORM_ESP32 +from esphome.cpp_generator import Pvariable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Application ESP_PLATFORMS = [ESP_PLATFORM_ESP32] @@ -14,16 +14,15 @@ ESP32HallSensor = sensor.sensor_ns.class_('ESP32HallSensor', sensor.PollingSenso PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(ESP32HallSensor), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeESP32HallSensor), vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema)) def to_code(config): rhs = App.make_esp32_hall_sensor(config[CONF_NAME], config.get(CONF_UPDATE_INTERVAL)) - make = variable(config[CONF_MAKE_ID], rhs) - sensor.setup_sensor(make.Phall, make.Pmqtt, config) - setup_component(make.Phall, config) + hall = Pvariable(config[CONF_ID], rhs) + sensor.setup_sensor(hall, config) + setup_component(hall, config) BUILD_FLAGS = '-DUSE_ESP32_HALL_SENSOR' diff --git a/esphomeyaml/components/sensor/hdc1080.py b/esphome/components/sensor/hdc1080.py similarity index 61% rename from esphomeyaml/components/sensor/hdc1080.py rename to esphome/components/sensor/hdc1080.py index 08e0c2a6d3..a85f7a1d14 100644 --- a/esphomeyaml/components/sensor/hdc1080.py +++ b/esphome/components/sensor/hdc1080.py @@ -1,16 +1,15 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml.components import sensor, i2c -from esphomeyaml.const import CONF_HUMIDITY, CONF_MAKE_ID, CONF_NAME, CONF_TEMPERATURE, \ - CONF_UPDATE_INTERVAL, CONF_ID -from esphomeyaml.cpp_generator import variable, Pvariable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import Application, PollingComponent, App +from esphome.components import i2c, sensor +import esphome.config_validation as cv +from esphome.const import CONF_HUMIDITY, CONF_ID, CONF_NAME, CONF_TEMPERATURE, \ + CONF_UPDATE_INTERVAL +from esphome.cpp_generator import Pvariable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, PollingComponent DEPENDENCIES = ['i2c'] -MakeHDC1080Sensor = Application.struct('MakeHDC1080Sensor') HDC1080Component = sensor.sensor_ns.class_('HDC1080Component', PollingComponent, i2c.I2CDevice) HDC1080TemperatureSensor = sensor.sensor_ns.class_('HDC1080TemperatureSensor', sensor.EmptyPollingParentSensor) @@ -18,7 +17,6 @@ HDC1080HumiditySensor = sensor.sensor_ns.class_('HDC1080HumiditySensor', sensor.EmptyPollingParentSensor) PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHDC1080Sensor), cv.GenerateID(): cv.declare_variable_id(HDC1080Component), vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(HDC1080TemperatureSensor), @@ -34,15 +32,10 @@ def to_code(config): rhs = App.make_hdc1080_sensor(config[CONF_TEMPERATURE][CONF_NAME], config[CONF_HUMIDITY][CONF_NAME], config.get(CONF_UPDATE_INTERVAL)) - make = variable(config[CONF_MAKE_ID], rhs) - hdc1080 = make.Phdc1080 - Pvariable(config[CONF_ID], hdc1080) + hdc1080 = Pvariable(config[CONF_ID], rhs) - sensor.setup_sensor(hdc1080.Pget_temperature_sensor(), - make.Pmqtt_temperature, - config[CONF_TEMPERATURE]) - sensor.setup_sensor(hdc1080.Pget_humidity_sensor(), make.Pmqtt_humidity, - config[CONF_HUMIDITY]) + sensor.setup_sensor(hdc1080.Pget_temperature_sensor(), config[CONF_TEMPERATURE]) + sensor.setup_sensor(hdc1080.Pget_humidity_sensor(), config[CONF_HUMIDITY]) setup_component(hdc1080, config) diff --git a/esphomeyaml/components/sensor/hlw8012.py b/esphome/components/sensor/hlw8012.py similarity index 88% rename from esphomeyaml/components/sensor/hlw8012.py rename to esphome/components/sensor/hlw8012.py index 5c57c5ed24..f5a72e22af 100644 --- a/esphomeyaml/components/sensor/hlw8012.py +++ b/esphome/components/sensor/hlw8012.py @@ -1,14 +1,14 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_CF1_PIN, CONF_CF_PIN, CONF_CHANGE_MODE_EVERY, CONF_CURRENT, \ +from esphome import pins +from esphome.components import sensor +import esphome.config_validation as cv +from esphome.const import CONF_CF1_PIN, CONF_CF_PIN, CONF_CHANGE_MODE_EVERY, CONF_CURRENT, \ CONF_CURRENT_RESISTOR, CONF_ID, CONF_NAME, CONF_POWER, CONF_SEL_PIN, CONF_UPDATE_INTERVAL, \ CONF_VOLTAGE, CONF_VOLTAGE_DIVIDER -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component -from esphomeyaml.cpp_types import PollingComponent, App +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import gpio_output_pin_expression, setup_component +from esphome.cpp_types import App, PollingComponent HLW8012Component = sensor.sensor_ns.class_('HLW8012Component', PollingComponent) HLW8012VoltageSensor = sensor.sensor_ns.class_('HLW8012VoltageSensor', sensor.EmptySensor) diff --git a/esphomeyaml/components/sensor/hmc5883l.py b/esphome/components/sensor/hmc5883l.py similarity index 91% rename from esphomeyaml/components/sensor/hmc5883l.py rename to esphome/components/sensor/hmc5883l.py index 61d9cb1c84..4ac7a75cf8 100644 --- a/esphomeyaml/components/sensor/hmc5883l.py +++ b/esphome/components/sensor/hmc5883l.py @@ -1,12 +1,12 @@ # coding=utf-8 import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml.components import sensor, i2c -from esphomeyaml.const import CONF_ADDRESS, CONF_ID, CONF_NAME, CONF_UPDATE_INTERVAL, CONF_RANGE -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import PollingComponent, App +from esphome.components import i2c, sensor +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_ID, CONF_NAME, CONF_RANGE, CONF_UPDATE_INTERVAL +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, PollingComponent DEPENDENCIES = ['i2c'] @@ -21,7 +21,6 @@ HMC5883LFieldStrengthSensor = sensor.sensor_ns.class_('HMC5883LFieldStrengthSens HMC5883LHeadingSensor = sensor.sensor_ns.class_('HMC5883LHeadingSensor', sensor.EmptyPollingParentSensor) - HMC5883LRange = sensor.sensor_ns.enum('HMC5883LRange') HMC5883L_RANGES = { 88: HMC5883LRange.HMC5883L_RANGE_88_UT, diff --git a/esphomeyaml/components/sensor/homeassistant.py b/esphome/components/sensor/homeassistant.py similarity index 51% rename from esphomeyaml/components/sensor/homeassistant.py rename to esphome/components/sensor/homeassistant.py index b3b2c1950b..e282a825c1 100644 --- a/esphomeyaml/components/sensor/homeassistant.py +++ b/esphome/components/sensor/homeassistant.py @@ -1,28 +1,25 @@ import voluptuous as vol -from esphomeyaml.components import sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ENTITY_ID, CONF_MAKE_ID, CONF_NAME -from esphomeyaml.cpp_generator import variable -from esphomeyaml.cpp_types import App, Application +from esphome.components import 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'] -MakeHomeassistantSensor = Application.struct('MakeHomeassistantSensor') HomeassistantSensor = sensor.sensor_ns.class_('HomeassistantSensor', sensor.Sensor) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(HomeassistantSensor), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHomeassistantSensor), vol.Required(CONF_ENTITY_ID): cv.entity_id, })) def to_code(config): rhs = App.make_homeassistant_sensor(config[CONF_NAME], config[CONF_ENTITY_ID]) - make = variable(config[CONF_MAKE_ID], rhs) - subs = make.Psensor - sensor.setup_sensor(subs, make.Pmqtt, config) + subs = Pvariable(config[CONF_ID], rhs) + sensor.setup_sensor(subs, config) BUILD_FLAGS = '-DUSE_HOMEASSISTANT_SENSOR' diff --git a/esphomeyaml/components/sensor/htu21d.py b/esphome/components/sensor/htu21d.py similarity index 64% rename from esphomeyaml/components/sensor/htu21d.py rename to esphome/components/sensor/htu21d.py index 641cfa5ad0..07ee0297f1 100644 --- a/esphomeyaml/components/sensor/htu21d.py +++ b/esphome/components/sensor/htu21d.py @@ -1,12 +1,12 @@ import voluptuous as vol -from esphomeyaml.components import i2c, sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_HUMIDITY, CONF_MAKE_ID, CONF_NAME, CONF_TEMPERATURE, \ - CONF_UPDATE_INTERVAL, CONF_ID -from esphomeyaml.cpp_generator import variable, Pvariable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import Application, PollingComponent, App +from esphome.components import i2c, sensor +import esphome.config_validation as cv +from esphome.const import CONF_HUMIDITY, CONF_ID, CONF_NAME, CONF_TEMPERATURE, \ + CONF_UPDATE_INTERVAL +from esphome.cpp_generator import Pvariable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Application, PollingComponent DEPENDENCIES = ['i2c'] @@ -19,7 +19,6 @@ HTU21DHumiditySensor = sensor.sensor_ns.class_('HTU21DHumiditySensor', PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(HTU21DComponent), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHTU21DSensor), vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(HTU21DTemperatureSensor), })), @@ -34,14 +33,10 @@ def to_code(config): rhs = App.make_htu21d_sensor(config[CONF_TEMPERATURE][CONF_NAME], config[CONF_HUMIDITY][CONF_NAME], config.get(CONF_UPDATE_INTERVAL)) - make = variable(config[CONF_MAKE_ID], rhs) - htu21d = make.Phtu21d - Pvariable(config[CONF_ID], htu21d) + htu21d = Pvariable(config[CONF_ID], rhs) - sensor.setup_sensor(htu21d.Pget_temperature_sensor(), make.Pmqtt_temperature, - config[CONF_TEMPERATURE]) - sensor.setup_sensor(htu21d.Pget_humidity_sensor(), make.Pmqtt_humidity, - config[CONF_HUMIDITY]) + sensor.setup_sensor(htu21d.Pget_temperature_sensor(), config[CONF_TEMPERATURE]) + sensor.setup_sensor(htu21d.Pget_humidity_sensor(), config[CONF_HUMIDITY]) setup_component(htu21d, config) diff --git a/esphomeyaml/components/sensor/hx711.py b/esphome/components/sensor/hx711.py similarity index 69% rename from esphomeyaml/components/sensor/hx711.py rename to esphome/components/sensor/hx711.py index a46cf7842c..aab8fff25d 100644 --- a/esphomeyaml/components/sensor/hx711.py +++ b/esphome/components/sensor/hx711.py @@ -1,12 +1,12 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_CLK_PIN, CONF_GAIN, CONF_MAKE_ID, CONF_NAME, CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import add, variable -from esphomeyaml.cpp_helpers import gpio_input_pin_expression, setup_component -from esphomeyaml.cpp_types import App, Application +from esphome import pins +from esphome.components import sensor +import esphome.config_validation as cv +from esphome.const import CONF_CLK_PIN, CONF_GAIN, CONF_ID, CONF_NAME, CONF_UPDATE_INTERVAL +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import gpio_input_pin_expression, setup_component +from esphome.cpp_types import App, Application MakeHX711Sensor = Application.struct('MakeHX711Sensor') HX711Sensor = sensor.sensor_ns.class_('HX711Sensor', sensor.PollingSensorComponent) @@ -22,7 +22,6 @@ GAINS = { PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(HX711Sensor), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHX711Sensor), vol.Required(CONF_DOUT_PIN): pins.gpio_input_pin_schema, vol.Required(CONF_CLK_PIN): pins.gpio_output_pin_schema, vol.Optional(CONF_GAIN): cv.one_of(*GAINS, int=True), @@ -38,13 +37,12 @@ def to_code(config): rhs = App.make_hx711_sensor(config[CONF_NAME], dout_pin, sck_pin, config.get(CONF_UPDATE_INTERVAL)) - make = variable(config[CONF_MAKE_ID], rhs) - hx711 = make.Phx711 + hx711 = Pvariable(config[CONF_ID], rhs) if CONF_GAIN in config: add(hx711.set_gain(GAINS[config[CONF_GAIN]])) - sensor.setup_sensor(hx711, make.Pmqtt, config) + sensor.setup_sensor(hx711, config) setup_component(hx711, config) diff --git a/esphomeyaml/components/sensor/ina219.py b/esphome/components/sensor/ina219.py similarity index 90% rename from esphomeyaml/components/sensor/ina219.py rename to esphome/components/sensor/ina219.py index e03dff5323..e69057f41d 100644 --- a/esphomeyaml/components/sensor/ina219.py +++ b/esphome/components/sensor/ina219.py @@ -1,14 +1,14 @@ # coding=utf-8 import voluptuous as vol -from esphomeyaml.components import i2c, sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ADDRESS, CONF_BUS_VOLTAGE, CONF_CURRENT, CONF_ID, \ +from esphome.components import i2c, sensor +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_BUS_VOLTAGE, CONF_CURRENT, CONF_ID, \ CONF_MAX_CURRENT, CONF_MAX_VOLTAGE, CONF_NAME, CONF_POWER, CONF_SHUNT_RESISTANCE, \ CONF_SHUNT_VOLTAGE, CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import Pvariable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, PollingComponent +from esphome.cpp_generator import Pvariable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, PollingComponent DEPENDENCIES = ['i2c'] diff --git a/esphomeyaml/components/sensor/ina3221.py b/esphome/components/sensor/ina3221.py similarity index 91% rename from esphomeyaml/components/sensor/ina3221.py rename to esphome/components/sensor/ina3221.py index d062ae9755..cac822fbfb 100644 --- a/esphomeyaml/components/sensor/ina3221.py +++ b/esphome/components/sensor/ina3221.py @@ -1,13 +1,13 @@ # coding=utf-8 import voluptuous as vol -from esphomeyaml.components import i2c, sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ADDRESS, CONF_BUS_VOLTAGE, CONF_CURRENT, CONF_ID, CONF_NAME, \ +from esphome.components import i2c, sensor +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_BUS_VOLTAGE, CONF_CURRENT, CONF_ID, CONF_NAME, \ CONF_POWER, CONF_SHUNT_RESISTANCE, CONF_SHUNT_VOLTAGE, CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, PollingComponent +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, PollingComponent DEPENDENCIES = ['i2c'] diff --git a/esphomeyaml/components/sensor/max31855.py b/esphome/components/sensor/max31855.py similarity index 57% rename from esphomeyaml/components/sensor/max31855.py rename to esphome/components/sensor/max31855.py index d656445cf1..1a57fab1fc 100644 --- a/esphomeyaml/components/sensor/max31855.py +++ b/esphome/components/sensor/max31855.py @@ -1,22 +1,19 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml import pins -from esphomeyaml.components import sensor, spi -from esphomeyaml.components.spi import SPIComponent -from esphomeyaml.const import CONF_CS_PIN, CONF_MAKE_ID, CONF_NAME, CONF_SPI_ID, \ - CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component -from esphomeyaml.cpp_generator import get_variable, variable -from esphomeyaml.cpp_types import Application, App +from esphome import pins +from esphome.components import sensor, spi +from esphome.components.spi import SPIComponent +import esphome.config_validation as cv +from esphome.const import CONF_CS_PIN, CONF_ID, CONF_NAME, CONF_SPI_ID, CONF_UPDATE_INTERVAL +from esphome.cpp_generator import Pvariable, get_variable +from esphome.cpp_helpers import gpio_output_pin_expression, setup_component +from esphome.cpp_types import App -MakeMAX31855Sensor = Application.struct('MakeMAX31855Sensor') MAX31855Sensor = sensor.sensor_ns.class_('MAX31855Sensor', sensor.PollingSensorComponent, spi.SPIDevice) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(MAX31855Sensor), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeMAX31855Sensor), cv.GenerateID(CONF_SPI_ID): cv.use_variable_id(SPIComponent), vol.Required(CONF_CS_PIN): pins.gpio_output_pin_schema, vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, @@ -30,9 +27,8 @@ def to_code(config): yield rhs = App.make_max31855_sensor(config[CONF_NAME], spi_, cs, config.get(CONF_UPDATE_INTERVAL)) - make = variable(config[CONF_MAKE_ID], rhs) - max31855 = make.Pmax31855 - sensor.setup_sensor(max31855, make.Pmqtt, config) + max31855 = Pvariable(config[CONF_ID], rhs) + sensor.setup_sensor(max31855, config) setup_component(max31855, config) diff --git a/esphomeyaml/components/sensor/max6675.py b/esphome/components/sensor/max6675.py similarity index 58% rename from esphomeyaml/components/sensor/max6675.py rename to esphome/components/sensor/max6675.py index 821e9169bf..0ea383d4f6 100644 --- a/esphomeyaml/components/sensor/max6675.py +++ b/esphome/components/sensor/max6675.py @@ -1,22 +1,20 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import sensor, spi -from esphomeyaml.components.spi import SPIComponent -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_CS_PIN, CONF_MAKE_ID, CONF_NAME, CONF_SPI_ID, \ +from esphome import pins +from esphome.components import sensor, spi +from esphome.components.spi import SPIComponent +import esphome.config_validation as cv +from esphome.const import CONF_CS_PIN, CONF_ID, CONF_NAME, CONF_SPI_ID, \ CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import get_variable, variable -from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component -from esphomeyaml.cpp_types import App, Application +from esphome.cpp_generator import Pvariable, get_variable +from esphome.cpp_helpers import gpio_output_pin_expression, setup_component +from esphome.cpp_types import App -MakeMAX6675Sensor = Application.struct('MakeMAX6675Sensor') MAX6675Sensor = sensor.sensor_ns.class_('MAX6675Sensor', sensor.PollingSensorComponent, spi.SPIDevice) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(MAX6675Sensor), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeMAX6675Sensor), cv.GenerateID(CONF_SPI_ID): cv.use_variable_id(SPIComponent), vol.Required(CONF_CS_PIN): pins.gpio_output_pin_schema, vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, @@ -30,9 +28,8 @@ def to_code(config): yield rhs = App.make_max6675_sensor(config[CONF_NAME], spi_, cs, config.get(CONF_UPDATE_INTERVAL)) - make = variable(config[CONF_MAKE_ID], rhs) - max6675 = make.Pmax6675 - sensor.setup_sensor(max6675, make.Pmqtt, config) + max6675 = Pvariable(config[CONF_ID], rhs) + sensor.setup_sensor(max6675, config) setup_component(max6675, config) diff --git a/esphomeyaml/components/sensor/mhz19.py b/esphome/components/sensor/mhz19.py similarity index 67% rename from esphomeyaml/components/sensor/mhz19.py rename to esphome/components/sensor/mhz19.py index 30232deeef..e051f5b4c4 100644 --- a/esphomeyaml/components/sensor/mhz19.py +++ b/esphome/components/sensor/mhz19.py @@ -1,17 +1,16 @@ import voluptuous as vol -from esphomeyaml.components import sensor, uart -from esphomeyaml.components.uart import UARTComponent -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_CO2, CONF_MAKE_ID, CONF_NAME, CONF_TEMPERATURE, CONF_UART_ID, \ - CONF_UPDATE_INTERVAL, CONF_ID -from esphomeyaml.cpp_generator import get_variable, variable, Pvariable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import Application, PollingComponent, App +from esphome.components import sensor, uart +from esphome.components.uart import UARTComponent +import esphome.config_validation as cv +from esphome.const import CONF_CO2, CONF_ID, CONF_NAME, CONF_TEMPERATURE, CONF_UART_ID, \ + CONF_UPDATE_INTERVAL +from esphome.cpp_generator import Pvariable, get_variable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, PollingComponent DEPENDENCIES = ['uart'] -MakeMHZ19Sensor = Application.struct('MakeMHZ19Sensor') MHZ19Component = sensor.sensor_ns.class_('MHZ19Component', PollingComponent, uart.UARTDevice) MHZ19TemperatureSensor = sensor.sensor_ns.class_('MHZ19TemperatureSensor', sensor.EmptyPollingParentSensor) @@ -19,7 +18,6 @@ MHZ19CO2Sensor = sensor.sensor_ns.class_('MHZ19CO2Sensor', sensor.EmptyPollingPa PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(MHZ19Component), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeMHZ19Sensor), cv.GenerateID(CONF_UART_ID): cv.use_variable_id(UARTComponent), vol.Required(CONF_CO2): cv.nameable(sensor.SENSOR_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(MHZ19CO2Sensor), @@ -36,10 +34,8 @@ def to_code(config): yield rhs = App.make_mhz19_sensor(uart_, config[CONF_CO2][CONF_NAME], config.get(CONF_UPDATE_INTERVAL)) - make = variable(config[CONF_MAKE_ID], rhs) - mhz19 = make.Pmhz19 - Pvariable(config[CONF_ID], mhz19) - sensor.setup_sensor(mhz19.Pget_co2_sensor(), make.Pmqtt, config[CONF_CO2]) + mhz19 = Pvariable(config[CONF_ID], rhs) + sensor.setup_sensor(mhz19.Pget_co2_sensor(), config[CONF_CO2]) if CONF_TEMPERATURE in config: sensor.register_sensor(mhz19.Pmake_temperature_sensor(config[CONF_TEMPERATURE][CONF_NAME]), diff --git a/esphomeyaml/components/sensor/mpu6050.py b/esphome/components/sensor/mpu6050.py similarity index 92% rename from esphomeyaml/components/sensor/mpu6050.py rename to esphome/components/sensor/mpu6050.py index cd2926f5a5..44982f140c 100644 --- a/esphomeyaml/components/sensor/mpu6050.py +++ b/esphome/components/sensor/mpu6050.py @@ -1,12 +1,12 @@ import voluptuous as vol -from esphomeyaml.components import i2c, sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ADDRESS, CONF_ID, CONF_NAME, CONF_TEMPERATURE, \ +from esphome.components import i2c, sensor +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_ID, CONF_NAME, CONF_TEMPERATURE, \ CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import Pvariable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, PollingComponent +from esphome.cpp_generator import Pvariable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, PollingComponent DEPENDENCIES = ['i2c'] diff --git a/esphomeyaml/components/sensor/mqtt_subscribe.py b/esphome/components/sensor/mqtt_subscribe.py similarity index 55% rename from esphomeyaml/components/sensor/mqtt_subscribe.py rename to esphome/components/sensor/mqtt_subscribe.py index 20d5ee1fa7..3516e3d627 100644 --- a/esphomeyaml/components/sensor/mqtt_subscribe.py +++ b/esphome/components/sensor/mqtt_subscribe.py @@ -1,20 +1,18 @@ import voluptuous as vol -from esphomeyaml.components import sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_QOS, CONF_TOPIC -from esphomeyaml.cpp_generator import add, variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Application, Component +from esphome.components import sensor +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_NAME, CONF_QOS, CONF_TOPIC +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Component DEPENDENCIES = ['mqtt'] -MakeMQTTSubscribeSensor = Application.struct('MakeMQTTSubscribeSensor') MQTTSubscribeSensor = sensor.sensor_ns.class_('MQTTSubscribeSensor', sensor.Sensor, Component) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(MQTTSubscribeSensor), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeMQTTSubscribeSensor), vol.Required(CONF_TOPIC): cv.subscribe_topic, vol.Optional(CONF_QOS): cv.mqtt_qos, }).extend(cv.COMPONENT_SCHEMA.schema)) @@ -22,13 +20,12 @@ PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ def to_code(config): rhs = App.make_mqtt_subscribe_sensor(config[CONF_NAME], config[CONF_TOPIC]) - make = variable(config[CONF_MAKE_ID], rhs) - subs = make.Psensor + subs = Pvariable(config[CONF_ID], rhs) if CONF_QOS in config: add(subs.set_qos(config[CONF_QOS])) - sensor.setup_sensor(subs, make.Pmqtt, config) + sensor.setup_sensor(subs, config) setup_component(subs, config) diff --git a/esphomeyaml/components/sensor/ms5611.py b/esphome/components/sensor/ms5611.py similarity index 65% rename from esphomeyaml/components/sensor/ms5611.py rename to esphome/components/sensor/ms5611.py index 7afb60470a..cd10b47bb0 100644 --- a/esphomeyaml/components/sensor/ms5611.py +++ b/esphome/components/sensor/ms5611.py @@ -1,16 +1,15 @@ import voluptuous as vol -from esphomeyaml.components import i2c, sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ADDRESS, CONF_ID, CONF_MAKE_ID, CONF_NAME, CONF_PRESSURE, \ +from esphome.components import i2c, sensor +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_ID, CONF_NAME, CONF_PRESSURE, \ CONF_TEMPERATURE, CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import Pvariable, add, variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Application, PollingComponent +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, PollingComponent DEPENDENCIES = ['i2c'] -MakeMS5611Sensor = Application.struct('MakeMS5611Sensor') MS5611Component = sensor.sensor_ns.class_('MS5611Component', PollingComponent, i2c.I2CDevice) MS5611TemperatureSensor = sensor.sensor_ns.class_('MS5611TemperatureSensor', sensor.EmptyPollingParentSensor) @@ -19,7 +18,6 @@ MS5611PressureSensor = sensor.sensor_ns.class_('MS5611PressureSensor', PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(MS5611Component), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeMS5611Sensor), vol.Optional(CONF_ADDRESS): cv.i2c_address, vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(MS5611TemperatureSensor), @@ -35,17 +33,13 @@ def to_code(config): rhs = App.make_ms5611_sensor(config[CONF_TEMPERATURE][CONF_NAME], config[CONF_PRESSURE][CONF_NAME], config.get(CONF_UPDATE_INTERVAL)) - make = variable(config[CONF_MAKE_ID], rhs) - ms5611 = make.Pms5611 - Pvariable(config[CONF_ID], ms5611) + ms5611 = Pvariable(config[CONF_ID], rhs) if CONF_ADDRESS in config: add(ms5611.set_address(config[CONF_ADDRESS])) - sensor.setup_sensor(ms5611.Pget_temperature_sensor(), make.Pmqtt_temperature, - config[CONF_TEMPERATURE]) - sensor.setup_sensor(ms5611.Pget_pressure_sensor(), make.Pmqtt_pressure, - config[CONF_PRESSURE]) + sensor.setup_sensor(ms5611.Pget_temperature_sensor(), config[CONF_TEMPERATURE]) + sensor.setup_sensor(ms5611.Pget_pressure_sensor(), config[CONF_PRESSURE]) setup_component(ms5611, config) diff --git a/esphomeyaml/components/sensor/pmsx003.py b/esphome/components/sensor/pmsx003.py similarity index 89% rename from esphomeyaml/components/sensor/pmsx003.py rename to esphome/components/sensor/pmsx003.py index 1d05c34da5..8556ad4594 100644 --- a/esphomeyaml/components/sensor/pmsx003.py +++ b/esphome/components/sensor/pmsx003.py @@ -1,13 +1,13 @@ import voluptuous as vol -from esphomeyaml.components import sensor, uart -from esphomeyaml.components.uart import UARTComponent -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_FORMALDEHYDE, CONF_HUMIDITY, CONF_ID, CONF_NAME, CONF_PM_10_0, \ +from esphome.components import sensor, uart +from esphome.components.uart import UARTComponent +import esphome.config_validation as cv +from esphome.const import CONF_FORMALDEHYDE, CONF_HUMIDITY, CONF_ID, CONF_NAME, CONF_PM_10_0, \ CONF_PM_1_0, CONF_PM_2_5, CONF_TEMPERATURE, CONF_TYPE, CONF_UART_ID -from esphomeyaml.cpp_generator import Pvariable, get_variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Component +from esphome.cpp_generator import Pvariable, get_variable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Component DEPENDENCIES = ['uart'] diff --git a/esphomeyaml/components/sensor/pulse_counter.py b/esphome/components/sensor/pulse_counter.py similarity index 76% rename from esphomeyaml/components/sensor/pulse_counter.py rename to esphome/components/sensor/pulse_counter.py index 1069575a30..b1ae21b2c6 100644 --- a/esphomeyaml/components/sensor/pulse_counter.py +++ b/esphome/components/sensor/pulse_counter.py @@ -1,14 +1,14 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_COUNT_MODE, CONF_FALLING_EDGE, CONF_INTERNAL_FILTER, \ - CONF_MAKE_ID, CONF_NAME, CONF_PIN, CONF_RISING_EDGE, CONF_UPDATE_INTERVAL -from esphomeyaml.core import CORE -from esphomeyaml.cpp_generator import add, variable -from esphomeyaml.cpp_helpers import gpio_input_pin_expression, setup_component -from esphomeyaml.cpp_types import App, Application +from esphome import pins +from esphome.components import sensor +import esphome.config_validation as cv +from esphome.const import CONF_COUNT_MODE, CONF_FALLING_EDGE, CONF_ID, CONF_INTERNAL_FILTER, \ + CONF_NAME, CONF_PIN, CONF_RISING_EDGE, CONF_UPDATE_INTERVAL +from esphome.core import CORE +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import gpio_input_pin_expression, setup_component +from esphome.cpp_types import App PulseCounterCountMode = sensor.sensor_ns.enum('PulseCounterCountMode') COUNT_MODES = { @@ -20,7 +20,6 @@ COUNT_MODES = { COUNT_MODE_SCHEMA = cv.one_of(*COUNT_MODES, upper=True) PulseCounterBase = sensor.sensor_ns.class_('PulseCounterBase') -MakePulseCounterSensor = Application.struct('MakePulseCounterSensor') PulseCounterSensorComponent = sensor.sensor_ns.class_('PulseCounterSensorComponent', sensor.PollingSensorComponent, PulseCounterBase) @@ -41,7 +40,6 @@ def validate_internal_filter(value): PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(PulseCounterSensorComponent), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakePulseCounterSensor), vol.Required(CONF_PIN): pins.internal_gpio_input_pin_schema, vol.Optional(CONF_COUNT_MODE): vol.Schema({ vol.Required(CONF_RISING_EDGE): COUNT_MODE_SCHEMA, @@ -57,8 +55,7 @@ def to_code(config): yield rhs = App.make_pulse_counter_sensor(config[CONF_NAME], pin, config.get(CONF_UPDATE_INTERVAL)) - make = variable(config[CONF_MAKE_ID], rhs) - pcnt = make.Ppcnt + pcnt = Pvariable(config[CONF_ID], rhs) if CONF_COUNT_MODE in config: rising_edge = COUNT_MODES[config[CONF_COUNT_MODE][CONF_RISING_EDGE]] @@ -67,7 +64,7 @@ def to_code(config): if CONF_INTERNAL_FILTER in config: add(pcnt.set_filter_us(config[CONF_INTERNAL_FILTER])) - sensor.setup_sensor(pcnt, make.Pmqtt, config) + sensor.setup_sensor(pcnt, config) setup_component(pcnt, config) diff --git a/esphomeyaml/components/sensor/rotary_encoder.py b/esphome/components/sensor/rotary_encoder.py similarity index 70% rename from esphomeyaml/components/sensor/rotary_encoder.py rename to esphome/components/sensor/rotary_encoder.py index bb3949f9b3..f8ceb5bb70 100644 --- a/esphomeyaml/components/sensor/rotary_encoder.py +++ b/esphome/components/sensor/rotary_encoder.py @@ -1,12 +1,12 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_RESOLUTION -from esphomeyaml.cpp_generator import add, variable -from esphomeyaml.cpp_helpers import gpio_input_pin_expression, setup_component -from esphomeyaml.cpp_types import App, Application, Component +from esphome import pins +from esphome.components import sensor +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_NAME, CONF_RESOLUTION +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import gpio_input_pin_expression, setup_component +from esphome.cpp_types import App, Component RotaryEncoderResolution = sensor.sensor_ns.enum('RotaryEncoderResolution') RESOLUTIONS = { @@ -19,12 +19,10 @@ CONF_PIN_A = 'pin_a' CONF_PIN_B = 'pin_b' CONF_PIN_RESET = 'pin_reset' -MakeRotaryEncoderSensor = Application.struct('MakeRotaryEncoderSensor') RotaryEncoderSensor = sensor.sensor_ns.class_('RotaryEncoderSensor', sensor.Sensor, Component) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(RotaryEncoderSensor), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeRotaryEncoderSensor), vol.Required(CONF_PIN_A): pins.internal_gpio_input_pin_schema, vol.Required(CONF_PIN_B): pins.internal_gpio_input_pin_schema, vol.Optional(CONF_PIN_RESET): pins.internal_gpio_input_pin_schema, @@ -38,11 +36,9 @@ def to_code(config): for pin_b in gpio_input_pin_expression(config[CONF_PIN_B]): yield rhs = App.make_rotary_encoder_sensor(config[CONF_NAME], pin_a, pin_b) - make = variable(config[CONF_MAKE_ID], rhs) - encoder = make.Protary_encoder + encoder = Pvariable(config[CONF_ID], rhs) if CONF_PIN_RESET in config: - pin_i = None for pin_i in gpio_input_pin_expression(config[CONF_PIN_RESET]): yield add(encoder.set_reset_pin(pin_i)) @@ -50,7 +46,7 @@ def to_code(config): resolution = RESOLUTIONS[config[CONF_RESOLUTION]] add(encoder.set_resolution(resolution)) - sensor.setup_sensor(encoder, make.Pmqtt, config) + sensor.setup_sensor(encoder, config) setup_component(encoder, config) diff --git a/esphomeyaml/components/sensor/sht3xd.py b/esphome/components/sensor/sht3xd.py similarity index 65% rename from esphomeyaml/components/sensor/sht3xd.py rename to esphome/components/sensor/sht3xd.py index cd903f8f9b..d873f82ed6 100644 --- a/esphomeyaml/components/sensor/sht3xd.py +++ b/esphome/components/sensor/sht3xd.py @@ -1,16 +1,15 @@ import voluptuous as vol -from esphomeyaml.components import i2c, sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ADDRESS, CONF_HUMIDITY, CONF_ID, CONF_MAKE_ID, CONF_NAME, \ +from esphome.components import i2c, sensor +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_HUMIDITY, CONF_ID, CONF_NAME, \ CONF_TEMPERATURE, CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import Pvariable, variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Application, PollingComponent +from esphome.cpp_generator import Pvariable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, PollingComponent DEPENDENCIES = ['i2c'] -MakeSHT3XDSensor = Application.struct('MakeSHT3XDSensor') SHT3XDComponent = sensor.sensor_ns.class_('SHT3XDComponent', PollingComponent, i2c.I2CDevice) SHT3XDTemperatureSensor = sensor.sensor_ns.class_('SHT3XDTemperatureSensor', sensor.EmptyPollingParentSensor) @@ -19,7 +18,6 @@ SHT3XDHumiditySensor = sensor.sensor_ns.class_('SHT3XDHumiditySensor', PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(SHT3XDComponent), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeSHT3XDSensor), vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(SHT3XDTemperatureSensor), })), @@ -36,14 +34,10 @@ def to_code(config): config[CONF_HUMIDITY][CONF_NAME], config[CONF_ADDRESS], config.get(CONF_UPDATE_INTERVAL)) - make = variable(config[CONF_MAKE_ID], rhs) - sht3xd = make.Psht3xd - Pvariable(config[CONF_ID], sht3xd) + sht3xd = Pvariable(config[CONF_ID], rhs) - sensor.setup_sensor(sht3xd.Pget_temperature_sensor(), make.Pmqtt_temperature, - config[CONF_TEMPERATURE]) - sensor.setup_sensor(sht3xd.Pget_humidity_sensor(), make.Pmqtt_humidity, - config[CONF_HUMIDITY]) + sensor.setup_sensor(sht3xd.Pget_temperature_sensor(), config[CONF_TEMPERATURE]) + sensor.setup_sensor(sht3xd.Pget_humidity_sensor(), config[CONF_HUMIDITY]) setup_component(sht3xd, config) diff --git a/esphomeyaml/components/sensor/tcs34725.py b/esphome/components/sensor/tcs34725.py similarity index 93% rename from esphomeyaml/components/sensor/tcs34725.py rename to esphome/components/sensor/tcs34725.py index ad9eefc120..6989d3e691 100644 --- a/esphomeyaml/components/sensor/tcs34725.py +++ b/esphome/components/sensor/tcs34725.py @@ -1,13 +1,13 @@ # coding=utf-8 import voluptuous as vol -from esphomeyaml.components import i2c, sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ADDRESS, CONF_COLOR_TEMPERATURE, CONF_GAIN, CONF_ID, \ +from esphome.components import i2c, sensor +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_COLOR_TEMPERATURE, CONF_GAIN, CONF_ID, \ CONF_ILLUMINANCE, CONF_INTEGRATION_TIME, CONF_NAME, CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, PollingComponent +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, PollingComponent DEPENDENCIES = ['i2c'] diff --git a/esphome/components/sensor/template.py b/esphome/components/sensor/template.py new file mode 100644 index 0000000000..7182ae672e --- /dev/null +++ b/esphome/components/sensor/template.py @@ -0,0 +1,58 @@ +import voluptuous as vol + +from esphome.automation import ACTION_REGISTRY +from esphome.components import sensor +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_LAMBDA, CONF_NAME, CONF_STATE, CONF_UPDATE_INTERVAL +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, float_, optional + +TemplateSensor = sensor.sensor_ns.class_('TemplateSensor', sensor.PollingSensorComponent) +SensorPublishAction = sensor.sensor_ns.class_('SensorPublishAction', Action) + +PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(TemplateSensor), + vol.Optional(CONF_LAMBDA): cv.lambda_, + vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, +}).extend(cv.COMPONENT_SCHEMA.schema)) + + +def to_code(config): + rhs = App.make_template_sensor(config[CONF_NAME], config.get(CONF_UPDATE_INTERVAL)) + template = Pvariable(config[CONF_ID], rhs) + + sensor.setup_sensor(template, config) + setup_component(template, config) + + if CONF_LAMBDA in config: + for template_ in process_lambda(config[CONF_LAMBDA], [], + return_type=optional.template(float_)): + yield + add(template.set_template(template_)) + + +BUILD_FLAGS = '-DUSE_TEMPLATE_SENSOR' + +CONF_SENSOR_TEMPLATE_PUBLISH = 'sensor.template.publish' +SENSOR_TEMPLATE_PUBLISH_ACTION_SCHEMA = vol.Schema({ + vol.Required(CONF_ID): cv.use_variable_id(sensor.Sensor), + vol.Required(CONF_STATE): cv.templatable(cv.float_), +}) + + +@ACTION_REGISTRY.register(CONF_SENSOR_TEMPLATE_PUBLISH, SENSOR_TEMPLATE_PUBLISH_ACTION_SCHEMA) +def 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_sensor_publish_action(template_arg) + type = SensorPublishAction.template(arg_type) + action = Pvariable(action_id, rhs, type=type) + for template_ in templatable(config[CONF_STATE], arg_type, float_): + yield None + add(action.set_state(template_)) + yield action + + +def to_hass_config(data, config): + return sensor.core_to_hass_config(data, config) diff --git a/esphomeyaml/components/sensor/total_daily_energy.py b/esphome/components/sensor/total_daily_energy.py similarity index 58% rename from esphomeyaml/components/sensor/total_daily_energy.py rename to esphome/components/sensor/total_daily_energy.py index bd2b17afd0..f2c3d5b38b 100644 --- a/esphomeyaml/components/sensor/total_daily_energy.py +++ b/esphome/components/sensor/total_daily_energy.py @@ -1,21 +1,19 @@ import voluptuous as vol -from esphomeyaml.components import sensor, time -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_TIME_ID -from esphomeyaml.cpp_generator import get_variable, variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import Application, Component, App +from esphome.components import sensor, time +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_NAME, CONF_TIME_ID +from esphome.cpp_generator import Pvariable, get_variable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Component DEPENDENCIES = ['time'] CONF_POWER_ID = 'power_id' -MakeTotalDailyEnergySensor = Application.struct('MakeTotalDailyEnergySensor') TotalDailyEnergy = sensor.sensor_ns.class_('TotalDailyEnergy', sensor.Sensor, Component) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(TotalDailyEnergy), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeTotalDailyEnergySensor), cv.GenerateID(CONF_TIME_ID): cv.use_variable_id(time.RealTimeClockComponent), vol.Required(CONF_POWER_ID): cv.use_variable_id(sensor.Sensor), }).extend(cv.COMPONENT_SCHEMA.schema)) @@ -27,10 +25,9 @@ def to_code(config): for sens in get_variable(config[CONF_POWER_ID]): yield rhs = App.make_total_daily_energy_sensor(config[CONF_NAME], time_, sens) - make = variable(config[CONF_MAKE_ID], rhs) - total_energy = make.Ptotal_energy + total_energy = Pvariable(config[CONF_ID], rhs) - sensor.setup_sensor(total_energy, make.Pmqtt, config) + sensor.setup_sensor(total_energy, config) setup_component(total_energy, config) diff --git a/esphomeyaml/components/sensor/tsl2561.py b/esphome/components/sensor/tsl2561.py similarity index 75% rename from esphomeyaml/components/sensor/tsl2561.py rename to esphome/components/sensor/tsl2561.py index 3849b901a1..6e26f016ab 100644 --- a/esphomeyaml/components/sensor/tsl2561.py +++ b/esphome/components/sensor/tsl2561.py @@ -1,12 +1,12 @@ import voluptuous as vol -from esphomeyaml.components import i2c, sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ADDRESS, CONF_GAIN, CONF_INTEGRATION_TIME, CONF_MAKE_ID, \ - CONF_NAME, CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import add, variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Application +from esphome.components import i2c, sensor +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_GAIN, CONF_ID, CONF_INTEGRATION_TIME, CONF_NAME, \ + CONF_UPDATE_INTERVAL +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App DEPENDENCIES = ['i2c'] @@ -33,13 +33,11 @@ def validate_integration_time(value): return value -MakeTSL2561Sensor = Application.struct('MakeTSL2561Sensor') TSL2561Sensor = sensor.sensor_ns.class_('TSL2561Sensor', sensor.PollingSensorComponent, i2c.I2CDevice) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(TSL2561Sensor), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeTSL2561Sensor), vol.Optional(CONF_ADDRESS, default=0x39): cv.i2c_address, vol.Optional(CONF_INTEGRATION_TIME): validate_integration_time, vol.Optional(CONF_GAIN): cv.one_of(*GAINS, upper=True), @@ -51,8 +49,7 @@ PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ def to_code(config): rhs = App.make_tsl2561_sensor(config[CONF_NAME], config[CONF_ADDRESS], config.get(CONF_UPDATE_INTERVAL)) - make_tsl = variable(config[CONF_MAKE_ID], rhs) - tsl2561 = make_tsl.Ptsl2561 + tsl2561 = Pvariable(config[CONF_ID], rhs) if CONF_INTEGRATION_TIME in config: add(tsl2561.set_integration_time(INTEGRATION_TIMES[config[CONF_INTEGRATION_TIME]])) @@ -61,7 +58,7 @@ def to_code(config): if CONF_IS_CS_PACKAGE in config: add(tsl2561.set_is_cs_package(config[CONF_IS_CS_PACKAGE])) - sensor.setup_sensor(tsl2561, make_tsl.Pmqtt, config) + sensor.setup_sensor(tsl2561, config) setup_component(tsl2561, config) diff --git a/esphomeyaml/components/sensor/ultrasonic.py b/esphome/components/sensor/ultrasonic.py similarity index 68% rename from esphomeyaml/components/sensor/ultrasonic.py rename to esphome/components/sensor/ultrasonic.py index b653351c02..894b7a73dc 100644 --- a/esphomeyaml/components/sensor/ultrasonic.py +++ b/esphome/components/sensor/ultrasonic.py @@ -1,22 +1,20 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml import pins -from esphomeyaml.components import sensor -from esphomeyaml.const import CONF_ECHO_PIN, CONF_MAKE_ID, CONF_NAME, CONF_TIMEOUT_METER, \ +from esphome import pins +from esphome.components import sensor +import esphome.config_validation as cv +from esphome.const import CONF_ECHO_PIN, CONF_ID, CONF_NAME, CONF_TIMEOUT_METER, \ CONF_TIMEOUT_TIME, CONF_TRIGGER_PIN, CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import variable, add -from esphomeyaml.cpp_helpers import gpio_output_pin_expression, gpio_input_pin_expression, \ +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import gpio_input_pin_expression, gpio_output_pin_expression, \ setup_component -from esphomeyaml.cpp_types import Application, App +from esphome.cpp_types import App -MakeUltrasonicSensor = Application.struct('MakeUltrasonicSensor') UltrasonicSensorComponent = sensor.sensor_ns.class_('UltrasonicSensorComponent', sensor.PollingSensorComponent) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(UltrasonicSensorComponent), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeUltrasonicSensor), vol.Required(CONF_TRIGGER_PIN): pins.gpio_output_pin_schema, vol.Required(CONF_ECHO_PIN): pins.internal_gpio_input_pin_schema, vol.Exclusive(CONF_TIMEOUT_METER, 'timeout'): cv.positive_float, @@ -32,15 +30,14 @@ def to_code(config): yield rhs = App.make_ultrasonic_sensor(config[CONF_NAME], trigger, echo, config.get(CONF_UPDATE_INTERVAL)) - make = variable(config[CONF_MAKE_ID], rhs) - ultrasonic = make.Pultrasonic + ultrasonic = Pvariable(config[CONF_ID], rhs) if CONF_TIMEOUT_TIME in config: add(ultrasonic.set_timeout_us(config[CONF_TIMEOUT_TIME])) elif CONF_TIMEOUT_METER in config: add(ultrasonic.set_timeout_m(config[CONF_TIMEOUT_METER])) - sensor.setup_sensor(ultrasonic, make.Pmqtt, config) + sensor.setup_sensor(ultrasonic, config) setup_component(ultrasonic, config) diff --git a/esphomeyaml/components/sensor/uptime.py b/esphome/components/sensor/uptime.py similarity index 51% rename from esphomeyaml/components/sensor/uptime.py rename to esphome/components/sensor/uptime.py index 561d577b4a..33ee717d0f 100644 --- a/esphomeyaml/components/sensor/uptime.py +++ b/esphome/components/sensor/uptime.py @@ -1,28 +1,25 @@ import voluptuous as vol -from esphomeyaml.components import sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Application +from esphome.components import sensor +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_NAME, CONF_UPDATE_INTERVAL +from esphome.cpp_generator import Pvariable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App -MakeUptimeSensor = Application.struct('MakeUptimeSensor') UptimeSensor = sensor.sensor_ns.class_('UptimeSensor', sensor.PollingSensorComponent) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(UptimeSensor), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeUptimeSensor), vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema)) def to_code(config): rhs = App.make_uptime_sensor(config[CONF_NAME], config.get(CONF_UPDATE_INTERVAL)) - make = variable(config[CONF_MAKE_ID], rhs) - uptime = make.Puptime + uptime = Pvariable(config[CONF_ID], rhs) - sensor.setup_sensor(uptime, make.Pmqtt, config) + sensor.setup_sensor(uptime, config) setup_component(uptime, config) diff --git a/esphomeyaml/components/sensor/wifi_signal.py b/esphome/components/sensor/wifi_signal.py similarity index 52% rename from esphomeyaml/components/sensor/wifi_signal.py rename to esphome/components/sensor/wifi_signal.py index db44e11303..cb5e5a768a 100644 --- a/esphomeyaml/components/sensor/wifi_signal.py +++ b/esphome/components/sensor/wifi_signal.py @@ -1,28 +1,25 @@ import voluptuous as vol -from esphomeyaml.components import sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_UPDATE_INTERVAL -from esphomeyaml.cpp_generator import variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Application +from esphome.components import sensor +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_NAME, CONF_UPDATE_INTERVAL +from esphome.cpp_generator import Pvariable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App -MakeWiFiSignalSensor = Application.struct('MakeWiFiSignalSensor') WiFiSignalSensor = sensor.sensor_ns.class_('WiFiSignalSensor', sensor.PollingSensorComponent) PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(WiFiSignalSensor), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeWiFiSignalSensor), vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema)) def to_code(config): rhs = App.make_wifi_signal_sensor(config[CONF_NAME], config.get(CONF_UPDATE_INTERVAL)) - make = variable(config[CONF_MAKE_ID], rhs) - wifi = make.Pwifi + wifi = Pvariable(config[CONF_ID], rhs) - sensor.setup_sensor(wifi, make.Pmqtt, config) + sensor.setup_sensor(wifi, config) setup_component(wifi, config) diff --git a/esphomeyaml/components/sensor/xiaomi_miflora.py b/esphome/components/sensor/xiaomi_miflora.py similarity index 85% rename from esphomeyaml/components/sensor/xiaomi_miflora.py rename to esphome/components/sensor/xiaomi_miflora.py index 5ec566be18..64e002b9a1 100644 --- a/esphomeyaml/components/sensor/xiaomi_miflora.py +++ b/esphome/components/sensor/xiaomi_miflora.py @@ -1,12 +1,12 @@ import voluptuous as vol -from esphomeyaml.components import esp32_ble_tracker, sensor -from esphomeyaml.components.esp32_ble_tracker import CONF_ESP32_BLE_ID, ESP32BLETracker, \ +from esphome.components import esp32_ble_tracker, sensor +from esphome.components.esp32_ble_tracker import CONF_ESP32_BLE_ID, ESP32BLETracker, \ make_address_array -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_BATTERY_LEVEL, CONF_CONDUCTIVITY, CONF_ID, CONF_ILLUMINANCE, \ +import esphome.config_validation as cv +from esphome.const import CONF_BATTERY_LEVEL, CONF_CONDUCTIVITY, CONF_ID, CONF_ILLUMINANCE, \ CONF_MAC_ADDRESS, CONF_MOISTURE, CONF_NAME, CONF_TEMPERATURE -from esphomeyaml.cpp_generator import get_variable, Pvariable +from esphome.cpp_generator import Pvariable, get_variable DEPENDENCIES = ['esp32_ble_tracker'] diff --git a/esphomeyaml/components/sensor/xiaomi_mijia.py b/esphome/components/sensor/xiaomi_mijia.py similarity index 81% rename from esphomeyaml/components/sensor/xiaomi_mijia.py rename to esphome/components/sensor/xiaomi_mijia.py index 675dec3a67..d7fdf17435 100644 --- a/esphomeyaml/components/sensor/xiaomi_mijia.py +++ b/esphome/components/sensor/xiaomi_mijia.py @@ -1,12 +1,12 @@ import voluptuous as vol -from esphomeyaml.components import esp32_ble_tracker, sensor -from esphomeyaml.components.esp32_ble_tracker import CONF_ESP32_BLE_ID, ESP32BLETracker, \ +from esphome.components import esp32_ble_tracker, sensor +from esphome.components.esp32_ble_tracker import CONF_ESP32_BLE_ID, ESP32BLETracker, \ make_address_array -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_BATTERY_LEVEL, CONF_HUMIDITY, CONF_MAC_ADDRESS, CONF_MAKE_ID, \ +import esphome.config_validation as cv +from esphome.const import CONF_BATTERY_LEVEL, CONF_HUMIDITY, CONF_MAC_ADDRESS, CONF_MAKE_ID, \ CONF_NAME, CONF_TEMPERATURE -from esphomeyaml.cpp_generator import get_variable, Pvariable +from esphome.cpp_generator import Pvariable, get_variable DEPENDENCIES = ['esp32_ble_tracker'] diff --git a/esphomeyaml/components/spi.py b/esphome/components/spi.py similarity index 66% rename from esphomeyaml/components/spi.py rename to esphome/components/spi.py index 7171c6754a..247a30635e 100644 --- a/esphomeyaml/components/spi.py +++ b/esphome/components/spi.py @@ -1,15 +1,15 @@ import voluptuous as vol -from esphomeyaml import pins -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_CLK_PIN, CONF_ID, CONF_MISO_PIN, CONF_MOSI_PIN -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_helpers import gpio_input_pin_expression, gpio_output_pin_expression, \ +from esphome import pins +import esphome.config_validation as cv +from esphome.const import CONF_CLK_PIN, CONF_ID, CONF_MISO_PIN, CONF_MOSI_PIN +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import gpio_input_pin_expression, gpio_output_pin_expression, \ setup_component -from esphomeyaml.cpp_types import App, Component, esphomelib_ns +from esphome.cpp_types import App, Component, esphome_ns -SPIComponent = esphomelib_ns.class_('SPIComponent', Component) -SPIDevice = esphomelib_ns.class_('SPIDevice') +SPIComponent = esphome_ns.class_('SPIComponent', Component) +SPIDevice = esphome_ns.class_('SPIDevice') MULTI_CONF = True CONFIG_SCHEMA = vol.All(vol.Schema({ diff --git a/esphomeyaml/components/status_led.py b/esphome/components/status_led.py similarity index 55% rename from esphomeyaml/components/status_led.py rename to esphome/components/status_led.py index 1fd5da1b60..fc71c678da 100644 --- a/esphomeyaml/components/status_led.py +++ b/esphome/components/status_led.py @@ -1,12 +1,12 @@ import voluptuous as vol -from esphomeyaml import config_validation as cv, pins -from esphomeyaml.const import CONF_ID, CONF_PIN -from esphomeyaml.cpp_generator import Pvariable -from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component -from esphomeyaml.cpp_types import App, Component, esphomelib_ns +from esphome import config_validation as cv, pins +from esphome.const import CONF_ID, CONF_PIN +from esphome.cpp_generator import Pvariable +from esphome.cpp_helpers import gpio_output_pin_expression, setup_component +from esphome.cpp_types import App, Component, esphome_ns -StatusLEDComponent = esphomelib_ns.class_('StatusLEDComponent', Component) +StatusLEDComponent = esphome_ns.class_('StatusLEDComponent', Component) CONFIG_SCHEMA = vol.Schema({ cv.GenerateID(): cv.declare_variable_id(StatusLEDComponent), diff --git a/esphomeyaml/components/stepper/__init__.py b/esphome/components/stepper/__init__.py similarity index 88% rename from esphomeyaml/components/stepper/__init__.py rename to esphome/components/stepper/__init__.py index fe9ec064cc..fa601d8330 100644 --- a/esphomeyaml/components/stepper/__init__.py +++ b/esphome/components/stepper/__init__.py @@ -1,19 +1,19 @@ import voluptuous as vol -from esphomeyaml.automation import ACTION_REGISTRY -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ACCELERATION, CONF_DECELERATION, CONF_ID, CONF_MAX_SPEED, \ +from esphome.automation import ACTION_REGISTRY +import esphome.config_validation as cv +from esphome.const import CONF_ACCELERATION, CONF_DECELERATION, CONF_ID, CONF_MAX_SPEED, \ CONF_POSITION, CONF_TARGET -from esphomeyaml.core import CORE -from esphomeyaml.cpp_generator import Pvariable, add, get_variable, templatable -from esphomeyaml.cpp_types import Action, esphomelib_ns, int32 +from esphome.core import CORE +from esphome.cpp_generator import Pvariable, add, get_variable, templatable +from esphome.cpp_types import Action, esphome_ns, int32 PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ }) # pylint: disable=invalid-name -stepper_ns = esphomelib_ns.namespace('stepper') +stepper_ns = esphome_ns.namespace('stepper') Stepper = stepper_ns.class_('Stepper') SetTargetAction = stepper_ns.class_('SetTargetAction', Action) @@ -120,5 +120,5 @@ def stepper_report_position_to_code(config, action_id, arg_type, template_arg): action = Pvariable(action_id, rhs, type=type) for template_ in templatable(config[CONF_POSITION], arg_type, int32): yield None - add(action.set_target(template_)) + add(action.set_position(template_)) yield action diff --git a/esphomeyaml/components/stepper/a4988.py b/esphome/components/stepper/a4988.py similarity index 72% rename from esphomeyaml/components/stepper/a4988.py rename to esphome/components/stepper/a4988.py index acdc378afe..76a0dfc1c5 100644 --- a/esphomeyaml/components/stepper/a4988.py +++ b/esphome/components/stepper/a4988.py @@ -1,12 +1,12 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import stepper -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_DIR_PIN, CONF_ID, CONF_SLEEP_PIN, CONF_STEP_PIN -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component -from esphomeyaml.cpp_types import Component, App +from esphome import pins +from esphome.components import stepper +import esphome.config_validation as cv +from esphome.const import CONF_DIR_PIN, CONF_ID, CONF_SLEEP_PIN, CONF_STEP_PIN +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import gpio_output_pin_expression, setup_component +from esphome.cpp_types import App, Component A4988 = stepper.stepper_ns.class_('A4988', stepper.Stepper, Component) diff --git a/esphomeyaml/components/stepper/uln2003.py b/esphome/components/stepper/uln2003.py similarity index 81% rename from esphomeyaml/components/stepper/uln2003.py rename to esphome/components/stepper/uln2003.py index b0b2834d05..550a78c4a8 100644 --- a/esphomeyaml/components/stepper/uln2003.py +++ b/esphome/components/stepper/uln2003.py @@ -1,13 +1,13 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import stepper -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ID, CONF_PIN_A, CONF_PIN_B, CONF_PIN_C, CONF_PIN_D, \ +from esphome import pins +from esphome.components import stepper +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_PIN_A, CONF_PIN_B, CONF_PIN_C, CONF_PIN_D, \ CONF_SLEEP_WHEN_DONE, CONF_STEP_MODE -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component -from esphomeyaml.cpp_types import App, Component +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import gpio_output_pin_expression, setup_component +from esphome.cpp_types import App, Component ULN2003StepMode = stepper.stepper_ns.enum('ULN2003StepMode') diff --git a/esphomeyaml/components/substitutions.py b/esphome/components/substitutions.py similarity index 91% rename from esphomeyaml/components/substitutions.py rename to esphome/components/substitutions.py index 65b3e08402..3177ed8a44 100644 --- a/esphomeyaml/components/substitutions.py +++ b/esphome/components/substitutions.py @@ -3,9 +3,9 @@ import re import voluptuous as vol -from esphomeyaml import core -import esphomeyaml.config_validation as cv -from esphomeyaml.core import EsphomeyamlError +from esphome import core +import esphome.config_validation as cv +from esphome.core import EsphomeError _LOGGER = logging.getLogger(__name__) @@ -110,8 +110,8 @@ def do_substitution_pass(config): substitutions = config[CONF_SUBSTITUTIONS] if not isinstance(substitutions, dict): - raise EsphomeyamlError(u"Substitutions must be a key to value mapping, got {}" - u"".format(type(substitutions))) + raise EsphomeError(u"Substitutions must be a key to value mapping, got {}" + u"".format(type(substitutions))) key = '' try: @@ -127,7 +127,7 @@ def do_substitution_pass(config): except vol.Invalid as err: err.path.append(key) - raise EsphomeyamlError(u"Error while parsing substitutions: {}".format(err)) + raise EsphomeError(u"Error while parsing substitutions: {}".format(err)) config[CONF_SUBSTITUTIONS] = substitutions _substitute_item(substitutions, config, []) diff --git a/esphomeyaml/components/switch/__init__.py b/esphome/components/switch/__init__.py similarity index 67% rename from esphomeyaml/components/switch/__init__.py rename to esphome/components/switch/__init__.py index 3febc06966..cd6fe3e3c7 100644 --- a/esphomeyaml/components/switch/__init__.py +++ b/esphome/components/switch/__init__.py @@ -1,19 +1,21 @@ import voluptuous as vol -from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY, CONDITION_REGISTRY, Condition -from esphomeyaml.components import mqtt -from esphomeyaml.components.mqtt import setup_mqtt_component -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ICON, CONF_ID, CONF_INVERTED, CONF_MQTT_ID, CONF_INTERNAL, \ - CONF_OPTIMISTIC -from esphomeyaml.cpp_generator import add, Pvariable, get_variable -from esphomeyaml.cpp_types import esphomelib_ns, Nameable, Action, App +from esphome import automation +from esphome.automation import ACTION_REGISTRY, CONDITION_REGISTRY, Condition, maybe_simple_id +from esphome.components import mqtt +from esphome.components.mqtt import setup_mqtt_component +import esphome.config_validation as cv +from esphome.const import CONF_ICON, CONF_ID, CONF_INTERNAL, CONF_INVERTED, CONF_MQTT_ID, \ + CONF_ON_TURN_OFF, CONF_ON_TURN_ON, CONF_OPTIMISTIC, CONF_TRIGGER_ID +from esphome.core import CORE +from esphome.cpp_generator import Pvariable, add, get_variable +from esphome.cpp_types import Action, App, Nameable, NoArg, Trigger, esphome_ns PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ }) -switch_ns = esphomelib_ns.namespace('switch_') +switch_ns = esphome_ns.namespace('switch_') Switch = switch_ns.class_('Switch', Nameable) SwitchPtr = Switch.operator('ptr') MQTTSwitchComponent = switch_ns.class_('MQTTSwitchComponent', mqtt.MQTTComponent) @@ -23,43 +25,57 @@ TurnOffAction = switch_ns.class_('TurnOffAction', Action) TurnOnAction = switch_ns.class_('TurnOnAction', Action) SwitchCondition = switch_ns.class_('SwitchCondition', Condition) +SwitchTurnOnTrigger = switch_ns.class_('SwitchTurnOnTrigger', Trigger.template(NoArg)) +SwitchTurnOffTrigger = switch_ns.class_('SwitchTurnOffTrigger', Trigger.template(NoArg)) SWITCH_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend({ cv.GenerateID(CONF_MQTT_ID): cv.declare_variable_id(MQTTSwitchComponent), vol.Optional(CONF_ICON): cv.icon, vol.Optional(CONF_INVERTED): cv.boolean, + vol.Optional(CONF_ON_TURN_ON): automation.validate_automation({ + cv.GenerateID(CONF_TRIGGER_ID): cv.declare_variable_id(SwitchTurnOnTrigger), + }), + vol.Optional(CONF_ON_TURN_OFF): automation.validate_automation({ + cv.GenerateID(CONF_TRIGGER_ID): cv.declare_variable_id(SwitchTurnOffTrigger), + }), }) SWITCH_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(SWITCH_SCHEMA.schema) -def setup_switch_core_(switch_var, mqtt_var, config): +def setup_switch_core_(switch_var, config): if CONF_INTERNAL in config: add(switch_var.set_internal(config[CONF_INTERNAL])) if CONF_ICON in config: add(switch_var.set_icon(config[CONF_ICON])) if CONF_INVERTED in config: add(switch_var.set_inverted(config[CONF_INVERTED])) + for conf in config.get(CONF_ON_TURN_ON, []): + rhs = switch_var.make_switch_turn_on_trigger() + trigger = Pvariable(conf[CONF_TRIGGER_ID], rhs) + automation.build_automation(trigger, NoArg, conf) + for conf in config.get(CONF_ON_TURN_OFF, []): + rhs = switch_var.make_switch_turn_off_trigger() + trigger = Pvariable(conf[CONF_TRIGGER_ID], rhs) + automation.build_automation(trigger, NoArg, conf) - setup_mqtt_component(mqtt_var, config) + setup_mqtt_component(switch_var.Pget_mqtt(), config) -def setup_switch(switch_obj, mqtt_obj, config): - switch_var = Pvariable(config[CONF_ID], switch_obj, has_side_effects=False) - mqtt_var = Pvariable(config[CONF_MQTT_ID], mqtt_obj, has_side_effects=False) - setup_switch_core_(switch_var, mqtt_var, config) +def setup_switch(switch_obj, config): + if not CORE.has_id(config[CONF_ID]): + switch_obj = Pvariable(config[CONF_ID], switch_obj, has_side_effects=True) + CORE.add_job(setup_switch_core_, switch_obj, config) def register_switch(var, config): switch_var = Pvariable(config[CONF_ID], var, has_side_effects=True) - rhs = App.register_switch(switch_var) - mqtt_var = Pvariable(config[CONF_MQTT_ID], rhs, has_side_effects=True) - setup_switch_core_(switch_var, mqtt_var, config) + add(App.register_switch(switch_var)) + CORE.add_job(setup_switch_core_, switch_var, config) BUILD_FLAGS = '-DUSE_SWITCH' - CONF_SWITCH_TOGGLE = 'switch.toggle' SWITCH_TOGGLE_ACTION_SCHEMA = maybe_simple_id({ vol.Required(CONF_ID): cv.use_variable_id(Switch), diff --git a/esphomeyaml/components/switch/custom.py b/esphome/components/switch/custom.py similarity index 67% rename from esphomeyaml/components/switch/custom.py rename to esphome/components/switch/custom.py index a763744ea9..1b165f2b18 100644 --- a/esphomeyaml/components/switch/custom.py +++ b/esphome/components/switch/custom.py @@ -1,10 +1,10 @@ import voluptuous as vol -from esphomeyaml.components import switch -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ID, CONF_LAMBDA, CONF_SWITCHES -from esphomeyaml.cpp_generator import process_lambda, variable -from esphomeyaml.cpp_types import std_vector +from esphome.components import switch +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_LAMBDA, CONF_NAME, CONF_SWITCHES +from esphome.cpp_generator import add, process_lambda, variable +from esphome.cpp_types import std_vector CustomSwitchConstructor = switch.switch_ns.class_('CustomSwitchConstructor') @@ -25,8 +25,10 @@ def to_code(config): rhs = CustomSwitchConstructor(template_) custom = variable(config[CONF_ID], rhs) - for i, sens in enumerate(config[CONF_SWITCHES]): - switch.register_switch(custom.get_switch(i), sens) + for i, conf in enumerate(config[CONF_SWITCHES]): + rhs = custom.Pget_switch(i) + add(rhs.set_name(conf[CONF_NAME])) + switch.register_switch(rhs, conf) BUILD_FLAGS = '-DUSE_CUSTOM_SWITCH' diff --git a/esphomeyaml/components/switch/gpio.py b/esphome/components/switch/gpio.py similarity index 60% rename from esphomeyaml/components/switch/gpio.py rename to esphome/components/switch/gpio.py index b8b8efa021..4c46315a7e 100644 --- a/esphomeyaml/components/switch/gpio.py +++ b/esphome/components/switch/gpio.py @@ -1,14 +1,13 @@ import voluptuous as vol -from esphomeyaml import pins -from esphomeyaml.components import switch -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_PIN, CONF_RESTORE_MODE -from esphomeyaml.cpp_generator import add, variable -from esphomeyaml.cpp_helpers import gpio_output_pin_expression, setup_component -from esphomeyaml.cpp_types import App, Application, Component +from esphome import pins +from esphome.components import switch +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_INTERLOCK, CONF_NAME, CONF_PIN, CONF_RESTORE_MODE +from esphome.cpp_generator import Pvariable, add, get_variable +from esphome.cpp_helpers import gpio_output_pin_expression, setup_component +from esphome.cpp_types import App, Component -MakeGPIOSwitch = Application.struct('MakeGPIOSwitch') GPIOSwitch = switch.switch_ns.class_('GPIOSwitch', switch.Switch, Component) GPIOSwitchRestoreMode = switch.switch_ns.enum('GPIOSwitchRestoreMode') @@ -21,9 +20,9 @@ RESTORE_MODES = { PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(GPIOSwitch), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeGPIOSwitch), vol.Required(CONF_PIN): pins.gpio_output_pin_schema, vol.Optional(CONF_RESTORE_MODE): cv.one_of(*RESTORE_MODES, upper=True, space='_'), + vol.Optional(CONF_INTERLOCK): cv.ensure_list(cv.use_variable_id(switch.Switch)), }).extend(cv.COMPONENT_SCHEMA.schema)) @@ -31,13 +30,20 @@ def to_code(config): for pin in gpio_output_pin_expression(config[CONF_PIN]): yield rhs = App.make_gpio_switch(config[CONF_NAME], pin) - make = variable(config[CONF_MAKE_ID], rhs) - gpio = make.Pswitch_ + gpio = Pvariable(config[CONF_ID], rhs) if CONF_RESTORE_MODE in config: add(gpio.set_restore_mode(RESTORE_MODES[config[CONF_RESTORE_MODE]])) - switch.setup_switch(gpio, make.Pmqtt, config) + if CONF_INTERLOCK in config: + interlock = [] + for it in config[CONF_INTERLOCK]: + for lock in get_variable(it): + yield + interlock.append(lock) + add(gpio.set_interlock(interlock)) + + switch.setup_switch(gpio, config) setup_component(gpio, config) diff --git a/esphomeyaml/components/switch/output.py b/esphome/components/switch/output.py similarity index 52% rename from esphomeyaml/components/switch/output.py rename to esphome/components/switch/output.py index 79764a7fcc..54c5ec6554 100644 --- a/esphomeyaml/components/switch/output.py +++ b/esphome/components/switch/output.py @@ -1,18 +1,16 @@ import voluptuous as vol -from esphomeyaml.components import output, switch -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_OUTPUT -from esphomeyaml.cpp_generator import get_variable, variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Application, Component +from esphome.components import output, switch +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_NAME, CONF_OUTPUT +from esphome.cpp_generator import Pvariable, get_variable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Component -MakeOutputSwitch = Application.struct('MakeOutputSwitch') OutputSwitch = switch.switch_ns.class_('OutputSwitch', switch.Switch, Component) PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(OutputSwitch), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeOutputSwitch), vol.Required(CONF_OUTPUT): cv.use_variable_id(output.BinaryOutput), }).extend(cv.COMPONENT_SCHEMA.schema)) @@ -21,10 +19,9 @@ def to_code(config): for output_ in get_variable(config[CONF_OUTPUT]): yield rhs = App.make_output_switch(config[CONF_NAME], output_) - make = variable(config[CONF_MAKE_ID], rhs) - switch_ = make.Pswitch_ + switch_ = Pvariable(config[CONF_ID], rhs) - switch.setup_switch(switch_, make.Pmqtt, config) + switch.setup_switch(switch_, config) setup_component(switch, config) diff --git a/esphomeyaml/components/switch/remote_transmitter.py b/esphome/components/switch/remote_transmitter.py similarity index 74% rename from esphomeyaml/components/switch/remote_transmitter.py rename to esphome/components/switch/remote_transmitter.py index 5afc018bda..217eec0c00 100644 --- a/esphomeyaml/components/switch/remote_transmitter.py +++ b/esphome/components/switch/remote_transmitter.py @@ -1,33 +1,37 @@ import voluptuous as vol -from esphomeyaml.components import switch -from esphomeyaml.components.remote_transmitter import RC_SWITCH_RAW_SCHEMA, \ +from esphome.components import switch +from esphome.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_D_SCHEMA, RemoteTransmitterComponent, binary_code, build_rc_switch_protocol, \ remote_ns -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ADDRESS, CONF_CARRIER_FREQUENCY, CONF_CHANNEL, CONF_CODE, \ - CONF_COMMAND, CONF_DATA, CONF_DEVICE, CONF_FAMILY, CONF_GROUP, CONF_INVERTED, 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_REPEAT, CONF_SAMSUNG, CONF_SONY, CONF_STATE, CONF_TIMES, \ - CONF_WAIT_TIME -from esphomeyaml.cpp_generator import ArrayInitializer, Pvariable, add, get_variable +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS, CONF_CARRIER_FREQUENCY, CONF_CHANNEL, CONF_CODE, \ + CONF_COMMAND, CONF_DATA, CONF_DEVICE, CONF_FAMILY, CONF_GROUP, CONF_ID, CONF_INVERTED, \ + 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_REPEAT, CONF_SAMSUNG, CONF_SONY, CONF_STATE, CONF_TIMES, \ + CONF_WAIT_TIME, CONF_RC5 +from esphome.cpp_generator import Pvariable, add, get_variable, progmem_array +from esphome.cpp_types import int32 DEPENDENCIES = ['remote_transmitter'] -REMOTE_KEYS = [CONF_NEC, CONF_LG, CONF_SAMSUNG, CONF_SONY, CONF_PANASONIC, CONF_RAW, +REMOTE_KEYS = [CONF_JVC, CONF_NEC, CONF_LG, CONF_SAMSUNG, CONF_SONY, CONF_PANASONIC, 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_RC_SWITCH_TYPE_C, CONF_RC_SWITCH_TYPE_D, CONF_RC5] CONF_REMOTE_TRANSMITTER_ID = 'remote_transmitter_id' CONF_TRANSMITTER_ID = 'transmitter_id' RemoteTransmitter = remote_ns.class_('RemoteTransmitter', switch.Switch) +JVCTransmitter = remote_ns.class_('JVCTransmitter', RemoteTransmitter) LGTransmitter = remote_ns.class_('LGTransmitter', RemoteTransmitter) NECTransmitter = remote_ns.class_('NECTransmitter', RemoteTransmitter) PanasonicTransmitter = remote_ns.class_('PanasonicTransmitter', RemoteTransmitter) RawTransmitter = remote_ns.class_('RawTransmitter', RemoteTransmitter) +RC5Transmitter = remote_ns.class_('RC5Transmitter', RemoteTransmitter) SamsungTransmitter = remote_ns.class_('SamsungTransmitter', RemoteTransmitter) SonyTransmitter = remote_ns.class_('SonyTransmitter', RemoteTransmitter) RCSwitchRawTransmitter = remote_ns.class_('RCSwitchRawTransmitter', RemoteTransmitter) @@ -36,10 +40,24 @@ RCSwitchTypeBTransmitter = remote_ns.class_('RCSwitchTypeBTransmitter', RCSwitch RCSwitchTypeCTransmitter = remote_ns.class_('RCSwitchTypeCTransmitter', RCSwitchRawTransmitter) RCSwitchTypeDTransmitter = remote_ns.class_('RCSwitchTypeDTransmitter', RCSwitchRawTransmitter) -validate_raw_data = [vol.Any(vol.Coerce(int), cv.time_period_microseconds)] + +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)], + vol.Optional(CONF_CARRIER_FREQUENCY): vol.All(cv.frequency, vol.Coerce(int)), + })(value) + return validate_raw({ + CONF_DATA: value + }) + PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(RemoteTransmitter), + vol.Optional(CONF_JVC): vol.Schema({ + vol.Required(CONF_DATA): cv.hex_uint32_t, + }), vol.Optional(CONF_LG): vol.Schema({ vol.Required(CONF_DATA): cv.hex_uint32_t, vol.Optional(CONF_NBITS, default=28): cv.one_of(28, 32, int=True), @@ -59,10 +77,11 @@ PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ vol.Required(CONF_ADDRESS): cv.hex_uint16_t, vol.Required(CONF_COMMAND): cv.hex_uint32_t, }), - vol.Optional(CONF_RAW): vol.Any(validate_raw_data, vol.Schema({ - vol.Required(CONF_DATA): validate_raw_data, - vol.Optional(CONF_CARRIER_FREQUENCY): vol.All(cv.frequency, vol.Coerce(int)), - })), + 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_TYPE_A): RC_SWITCH_TYPE_A_SCHEMA, vol.Optional(CONF_RC_SWITCH_TYPE_B): RC_SWITCH_TYPE_B_SCHEMA, @@ -83,6 +102,8 @@ def transmitter_base(full_config): name = full_config[CONF_NAME] key, config = next((k, v) for k, v in full_config.items() if k in REMOTE_KEYS) + if key == CONF_JVC: + return JVCTransmitter.new(name, config[CONF_DATA]) if key == CONF_LG: return LGTransmitter.new(name, config[CONF_DATA], config[CONF_NBITS]) if key == CONF_NEC: @@ -93,15 +114,12 @@ def transmitter_base(full_config): return SamsungTransmitter.new(name, config[CONF_DATA]) if key == CONF_SONY: return SonyTransmitter.new(name, config[CONF_DATA], config[CONF_NBITS]) + if key == CONF_RC5: + return RC5Transmitter.new(name, config[CONF_ADDRESS], config[CONF_COMMAND]) if key == CONF_RAW: - if isinstance(config, dict): - data = config[CONF_DATA] - carrier_frequency = config.get(CONF_CARRIER_FREQUENCY) - else: - data = config - carrier_frequency = None - return RawTransmitter.new(name, ArrayInitializer(*data, multiline=False), - carrier_frequency) + arr = progmem_array(config[CONF_ID], config[CONF_DATA]) + return RawTransmitter.new(name, arr, len(config[CONF_DATA]), + config.get(CONF_CARRIER_FREQUENCY)) if key == CONF_RC_SWITCH_RAW: return RCSwitchRawTransmitter.new(name, build_rc_switch_protocol(config[CONF_PROTOCOL]), binary_code(config[CONF_CODE]), len(config[CONF_CODE])) diff --git a/esphomeyaml/components/switch/restart.py b/esphome/components/switch/restart.py similarity index 51% rename from esphomeyaml/components/switch/restart.py rename to esphome/components/switch/restart.py index f45236f896..915bfcab50 100644 --- a/esphomeyaml/components/switch/restart.py +++ b/esphome/components/switch/restart.py @@ -1,25 +1,23 @@ import voluptuous as vol -from esphomeyaml.components import switch -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_INVERTED, CONF_MAKE_ID, CONF_NAME -from esphomeyaml.cpp_generator import variable -from esphomeyaml.cpp_types import App, Application +from esphome.components import switch +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_INVERTED, CONF_NAME +from esphome.cpp_generator import Pvariable +from esphome.cpp_types import App -MakeRestartSwitch = Application.struct('MakeRestartSwitch') RestartSwitch = switch.switch_ns.class_('RestartSwitch', switch.Switch) PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(RestartSwitch), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeRestartSwitch), vol.Optional(CONF_INVERTED): cv.invalid("Restart switches do not support inverted mode!"), })) def to_code(config): rhs = App.make_restart_switch(config[CONF_NAME]) - restart = variable(config[CONF_MAKE_ID], rhs) - switch.setup_switch(restart.Prestart, restart.Pmqtt, config) + restart = Pvariable(config[CONF_ID], rhs) + switch.setup_switch(restart, config) BUILD_FLAGS = '-DUSE_RESTART_SWITCH' diff --git a/esphomeyaml/components/switch/shutdown.py b/esphome/components/switch/shutdown.py similarity index 51% rename from esphomeyaml/components/switch/shutdown.py rename to esphome/components/switch/shutdown.py index a784022544..10f98a8a9f 100644 --- a/esphomeyaml/components/switch/shutdown.py +++ b/esphome/components/switch/shutdown.py @@ -1,25 +1,23 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml.components import switch -from esphomeyaml.const import CONF_INVERTED, CONF_MAKE_ID, CONF_NAME -from esphomeyaml.cpp_generator import variable -from esphomeyaml.cpp_types import Application, App +from esphome.components import switch +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_INVERTED, CONF_NAME +from esphome.cpp_generator import Pvariable +from esphome.cpp_types import App -MakeShutdownSwitch = Application.struct('MakeShutdownSwitch') ShutdownSwitch = switch.switch_ns.class_('ShutdownSwitch', switch.Switch) PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(ShutdownSwitch), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeShutdownSwitch), vol.Optional(CONF_INVERTED): cv.invalid("Shutdown switches do not support inverted mode!"), })) def to_code(config): rhs = App.make_shutdown_switch(config[CONF_NAME]) - shutdown = variable(config[CONF_MAKE_ID], rhs) - switch.setup_switch(shutdown.Pshutdown, shutdown.Pmqtt, config) + shutdown = Pvariable(config[CONF_ID], rhs) + switch.setup_switch(shutdown, config) BUILD_FLAGS = '-DUSE_SHUTDOWN_SWITCH' diff --git a/esphome/components/switch/template.py b/esphome/components/switch/template.py new file mode 100644 index 0000000000..6fd34dd462 --- /dev/null +++ b/esphome/components/switch/template.py @@ -0,0 +1,78 @@ +import voluptuous as vol + +from esphome import automation +from esphome.automation import ACTION_REGISTRY +from esphome.components import switch +import esphome.config_validation as cv +from esphome.const import CONF_ASSUMED_STATE, CONF_ID, CONF_LAMBDA, CONF_NAME, CONF_OPTIMISTIC, \ + CONF_RESTORE_STATE, CONF_STATE, CONF_TURN_OFF_ACTION, CONF_TURN_ON_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, Component, NoArg, bool_, optional + +TemplateSwitch = switch.switch_ns.class_('TemplateSwitch', switch.Switch, Component) +SwitchPublishAction = switch.switch_ns.class_('SwitchPublishAction', Action) + +PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(TemplateSwitch), + vol.Optional(CONF_LAMBDA): cv.lambda_, + vol.Optional(CONF_OPTIMISTIC): cv.boolean, + vol.Optional(CONF_ASSUMED_STATE): cv.boolean, + vol.Optional(CONF_TURN_OFF_ACTION): automation.validate_automation(single=True), + vol.Optional(CONF_TURN_ON_ACTION): automation.validate_automation(single=True), + vol.Optional(CONF_RESTORE_STATE): cv.boolean, +}).extend(cv.COMPONENT_SCHEMA.schema)) + + +def to_code(config): + rhs = App.make_template_switch(config[CONF_NAME]) + template = Pvariable(config[CONF_ID], rhs) + + switch.setup_switch(template, config) + + if CONF_LAMBDA in config: + for template_ in process_lambda(config[CONF_LAMBDA], [], + return_type=optional.template(bool_)): + yield + add(template.set_state_lambda(template_)) + if CONF_TURN_OFF_ACTION in config: + automation.build_automation(template.get_turn_off_trigger(), NoArg, + config[CONF_TURN_OFF_ACTION]) + if CONF_TURN_ON_ACTION in config: + automation.build_automation(template.get_turn_on_trigger(), NoArg, + config[CONF_TURN_ON_ACTION]) + if CONF_OPTIMISTIC in config: + add(template.set_optimistic(config[CONF_OPTIMISTIC])) + if CONF_ASSUMED_STATE in config: + add(template.set_assumed_state(config[CONF_ASSUMED_STATE])) + + if CONF_RESTORE_STATE in config: + add(template.set_restore_state(config[CONF_RESTORE_STATE])) + + setup_component(template, config) + + +BUILD_FLAGS = '-DUSE_TEMPLATE_SWITCH' + +CONF_SWITCH_TEMPLATE_PUBLISH = 'switch.template.publish' +SWITCH_TEMPLATE_PUBLISH_ACTION_SCHEMA = vol.Schema({ + vol.Required(CONF_ID): cv.use_variable_id(switch.Switch), + vol.Required(CONF_STATE): cv.templatable(cv.boolean), +}) + + +@ACTION_REGISTRY.register(CONF_SWITCH_TEMPLATE_PUBLISH, SWITCH_TEMPLATE_PUBLISH_ACTION_SCHEMA) +def switch_template_publish_to_code(config, action_id, arg_type, template_arg): + for var in get_variable(config[CONF_ID]): + yield None + rhs = var.make_switch_publish_action(template_arg) + type = SwitchPublishAction.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 switch.core_to_hass_config(data, config) diff --git a/esphomeyaml/components/switch/uart.py b/esphome/components/switch/uart.py similarity index 58% rename from esphomeyaml/components/switch/uart.py rename to esphome/components/switch/uart.py index 6a5dfdeba4..4c5852c38e 100644 --- a/esphomeyaml/components/switch/uart.py +++ b/esphome/components/switch/uart.py @@ -1,17 +1,16 @@ import voluptuous as vol -from esphomeyaml.components import switch, uart -from esphomeyaml.components.uart import UARTComponent -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_DATA, CONF_INVERTED, CONF_MAKE_ID, CONF_NAME, CONF_UART_ID -from esphomeyaml.core import HexInt -from esphomeyaml.cpp_generator import ArrayInitializer, get_variable, variable -from esphomeyaml.cpp_types import App, Application -from esphomeyaml.py_compat import text_type +from esphome.components import switch, uart +from esphome.components.uart import UARTComponent +import esphome.config_validation as cv +from esphome.const import CONF_DATA, CONF_ID, CONF_INVERTED, CONF_NAME, CONF_UART_ID +from esphome.core import HexInt +from esphome.cpp_generator import Pvariable, get_variable +from esphome.cpp_types import App +from esphome.py_compat import text_type DEPENDENCIES = ['uart'] -MakeUARTSwitch = Application.struct('MakeUARTSwitch') UARTSwitch = switch.switch_ns.class_('UARTSwitch', switch.Switch, uart.UARTDevice) @@ -27,7 +26,6 @@ def validate_data(value): PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(UARTSwitch), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeUARTSwitch), cv.GenerateID(CONF_UART_ID): cv.use_variable_id(UARTComponent), vol.Required(CONF_DATA): validate_data, vol.Optional(CONF_INVERTED): cv.invalid("UART switches do not support inverted mode!"), @@ -40,9 +38,9 @@ def to_code(config): data = config[CONF_DATA] if isinstance(data, str): data = [HexInt(ord(x)) for x in data] - rhs = App.make_uart_switch(uart_, config[CONF_NAME], ArrayInitializer(*data, multiline=False)) - restart = variable(config[CONF_MAKE_ID], rhs) - switch.setup_switch(restart.Puart, restart.Pmqtt, config) + rhs = App.make_uart_switch(uart_, config[CONF_NAME], data) + var = Pvariable(config[CONF_ID], rhs) + switch.setup_switch(var, config) BUILD_FLAGS = '-DUSE_UART_SWITCH' diff --git a/esphomeyaml/components/text_sensor/__init__.py b/esphome/components/text_sensor/__init__.py similarity index 60% rename from esphomeyaml/components/text_sensor/__init__.py rename to esphome/components/text_sensor/__init__.py index 91b56177df..e98df74fce 100644 --- a/esphomeyaml/components/text_sensor/__init__.py +++ b/esphome/components/text_sensor/__init__.py @@ -1,27 +1,28 @@ import voluptuous as vol -from esphomeyaml import automation -from esphomeyaml.components import mqtt -from esphomeyaml.components.mqtt import setup_mqtt_component -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ICON, CONF_ID, CONF_INTERNAL, CONF_MQTT_ID, CONF_ON_VALUE, \ +from esphome import automation +from esphome.components import mqtt +from esphome.components.mqtt import setup_mqtt_component +import esphome.config_validation as cv +from esphome.const import CONF_ICON, CONF_ID, CONF_INTERNAL, CONF_MQTT_ID, CONF_ON_VALUE, \ CONF_TRIGGER_ID -from esphomeyaml.core import CORE -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_types import esphomelib_ns, Nameable, Trigger, std_string, App +from esphome.core import CORE +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_types import App, Nameable, Trigger, esphome_ns, std_string, Action PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ }) # pylint: disable=invalid-name -text_sensor_ns = esphomelib_ns.namespace('text_sensor') +text_sensor_ns = esphome_ns.namespace('text_sensor') TextSensor = text_sensor_ns.class_('TextSensor', Nameable) TextSensorPtr = TextSensor.operator('ptr') MQTTTextSensor = text_sensor_ns.class_('MQTTTextSensor', mqtt.MQTTComponent) TextSensorStateTrigger = text_sensor_ns.class_('TextSensorStateTrigger', Trigger.template(std_string)) +TextSensorPublishAction = text_sensor_ns.class_('TextSensorPublishAction', Action) TEXT_SENSOR_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend({ cv.GenerateID(CONF_MQTT_ID): cv.declare_variable_id(MQTTTextSensor), @@ -34,7 +35,7 @@ TEXT_SENSOR_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend({ TEXT_SENSOR_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(TEXT_SENSOR_SCHEMA.schema) -def setup_text_sensor_core_(text_sensor_var, mqtt_var, config): +def setup_text_sensor_core_(text_sensor_var, config): if CONF_INTERNAL in config: add(text_sensor_var.set_internal(config[CONF_INTERNAL])) if CONF_ICON in config: @@ -45,20 +46,19 @@ def setup_text_sensor_core_(text_sensor_var, mqtt_var, config): trigger = Pvariable(conf[CONF_TRIGGER_ID], rhs) automation.build_automation(trigger, std_string, conf) - setup_mqtt_component(mqtt_var, config) + setup_mqtt_component(text_sensor_var.get_mqtt(), config) -def setup_text_sensor(text_sensor_obj, mqtt_obj, config): - sensor_var = Pvariable(config[CONF_ID], text_sensor_obj, has_side_effects=False) - mqtt_var = Pvariable(config[CONF_MQTT_ID], mqtt_obj, has_side_effects=False) - CORE.add_job(setup_text_sensor_core_, sensor_var, mqtt_var, config) +def setup_text_sensor(text_sensor_obj, config): + if not CORE.has_id(config[CONF_ID]): + text_sensor_obj = Pvariable(config[CONF_ID], text_sensor_obj, has_side_effects=True) + CORE.add_job(setup_text_sensor_core_, text_sensor_obj, config) def register_text_sensor(var, config): text_sensor_var = Pvariable(config[CONF_ID], var, has_side_effects=True) - rhs = App.register_text_sensor(text_sensor_var) - mqtt_var = Pvariable(config[CONF_MQTT_ID], rhs, has_side_effects=True) - CORE.add_job(setup_text_sensor_core_, text_sensor_var, mqtt_var, config) + add(App.register_text_sensor(text_sensor_var)) + CORE.add_job(setup_text_sensor_core_, text_sensor_var, config) BUILD_FLAGS = '-DUSE_TEXT_SENSOR' diff --git a/esphomeyaml/components/text_sensor/custom.py b/esphome/components/text_sensor/custom.py similarity index 67% rename from esphomeyaml/components/text_sensor/custom.py rename to esphome/components/text_sensor/custom.py index 468e971ef5..342c08d8fb 100644 --- a/esphomeyaml/components/text_sensor/custom.py +++ b/esphome/components/text_sensor/custom.py @@ -1,10 +1,10 @@ import voluptuous as vol -from esphomeyaml.components import text_sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ID, CONF_LAMBDA, CONF_TEXT_SENSORS -from esphomeyaml.cpp_generator import process_lambda, variable -from esphomeyaml.cpp_types import std_vector +from esphome.components import text_sensor +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_LAMBDA, CONF_NAME, CONF_TEXT_SENSORS +from esphome.cpp_generator import add, process_lambda, variable +from esphome.cpp_types import std_vector CustomTextSensorConstructor = text_sensor.text_sensor_ns.class_('CustomTextSensorConstructor') @@ -25,8 +25,10 @@ def to_code(config): rhs = CustomTextSensorConstructor(template_) custom = variable(config[CONF_ID], rhs) - for i, sens in enumerate(config[CONF_TEXT_SENSORS]): - text_sensor.register_text_sensor(custom.get_text_sensor(i), sens) + for i, conf in enumerate(config[CONF_TEXT_SENSORS]): + rhs = custom.Pget_text_sensor(i) + add(rhs.set_name(conf[CONF_NAME])) + text_sensor.register_text_sensor(rhs, conf) BUILD_FLAGS = '-DUSE_CUSTOM_TEXT_SENSOR' diff --git a/esphomeyaml/components/text_sensor/homeassistant.py b/esphome/components/text_sensor/homeassistant.py similarity index 54% rename from esphomeyaml/components/text_sensor/homeassistant.py rename to esphome/components/text_sensor/homeassistant.py index 0c6a0d04d2..bcfe656cb0 100644 --- a/esphomeyaml/components/text_sensor/homeassistant.py +++ b/esphome/components/text_sensor/homeassistant.py @@ -1,29 +1,26 @@ import voluptuous as vol -from esphomeyaml.components import text_sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ENTITY_ID, CONF_MAKE_ID, CONF_NAME -from esphomeyaml.cpp_generator import variable -from esphomeyaml.cpp_types import App, Application, Component +from esphome.components import text_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, Component DEPENDENCIES = ['api'] -MakeHomeassistantTextSensor = Application.struct('MakeHomeassistantTextSensor') HomeassistantTextSensor = text_sensor.text_sensor_ns.class_('HomeassistantTextSensor', text_sensor.TextSensor, Component) PLATFORM_SCHEMA = cv.nameable(text_sensor.TEXT_SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(HomeassistantTextSensor), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHomeassistantTextSensor), vol.Required(CONF_ENTITY_ID): cv.entity_id, })) def to_code(config): rhs = App.make_homeassistant_text_sensor(config[CONF_NAME], config[CONF_ENTITY_ID]) - make = variable(config[CONF_MAKE_ID], rhs) - sensor_ = make.Psensor - text_sensor.setup_text_sensor(sensor_, make.Pmqtt, config) + sensor_ = Pvariable(config[CONF_ID], rhs) + text_sensor.setup_text_sensor(sensor_, config) BUILD_FLAGS = '-DUSE_HOMEASSISTANT_TEXT_SENSOR' diff --git a/esphomeyaml/components/text_sensor/mqtt_subscribe.py b/esphome/components/text_sensor/mqtt_subscribe.py similarity index 58% rename from esphomeyaml/components/text_sensor/mqtt_subscribe.py rename to esphome/components/text_sensor/mqtt_subscribe.py index 826b03ebdf..ead467700a 100644 --- a/esphomeyaml/components/text_sensor/mqtt_subscribe.py +++ b/esphome/components/text_sensor/mqtt_subscribe.py @@ -1,21 +1,19 @@ import voluptuous as vol -from esphomeyaml.components import text_sensor -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_QOS, CONF_TOPIC -from esphomeyaml.cpp_generator import add, variable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App, Application, Component +from esphome.components import text_sensor +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_NAME, CONF_QOS, CONF_TOPIC +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Component DEPENDENCIES = ['mqtt'] -MakeMQTTSubscribeTextSensor = Application.struct('MakeMQTTSubscribeTextSensor') MQTTSubscribeTextSensor = text_sensor.text_sensor_ns.class_('MQTTSubscribeTextSensor', text_sensor.TextSensor, Component) PLATFORM_SCHEMA = cv.nameable(text_sensor.TEXT_SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(MQTTSubscribeTextSensor), - cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeMQTTSubscribeTextSensor), vol.Required(CONF_TOPIC): cv.subscribe_topic, vol.Optional(CONF_QOS): cv.mqtt_qos, }).extend(cv.COMPONENT_SCHEMA.schema)) @@ -23,13 +21,12 @@ PLATFORM_SCHEMA = cv.nameable(text_sensor.TEXT_SENSOR_PLATFORM_SCHEMA.extend({ def to_code(config): rhs = App.make_mqtt_subscribe_text_sensor(config[CONF_NAME], config[CONF_TOPIC]) - make = variable(config[CONF_MAKE_ID], rhs) - sensor_ = make.Psensor + sensor_ = Pvariable(config[CONF_ID], rhs) if CONF_QOS in config: add(sensor_.set_qos(config[CONF_QOS])) - text_sensor.setup_text_sensor(sensor_, make.Pmqtt, config) + text_sensor.setup_text_sensor(sensor_, config) setup_component(sensor_, config) diff --git a/esphome/components/text_sensor/template.py b/esphome/components/text_sensor/template.py new file mode 100644 index 0000000000..cde833f175 --- /dev/null +++ b/esphome/components/text_sensor/template.py @@ -0,0 +1,59 @@ +import voluptuous as vol + +from esphome.automation import ACTION_REGISTRY +from esphome.components import text_sensor +from esphome.components.text_sensor import TextSensorPublishAction +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_LAMBDA, CONF_NAME, CONF_STATE, CONF_UPDATE_INTERVAL +from esphome.cpp_generator import Pvariable, add, get_variable, process_lambda, templatable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, PollingComponent, optional, std_string + +TemplateTextSensor = text_sensor.text_sensor_ns.class_('TemplateTextSensor', + text_sensor.TextSensor, PollingComponent) + +PLATFORM_SCHEMA = cv.nameable(text_sensor.TEXT_SENSOR_PLATFORM_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(TemplateTextSensor), + vol.Optional(CONF_LAMBDA): cv.lambda_, + vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, +}).extend(cv.COMPONENT_SCHEMA.schema)) + + +def to_code(config): + rhs = App.make_template_text_sensor(config[CONF_NAME], config.get(CONF_UPDATE_INTERVAL)) + template = Pvariable(config[CONF_ID], rhs) + text_sensor.setup_text_sensor(template, config) + setup_component(template, config) + + if CONF_LAMBDA in config: + for template_ in process_lambda(config[CONF_LAMBDA], [], + return_type=optional.template(std_string)): + yield + add(template.set_template(template_)) + + +BUILD_FLAGS = '-DUSE_TEMPLATE_TEXT_SENSOR' + +CONF_TEXT_SENSOR_TEMPLATE_PUBLISH = 'text_sensor.template.publish' +TEXT_SENSOR_TEMPLATE_PUBLISH_ACTION_SCHEMA = vol.Schema({ + vol.Required(CONF_ID): cv.use_variable_id(text_sensor.TextSensor), + vol.Required(CONF_STATE): cv.templatable(cv.string_strict), +}) + + +@ACTION_REGISTRY.register(CONF_TEXT_SENSOR_TEMPLATE_PUBLISH, + TEXT_SENSOR_TEMPLATE_PUBLISH_ACTION_SCHEMA) +def text_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_text_sensor_publish_action(template_arg) + type = TextSensorPublishAction.template(arg_type) + action = Pvariable(action_id, rhs, type=type) + for template_ in templatable(config[CONF_STATE], arg_type, std_string): + yield None + add(action.set_state(template_)) + yield action + + +def to_hass_config(data, config): + return text_sensor.core_to_hass_config(data, config) diff --git a/esphome/components/text_sensor/version.py b/esphome/components/text_sensor/version.py new file mode 100644 index 0000000000..3ef73c5dbb --- /dev/null +++ b/esphome/components/text_sensor/version.py @@ -0,0 +1,27 @@ +from esphome.components import text_sensor +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_NAME +from esphome.cpp_generator import Pvariable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Component + +VersionTextSensor = text_sensor.text_sensor_ns.class_('VersionTextSensor', + text_sensor.TextSensor, Component) + +PLATFORM_SCHEMA = cv.nameable(text_sensor.TEXT_SENSOR_PLATFORM_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(VersionTextSensor), +}).extend(cv.COMPONENT_SCHEMA.schema)) + + +def to_code(config): + rhs = App.make_version_text_sensor(config[CONF_NAME]) + sens = Pvariable(config[CONF_ID], rhs) + text_sensor.setup_text_sensor(sens, config) + setup_component(sens, config) + + +BUILD_FLAGS = '-DUSE_VERSION_TEXT_SENSOR' + + +def to_hass_config(data, config): + return text_sensor.core_to_hass_config(data, config) diff --git a/esphomeyaml/components/time/__init__.py b/esphome/components/time/__init__.py similarity index 91% rename from esphomeyaml/components/time/__init__.py rename to esphome/components/time/__init__.py index 8b78b0dfaa..f73c7c8375 100644 --- a/esphomeyaml/components/time/__init__.py +++ b/esphome/components/time/__init__.py @@ -4,14 +4,14 @@ import math import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml import automation -from esphomeyaml.const import CONF_CRON, CONF_DAYS_OF_MONTH, CONF_DAYS_OF_WEEK, CONF_HOURS, \ +from esphome import automation +import esphome.config_validation as cv +from esphome.const import CONF_CRON, CONF_DAYS_OF_MONTH, CONF_DAYS_OF_WEEK, CONF_HOURS, \ CONF_MINUTES, CONF_MONTHS, CONF_ON_TIME, CONF_SECONDS, CONF_TIMEZONE, CONF_TRIGGER_ID -from esphomeyaml.core import CORE -from esphomeyaml.cpp_generator import add, Pvariable, ArrayInitializer -from esphomeyaml.cpp_types import esphomelib_ns, Component, NoArg, Trigger, App -from esphomeyaml.py_compat import string_types +from esphome.core import CORE +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_types import App, Component, NoArg, Trigger, esphome_ns +from esphome.py_compat import string_types _LOGGER = logging.getLogger(__name__) @@ -19,10 +19,10 @@ PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ }) -time_ns = esphomelib_ns.namespace('time') +time_ns = esphome_ns.namespace('time') RealTimeClockComponent = time_ns.class_('RealTimeClockComponent', Component) CronTrigger = time_ns.class_('CronTrigger', Trigger.template(NoArg), Component) -EsphomelibTime = time_ns.struct('EsphomelibTime') +ESPTime = time_ns.struct('ESPTime') def _tz_timedelta(td): @@ -278,22 +278,22 @@ def setup_time_core_(time_var, config): trigger = Pvariable(conf[CONF_TRIGGER_ID], rhs) seconds = conf.get(CONF_SECONDS, [x for x in range(0, 61)]) - add(trigger.add_seconds(ArrayInitializer(*seconds, multiline=False))) + add(trigger.add_seconds(seconds)) minutes = conf.get(CONF_MINUTES, [x for x in range(0, 60)]) - add(trigger.add_minutes(ArrayInitializer(*minutes, multiline=False))) + add(trigger.add_minutes(minutes)) hours = conf.get(CONF_HOURS, [x for x in range(0, 24)]) - add(trigger.add_hours(ArrayInitializer(*hours, multiline=False))) + add(trigger.add_hours(hours)) days_of_month = conf.get(CONF_DAYS_OF_MONTH, [x for x in range(1, 32)]) - add(trigger.add_days_of_month(ArrayInitializer(*days_of_month, multiline=False))) + add(trigger.add_days_of_month(days_of_month)) months = conf.get(CONF_MONTHS, [x for x in range(1, 13)]) - add(trigger.add_months(ArrayInitializer(*months, multiline=False))) + add(trigger.add_months(months)) days_of_week = conf.get(CONF_DAYS_OF_WEEK, [x for x in range(1, 8)]) - add(trigger.add_days_of_week(ArrayInitializer(*days_of_week, multiline=False))) + add(trigger.add_days_of_week(days_of_week)) automation.build_automation(trigger, NoArg, conf) diff --git a/esphomeyaml/components/time/homeassistant.py b/esphome/components/time/homeassistant.py similarity index 65% rename from esphomeyaml/components/time/homeassistant.py rename to esphome/components/time/homeassistant.py index 3ebe3ca8d4..092798ec12 100644 --- a/esphomeyaml/components/time/homeassistant.py +++ b/esphome/components/time/homeassistant.py @@ -1,10 +1,9 @@ -from esphomeyaml.components import time as time_ -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ID -from esphomeyaml.cpp_generator import Pvariable -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App - +from esphome.components import time as time_ +import esphome.config_validation as cv +from esphome.const import CONF_ID +from esphome.cpp_generator import Pvariable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App DEPENDENCIES = ['api'] diff --git a/esphomeyaml/components/time/sntp.py b/esphome/components/time/sntp.py similarity index 71% rename from esphomeyaml/components/time/sntp.py rename to esphome/components/time/sntp.py index 15d74f3dfd..f3b4a9e866 100644 --- a/esphomeyaml/components/time/sntp.py +++ b/esphome/components/time/sntp.py @@ -1,11 +1,11 @@ import voluptuous as vol -from esphomeyaml.components import time as time_ -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_ID, CONF_SERVERS -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import App +from esphome.components import time as time_ +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_SERVERS +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App SNTPComponent = time_.time_ns.class_('SNTPComponent', time_.RealTimeClockComponent) diff --git a/esphome/components/uart.py b/esphome/components/uart.py new file mode 100644 index 0000000000..65d416ce57 --- /dev/null +++ b/esphome/components/uart.py @@ -0,0 +1,34 @@ +import voluptuous as vol + +from esphome import pins +import esphome.config_validation as cv +from esphome.const import CONF_BAUD_RATE, CONF_ID, CONF_RX_PIN, CONF_TX_PIN +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Component, esphome_ns + +UARTComponent = esphome_ns.class_('UARTComponent', Component) +UARTDevice = esphome_ns.class_('UARTDevice') +MULTI_CONF = True + +CONFIG_SCHEMA = vol.All(vol.Schema({ + cv.GenerateID(): cv.declare_variable_id(UARTComponent), + vol.Optional(CONF_TX_PIN): pins.output_pin, + vol.Optional(CONF_RX_PIN): pins.input_pin, + vol.Required(CONF_BAUD_RATE): cv.positive_int, +}).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_least_one_key(CONF_TX_PIN, CONF_RX_PIN)) + + +def to_code(config): + rhs = App.init_uart(config[CONF_BAUD_RATE]) + var = Pvariable(config[CONF_ID], rhs) + + if CONF_TX_PIN in config: + add(var.set_tx_pin(config[CONF_TX_PIN])) + if CONF_RX_PIN in config: + add(var.set_rx_pin(config[CONF_RX_PIN])) + + setup_component(var, config) + + +BUILD_FLAGS = '-DUSE_UART' diff --git a/esphomeyaml/components/web_server.py b/esphome/components/web_server.py similarity index 62% rename from esphomeyaml/components/web_server.py rename to esphome/components/web_server.py index d70bc25cda..e8b7420f0c 100644 --- a/esphomeyaml/components/web_server.py +++ b/esphome/components/web_server.py @@ -1,13 +1,13 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_CSS_URL, CONF_ID, CONF_JS_URL, CONF_PORT -from esphomeyaml.core import CORE -from esphomeyaml.cpp_generator import Pvariable, add -from esphomeyaml.cpp_helpers import setup_component -from esphomeyaml.cpp_types import esphomelib_ns, StoringController, Component, App +import esphome.config_validation as cv +from esphome.const import CONF_CSS_URL, CONF_ID, CONF_JS_URL, CONF_PORT +from esphome.core import CORE +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Component, StoringController, esphome_ns -WebServer = esphomelib_ns.class_('WebServer', Component, StoringController) +WebServer = esphome_ns.class_('WebServer', Component, StoringController) CONFIG_SCHEMA = vol.Schema({ cv.GenerateID(): cv.declare_variable_id(WebServer), @@ -28,7 +28,7 @@ def to_code(config): setup_component(web_server, config) -BUILD_FLAGS = '-DUSE_WEB_SERVER' +REQUIRED_BUILD_FLAGS = '-DUSE_WEB_SERVER' def lib_deps(config): diff --git a/esphomeyaml/components/wifi.py b/esphome/components/wifi.py similarity index 76% rename from esphomeyaml/components/wifi.py rename to esphome/components/wifi.py index 24689ab37a..bf2e5a92b8 100644 --- a/esphomeyaml/components/wifi.py +++ b/esphome/components/wifi.py @@ -1,21 +1,20 @@ import voluptuous as vol -import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_AP, CONF_CHANNEL, CONF_DNS1, CONF_DNS2, CONF_DOMAIN, \ - CONF_GATEWAY, CONF_HOSTNAME, CONF_ID, CONF_MANUAL_IP, CONF_PASSWORD, CONF_POWER_SAVE_MODE, \ - CONF_REBOOT_TIMEOUT, CONF_SSID, CONF_STATIC_IP, CONF_SUBNET, CONF_NETWORKS, CONF_BSSID, \ - CONF_FAST_CONNECT -from esphomeyaml.core import CORE, HexInt -from esphomeyaml.cpp_generator import Pvariable, StructInitializer, add, variable, ArrayInitializer -from esphomeyaml.cpp_types import App, Component, esphomelib_ns, global_ns - +import esphome.config_validation as cv +from esphome.const import CONF_AP, CONF_BSSID, CONF_CHANNEL, CONF_DNS1, CONF_DNS2, \ + CONF_DOMAIN, CONF_FAST_CONNECT, CONF_GATEWAY, CONF_ID, CONF_MANUAL_IP, CONF_NETWORKS, \ + CONF_PASSWORD, CONF_POWER_SAVE_MODE, CONF_REBOOT_TIMEOUT, CONF_SSID, CONF_STATIC_IP, \ + CONF_SUBNET, CONF_USE_ADDRESS, CONF_HIDDEN +from esphome.core import CORE, HexInt +from esphome.cpp_generator import Pvariable, StructInitializer, add, variable +from esphome.cpp_types import App, Component, esphome_ns, global_ns IPAddress = global_ns.class_('IPAddress') -ManualIP = esphomelib_ns.struct('ManualIP') -WiFiComponent = esphomelib_ns.class_('WiFiComponent', Component) -WiFiAP = esphomelib_ns.struct('WiFiAP') +ManualIP = esphome_ns.struct('ManualIP') +WiFiComponent = esphome_ns.class_('WiFiComponent', Component) +WiFiAP = esphome_ns.struct('WiFiAP') -WiFiPowerSaveMode = esphomelib_ns.enum('WiFiPowerSaveMode') +WiFiPowerSaveMode = esphome_ns.enum('WiFiPowerSaveMode') WIFI_POWER_SAVE_MODES = { 'NONE': WiFiPowerSaveMode.WIFI_POWER_SAVE_NONE, 'LIGHT': WiFiPowerSaveMode.WIFI_POWER_SAVE_LIGHT, @@ -24,7 +23,7 @@ WIFI_POWER_SAVE_MODES = { def validate_password(value): - value = cv.string(value) + value = cv.string_strict(value) if not value: return value if len(value) < 8: @@ -50,8 +49,8 @@ AP_MANUAL_IP_SCHEMA = vol.Schema({ }) STA_MANUAL_IP_SCHEMA = AP_MANUAL_IP_SCHEMA.extend({ - vol.Inclusive(CONF_DNS1, 'dns'): cv.ipv4, - vol.Inclusive(CONF_DNS2, 'dns'): cv.ipv4, + vol.Optional(CONF_DNS1, default="1.1.1.1"): cv.ipv4, + vol.Optional(CONF_DNS2, default="1.0.0.1"): cv.ipv4, }) WIFI_NETWORK_BASE = vol.Schema({ @@ -68,6 +67,7 @@ WIFI_NETWORK_AP = WIFI_NETWORK_BASE.extend({ WIFI_NETWORK_STA = WIFI_NETWORK_BASE.extend({ vol.Optional(CONF_BSSID): cv.mac_address, + vol.Optional(CONF_HIDDEN): cv.boolean, }) @@ -95,6 +95,13 @@ def validate(config): if len(networks) != 1: raise vol.Invalid("Fast connect can only be used with one network!") + 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 @@ -107,11 +114,13 @@ CONFIG_SCHEMA = vol.All(vol.Schema({ vol.Optional(CONF_MANUAL_IP): STA_MANUAL_IP_SCHEMA, vol.Optional(CONF_AP): WIFI_NETWORK_AP, - vol.Optional(CONF_HOSTNAME): cv.hostname, vol.Optional(CONF_DOMAIN, default='.local'): cv.domain_name, vol.Optional(CONF_REBOOT_TIMEOUT): cv.positive_time_period_milliseconds, vol.Optional(CONF_POWER_SAVE_MODE): cv.one_of(*WIFI_POWER_SAVE_MODES, upper=True), vol.Optional(CONF_FAST_CONNECT): cv.boolean, + vol.Optional(CONF_USE_ADDRESS): cv.string_strict, + + vol.Optional('hostname'): cv.invalid("The hostname option has been removed in 1.11.0"), }), validate) @@ -141,8 +150,9 @@ def wifi_network(config, static_ip): if CONF_PASSWORD in config: add(ap.set_password(config[CONF_PASSWORD])) if CONF_BSSID in config: - bssid = [HexInt(i) for i in config[CONF_BSSID].parts] - add(ap.set_bssid(ArrayInitializer(*bssid, multiline=False))) + add(ap.set_bssid([HexInt(i) for i in config[CONF_BSSID].parts])) + if CONF_HIDDEN in config: + add(ap.set_hidden(config[CONF_HIDDEN])) if CONF_CHANNEL in config: add(ap.set_channel(config[CONF_CHANNEL])) if static_ip is not None: @@ -151,16 +161,10 @@ def wifi_network(config, static_ip): return ap -def get_upload_host(config): - if CONF_MANUAL_IP in config: - return str(config[CONF_MANUAL_IP][CONF_STATIC_IP]) - hostname = config.get(CONF_HOSTNAME) or CORE.name - return hostname + config[CONF_DOMAIN] - - def to_code(config): rhs = App.init_wifi() wifi = Pvariable(config[CONF_ID], rhs) + add(wifi.set_use_address(config[CONF_USE_ADDRESS])) for network in config.get(CONF_NETWORKS, []): add(wifi.add_sta(wifi_network(network, config.get(CONF_MANUAL_IP)))) @@ -168,9 +172,6 @@ def to_code(config): if CONF_AP in config: add(wifi.set_ap(wifi_network(config[CONF_AP], config.get(CONF_MANUAL_IP)))) - if CONF_HOSTNAME in config: - add(wifi.set_hostname(config[CONF_HOSTNAME])) - if CONF_REBOOT_TIMEOUT in config: add(wifi.set_reboot_timeout(config[CONF_REBOOT_TIMEOUT])) diff --git a/esphomeyaml/config.py b/esphome/config.py similarity index 94% rename from esphomeyaml/config.py rename to esphome/config.py index bac42aaf63..e358fa0228 100644 --- a/esphomeyaml/config.py +++ b/esphome/config.py @@ -8,17 +8,17 @@ import re import voluptuous as vol -from esphomeyaml import core, core_config, yaml_util -from esphomeyaml.components import substitutions -from esphomeyaml.const import CONF_ESPHOMEYAML, CONF_PLATFORM, ESP_PLATFORMS -from esphomeyaml.core import CORE, EsphomeyamlError -from esphomeyaml.helpers import color, indent -from esphomeyaml.py_compat import text_type -from esphomeyaml.util import safe_print +from esphome import core, core_config, yaml_util +from esphome.components import substitutions +from esphome.const import CONF_ESPHOME, CONF_PLATFORM, ESP_PLATFORMS +from esphome.core import CORE, EsphomeError +from esphome.helpers import color, indent +from esphome.py_compat import text_type +from esphome.util import safe_print # pylint: disable=unused-import, wrong-import-order from typing import List, Optional, Tuple, Union # noqa -from esphomeyaml.core import ConfigType # noqa +from esphome.core import ConfigType # noqa _LOGGER = logging.getLogger(__name__) @@ -29,7 +29,7 @@ def get_component(domain): if domain in _COMPONENT_CACHE: return _COMPONENT_CACHE[domain] - path = 'esphomeyaml.components.{}'.format(domain) + path = 'esphome.components.{}'.format(domain) try: module = importlib.import_module(path) except (ImportError, ValueError) as err: @@ -52,8 +52,8 @@ def is_platform_component(component): def iter_components(config): for domain, conf in config.items(): - if domain == CONF_ESPHOMEYAML: - yield CONF_ESPHOMEYAML, core_config, conf + if domain == CONF_ESPHOME: + yield CONF_ESPHOME, core_config, conf continue component = get_component(domain) if getattr(component, 'MULTI_CONF', False): @@ -164,7 +164,7 @@ def iter_ids(config, path=None): def do_id_pass(result): # type: (Config) -> None - from esphomeyaml.cpp_generator import MockObjClass + from esphome.cpp_generator import MockObjClass declare_ids = [] # type: List[Tuple[core.ID, ConfigPath]] searching_ids = [] # type: List[Tuple[core.ID, ConfigPath]] @@ -226,12 +226,12 @@ def validate_config(config): skip_paths = list() # type: List[ConfigPath] # Step 1: Load everything - result.add_domain([CONF_ESPHOMEYAML], CONF_ESPHOMEYAML) - result[CONF_ESPHOMEYAML] = config[CONF_ESPHOMEYAML] + result.add_domain([CONF_ESPHOME], CONF_ESPHOME) + result[CONF_ESPHOME] = config[CONF_ESPHOME] for domain, conf in config.items(): domain = str(domain) - if domain == CONF_ESPHOMEYAML or domain.startswith(u'.'): + if domain == CONF_ESPHOME or domain.startswith(u'.'): skip_paths.append([domain]) continue result.add_domain([domain], domain) @@ -333,9 +333,9 @@ def validate_config(config): # Step 2: Validate configuration try: - result[CONF_ESPHOMEYAML] = core_config.CONFIG_SCHEMA(result[CONF_ESPHOMEYAML]) + result[CONF_ESPHOME] = core_config.CONFIG_SCHEMA(result[CONF_ESPHOME]) except vol.Invalid as ex: - _comp_error(ex, [CONF_ESPHOMEYAML]) + _comp_error(ex, [CONF_ESPHOME]) for domain, conf in result.items(): domain = str(domain) @@ -438,14 +438,14 @@ def load_config(): try: config = yaml_util.load_yaml(CORE.config_path) except OSError: - raise EsphomeyamlError(u"Invalid YAML at {}".format(CORE.config_path)) + raise EsphomeError(u"Invalid YAML at {}".format(CORE.config_path)) CORE.raw_config = config config = substitutions.do_substitution_pass(config) core_config.preload_core_config(config) try: result = validate_config(config) - except EsphomeyamlError: + except EsphomeError: raise except Exception: _LOGGER.error(u"Unexpected exception while reading configuration:") @@ -584,7 +584,7 @@ def read_config(verbose): _LOGGER.info("Reading configuration...") try: res = load_config() - except EsphomeyamlError as err: + except EsphomeError as err: _LOGGER.error(u"Error while reading config: %s", err) return None if res.errors: diff --git a/esphomeyaml/config_validation.py b/esphome/config_validation.py similarity index 97% rename from esphomeyaml/config_validation.py rename to esphome/config_validation.py index 68e96c5b44..16be903262 100644 --- a/esphomeyaml/config_validation.py +++ b/esphome/config_validation.py @@ -9,14 +9,14 @@ import uuid as uuid_ import voluptuous as vol -from esphomeyaml import core -from esphomeyaml.const import CONF_AVAILABILITY, CONF_COMMAND_TOPIC, CONF_DISCOVERY, CONF_ID, \ +from esphome import core +from esphome.const import CONF_AVAILABILITY, CONF_COMMAND_TOPIC, CONF_DISCOVERY, CONF_ID, \ CONF_INTERNAL, CONF_NAME, CONF_PAYLOAD_AVAILABLE, CONF_PAYLOAD_NOT_AVAILABLE, CONF_PLATFORM, \ CONF_RETAIN, CONF_SETUP_PRIORITY, CONF_STATE_TOPIC, CONF_TOPIC, ESP_PLATFORM_ESP32, \ ESP_PLATFORM_ESP8266 -from esphomeyaml.core import CORE, HexInt, IPAddress, Lambda, TimePeriod, TimePeriodMicroseconds, \ +from esphome.core import CORE, HexInt, IPAddress, Lambda, TimePeriod, TimePeriodMicroseconds, \ TimePeriodMilliseconds, TimePeriodSeconds -from esphomeyaml.py_compat import text_type, string_types, integer_types +from esphome.py_compat import integer_types, string_types, text_type _LOGGER = logging.getLogger(__name__) @@ -46,6 +46,7 @@ RESERVED_IDS = [ 'App', 'pinMode', 'delay', 'delayMicroseconds', 'digitalRead', 'digitalWrite', 'INPUT', 'OUTPUT', + 'uint8_t', 'uint16_t', 'uint32_t', 'uint64_t', 'int8_t', 'int16_t', 'int32_t', 'int64_t', ] @@ -458,13 +459,18 @@ def hostname(value): def domain(value): value = string(value) - if re.match(vol.DOMAIN_REGEX, value) is None: + if re.match(vol.DOMAIN_REGEX, value) is not None: + return value + try: + return str(ipv4(value)) + except vol.Invalid: raise vol.Invalid("Invalid domain: {}".format(value)) - return value def domain_name(value): - value = string(value) + value = string_strict(value) + if not value: + return value if not value.startswith('.'): raise vol.Invalid("Domain name must start with .") if value.startswith('..'): @@ -476,10 +482,7 @@ def domain_name(value): def ssid(value): - if value is None: - raise vol.Invalid("SSID can not be None") - if not isinstance(value, str): - raise vol.Invalid("SSID must be a string. Did you wrap it in quotes?") + value = string_strict(value) if not value: raise vol.Invalid("SSID can't be empty.") if len(value) > 32: @@ -575,6 +578,7 @@ def requires_component(comp): if comp not in CORE.raw_config: raise vol.Invalid("This option requires component {}".format(comp)) return value + return validator diff --git a/esphomeyaml/const.py b/esphome/const.py similarity index 94% rename from esphomeyaml/const.py rename to esphome/const.py index 8e0eb653cd..ead8cf05c4 100644 --- a/esphomeyaml/const.py +++ b/esphome/const.py @@ -1,11 +1,11 @@ -"""Constants used by esphomeyaml.""" +"""Constants used by esphome.""" MAJOR_VERSION = 1 -MINOR_VERSION = 10 -PATCH_VERSION = '1' +MINOR_VERSION = 11 +PATCH_VERSION = '0b3' __short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION) __version__ = '{}.{}'.format(__short_version__, PATCH_VERSION) -ESPHOMELIB_VERSION = '1.10.1' +ESPHOME_CORE_VERSION = '1.11.0b3' ESP_PLATFORM_ESP32 = 'ESP32' ESP_PLATFORM_ESP8266 = 'ESP8266' @@ -13,11 +13,11 @@ ESP_PLATFORMS = [ESP_PLATFORM_ESP32, ESP_PLATFORM_ESP8266] APB_CLOCK_FREQ = 80000000 -CONF_ESPHOMEYAML = 'esphomeyaml' +CONF_ESPHOME = 'esphome' CONF_NAME = 'name' CONF_PLATFORM = 'platform' CONF_BOARD = 'board' -CONF_ESPHOMELIB_VERSION = 'esphomelib_version' +CONF_ESPHOME_CORE_VERSION = 'esphome_core_version' CONF_USE_CUSTOM_CODE = 'use_custom_code' CONF_ARDUINO_VERSION = 'arduino_version' CONF_LOCAL = 'local' @@ -93,6 +93,7 @@ CONF_BELOW = 'below' CONF_ON = 'on' CONF_IF = 'if' CONF_WHILE = 'while' +CONF_WAIT_UNTIL = 'wait_until' CONF_THEN = 'then' CONF_BINARY = 'binary' CONF_WHITE = 'white' @@ -112,7 +113,6 @@ CONF_PAYLOAD = 'payload' CONF_QOS = 'qos' CONF_DISCOVERY_RETAIN = 'discovery_retain' CONF_TOPIC_PREFIX = 'topic_prefix' -CONF_HOSTNAME = 'hostname' CONF_PHASE_BALANCER = 'phase_balancer' CONF_ADDRESS = 'address' CONF_ENABLE_TIME = 'enable_time' @@ -162,6 +162,8 @@ CONF_NEC = 'nec' CONF_COMMAND = 'command' CONF_DATA = 'data' CONF_NBITS = 'nbits' +CONF_JVC = 'jvc' +CONF_RC5 = 'rc5' CONF_LG = 'lg' CONF_SAMSUNG = 'samsung' CONF_SONY = 'sony' @@ -244,6 +246,7 @@ CONF_CLOSE_ACTION = 'close_action' CONF_STOP_ACTION = 'stop_action' CONF_DOMAIN = 'domain' CONF_OPTIMISTIC = 'optimistic' +CONF_ASSUMED_STATE = 'assumed_state' CONF_ON_BOOT = 'on_boot' CONF_ON_SHUTDOWN = 'on_shutdown' CONF_PRIORITY = 'priority' @@ -263,6 +266,7 @@ CONF_DELAYED_OFF = 'delayed_off' CONF_UUID = 'uuid' CONF_TYPE = 'type' CONF_SPI_ID = 'spi_id' +CONF_HARDWARE_UART = 'hardware_uart' CONF_UART_ID = 'uart_id' CONF_UID = 'uid' CONF_TX_PIN = 'tx_pin' @@ -333,9 +337,11 @@ CONF_CHANGE_MODE_EVERY = 'change_mode_every' CONF_PAGE_ID = 'page_id' CONF_COMPONENT_ID = 'component_id' CONF_COLD_WHITE = 'cold_white' +CONF_PAGES = 'pages' CONF_WARM_WHITE = 'warm_white' CONF_COLD_WHITE_COLOR_TEMPERATURE = 'cold_white_color_temperature' CONF_WARM_WHITE_COLOR_TEMPERATURE = 'warm_white_color_temperature' +CONF_HIDDEN = 'hidden' CONF_ON_LOOP = 'on_loop' CONF_ON_TIME = 'on_time' CONF_SECONDS = 'seconds' @@ -399,8 +405,17 @@ CONF_DIRECTION = 'direction' CONF_VARIANT = 'variant' CONF_METHOD = 'method' CONF_FAST_CONNECT = 'fast_connect' +CONF_INTERLOCK = 'interlock' +CONF_ON_TURN_ON = 'on_turn_on' +CONF_ON_TURN_OFF = 'on_turn_off' +CONF_USE_ADDRESS = 'use_address' +CONF_FROM = 'from' +CONF_TO = 'to' +CONF_SEGMENTS = 'segments' ALLOWED_NAME_CHARS = u'abcdefghijklmnopqrstuvwxyz0123456789_' ARDUINO_VERSION_ESP32_DEV = 'https://github.com/platformio/platform-espressif32.git#feature/stage' +ARDUINO_VERSION_ESP32_1_0_1 = 'espressif32@1.6.0' ARDUINO_VERSION_ESP8266_DEV = 'https://github.com/platformio/platform-espressif8266.git#feature' \ '/stage' +ARDUINO_VERSION_ESP8266_2_5_0 = 'espressif8266@2.0.0' diff --git a/esphomeyaml/core.py b/esphome/core.py similarity index 90% rename from esphomeyaml/core.py rename to esphome/core.py index bc2cee62fe..2d59e4eefc 100644 --- a/esphomeyaml/core.py +++ b/esphome/core.py @@ -6,20 +6,20 @@ import math import os import re -from esphomeyaml.const import CONF_ARDUINO_VERSION, CONF_ESPHOMELIB_VERSION, CONF_ESPHOMEYAML, \ - CONF_LOCAL, CONF_WIFI, ESP_PLATFORM_ESP32, ESP_PLATFORM_ESP8266 -from esphomeyaml.helpers import ensure_unique_string - # pylint: disable=unused-import, wrong-import-order from typing import Any, Dict, List # noqa -from esphomeyaml.py_compat import integer_types, IS_PY2 +from esphome.const import CONF_ARDUINO_VERSION, CONF_ESPHOME, CONF_ESPHOME_CORE_VERSION, \ + CONF_LOCAL, \ + CONF_USE_ADDRESS, CONF_WIFI, ESP_PLATFORM_ESP32, ESP_PLATFORM_ESP8266 +from esphome.helpers import ensure_unique_string +from esphome.py_compat import IS_PY2, integer_types _LOGGER = logging.getLogger(__name__) -class EsphomeyamlError(Exception): - """General esphomeyaml exception occurred.""" +class EsphomeError(Exception): + """General ESPHome exception occurred.""" if IS_PY2: @@ -55,7 +55,7 @@ class MACAddress(object): return ':'.join('{:02X}'.format(part) for part in self.parts) def as_hex(self): - from esphomeyaml.cpp_generator import RawExpression + from esphome.cpp_generator import RawExpression num = ''.join('{:02X}'.format(part) for part in self.parts) return RawExpression('0x{}ULL'.format(num)) @@ -261,10 +261,13 @@ class ID(object): self.type = type def resolve(self, registered_ids): + from esphome.config_validation import RESERVED_IDS + if self.id is None: base = str(self.type).replace('::', '_').lower() name = ''.join(c for c in base if c.isalnum() or c == '_') - self.id = ensure_unique_string(name, registered_ids) + used = set(registered_ids) | set(RESERVED_IDS) + self.id = ensure_unique_string(name, used) return self.id def __str__(self): @@ -286,7 +289,7 @@ class ID(object): # pylint: disable=too-many-instance-attributes -class EsphomeyamlCore(object): +class EsphomeCore(object): def __init__(self): # True if command is run from dashboard self.dashboard = False @@ -313,27 +316,25 @@ class EsphomeyamlCore(object): @property def address(self): # type: () -> str - from esphomeyaml.components import wifi - if 'wifi' in self.config: - return wifi.get_upload_host(self.config[CONF_WIFI]) + return self.config[CONF_WIFI][CONF_USE_ADDRESS] if 'ethernet' in self.config: - return wifi.get_upload_host(self.config['ethernet']) + return self.config['ethernet'][CONF_USE_ADDRESS] return None @property - def esphomelib_version(self): # type: () -> Dict[str, str] - return self.config[CONF_ESPHOMEYAML][CONF_ESPHOMELIB_VERSION] + def esphome_core_version(self): # type: () -> Dict[str, str] + return self.config[CONF_ESPHOME][CONF_ESPHOME_CORE_VERSION] @property - def is_local_esphomelib_copy(self): - return CONF_LOCAL in self.esphomelib_version + def is_local_esphome_core_copy(self): + return CONF_LOCAL in self.esphome_core_version @property def arduino_version(self): # type: () -> str - return self.config[CONF_ESPHOMEYAML][CONF_ARDUINO_VERSION] + return self.config[CONF_ESPHOME][CONF_ARDUINO_VERSION] @property def config_dir(self): @@ -387,7 +388,7 @@ class EsphomeyamlCore(object): while self.pending_tasks: i += 1 if i > 1000000: - raise EsphomeyamlError("Circular dependency detected!") + raise EsphomeError("Circular dependency detected!") task, domain = self.pending_tasks.popleft() _LOGGER.debug("Executing task for domain=%s", domain) @@ -398,7 +399,7 @@ class EsphomeyamlCore(object): _LOGGER.debug(" -> %s finished", domain) def add(self, expression, require=True): - from esphomeyaml.cpp_generator import Expression + from esphome.cpp_generator import Expression if require and isinstance(expression, Expression): expression.require() @@ -425,11 +426,16 @@ class EsphomeyamlCore(object): yield None, None def register_variable(self, id, obj): + if id in self.variables: + raise EsphomeError("ID {} is already registered".format(id)) _LOGGER.debug("Registered variable %s of type %s", id.id, id.type) self.variables[id] = obj + def has_id(self, id): + return id in self.variables -CORE = EsphomeyamlCore() + +CORE = EsphomeCore() ConfigType = Dict[str, Any] -CoreType = EsphomeyamlCore +CoreType = EsphomeCore diff --git a/esphomeyaml/core_config.py b/esphome/core_config.py similarity index 72% rename from esphomeyaml/core_config.py rename to esphome/core_config.py index 6c9bcbf05f..5f122a2700 100644 --- a/esphomeyaml/core_config.py +++ b/esphome/core_config.py @@ -4,28 +4,30 @@ import re import voluptuous as vol -from esphomeyaml import automation, pins -import esphomeyaml.config_validation as cv -from esphomeyaml.const import ARDUINO_VERSION_ESP32_DEV, ARDUINO_VERSION_ESP8266_DEV, \ +from esphome import automation, pins +import esphome.config_validation as cv +from esphome.const import ARDUINO_VERSION_ESP32_DEV, ARDUINO_VERSION_ESP8266_DEV, \ CONF_ARDUINO_VERSION, CONF_BOARD, CONF_BOARD_FLASH_MODE, CONF_BRANCH, CONF_BUILD_PATH, \ - CONF_COMMIT, CONF_ESPHOMELIB_VERSION, CONF_ESPHOMEYAML, CONF_LOCAL, CONF_NAME, CONF_ON_BOOT, \ - CONF_ON_LOOP, CONF_ON_SHUTDOWN, CONF_PLATFORM, CONF_PRIORITY, CONF_REPOSITORY, CONF_TAG, \ - CONF_TRIGGER_ID, CONF_USE_CUSTOM_CODE, ESPHOMELIB_VERSION, ESP_PLATFORM_ESP32, \ - ESP_PLATFORM_ESP8266, CONF_LIBRARIES, CONF_INCLUDES, CONF_PLATFORMIO_OPTIONS -from esphomeyaml.core import CORE, EsphomeyamlError -from esphomeyaml.cpp_generator import Pvariable, RawExpression, add -from esphomeyaml.cpp_types import App, NoArg, const_char_ptr, esphomelib_ns -from esphomeyaml.py_compat import text_type + CONF_COMMIT, CONF_ESPHOME, CONF_ESPHOME_CORE_VERSION, CONF_INCLUDES, CONF_LIBRARIES, \ + CONF_LOCAL, \ + CONF_NAME, CONF_ON_BOOT, CONF_ON_LOOP, CONF_ON_SHUTDOWN, CONF_PLATFORM, \ + CONF_PLATFORMIO_OPTIONS, \ + CONF_PRIORITY, CONF_REPOSITORY, CONF_TAG, CONF_TRIGGER_ID, CONF_USE_CUSTOM_CODE, \ + ESPHOME_CORE_VERSION, ESP_PLATFORM_ESP32, ESP_PLATFORM_ESP8266 +from esphome.core import CORE, EsphomeError +from esphome.cpp_generator import Pvariable, RawExpression, add +from esphome.cpp_types import App, NoArg, const_char_ptr, esphome_ns +from esphome.py_compat import text_type _LOGGER = logging.getLogger(__name__) -LIBRARY_URI_REPO = u'https://github.com/OttoWinter/esphomelib.git' -GITHUB_ARCHIVE_ZIP = u'https://github.com/OttoWinter/esphomelib/archive/{}.zip' +LIBRARY_URI_REPO = u'https://github.com/esphome/esphome-core.git' +GITHUB_ARCHIVE_ZIP = u'https://github.com/esphome/esphome-core/archive/{}.zip' BUILD_FLASH_MODES = ['qio', 'qout', 'dio', 'dout'] -StartupTrigger = esphomelib_ns.StartupTrigger -ShutdownTrigger = esphomelib_ns.ShutdownTrigger -LoopTrigger = esphomelib_ns.LoopTrigger +StartupTrigger = esphome_ns.StartupTrigger +ShutdownTrigger = esphome_ns.ShutdownTrigger +LoopTrigger = esphome_ns.LoopTrigger VERSION_REGEX = re.compile(r'^[0-9]+\.[0-9]+\.[0-9]+(?:[ab]\d+)?$') @@ -44,14 +46,14 @@ def validate_board(value): return value -def validate_simple_esphomelib_version(value): +def validate_simple_esphome_core_version(value): value = cv.string_strict(value) if value.upper() == 'LATEST': - if ESPHOMELIB_VERSION == 'dev': - return validate_simple_esphomelib_version('dev') + if ESPHOME_CORE_VERSION == 'dev': + return validate_simple_esphome_core_version('dev') return { CONF_REPOSITORY: LIBRARY_URI_REPO, - CONF_TAG: 'v' + ESPHOMELIB_VERSION, + CONF_TAG: 'v' + ESPHOME_CORE_VERSION, } if value.upper() == 'DEV': return { @@ -63,16 +65,16 @@ def validate_simple_esphomelib_version(value): CONF_REPOSITORY: LIBRARY_URI_REPO, CONF_TAG: 'v' + value, } - raise vol.Invalid("Only simple esphomelib versions!") + raise vol.Invalid("Only simple esphome core versions!") -def validate_local_esphomelib_version(value): +def validate_local_esphome_core_version(value): value = cv.directory(value) path = CORE.relative_path(value) library_json = os.path.join(path, 'library.json') if not os.path.exists(library_json): raise vol.Invalid(u"Could not find '{}' file. '{}' does not seem to point to an " - u"esphomelib copy.".format(library_json, value)) + u"esphome-core copy.".format(library_json, value)) return value @@ -83,10 +85,10 @@ def validate_commit(value): return value -ESPHOMELIB_VERSION_SCHEMA = vol.Any( - validate_simple_esphomelib_version, +ESPHOME_CORE_VERSION_SCHEMA = vol.Any( + validate_simple_esphome_core_version, vol.Schema({ - vol.Required(CONF_LOCAL): validate_local_esphomelib_version, + vol.Required(CONF_LOCAL): validate_local_esphome_core_version, }), vol.All( vol.Schema({ @@ -112,6 +114,7 @@ def validate_platform(value): PLATFORMIO_ESP8266_LUT = { + '2.5.0': 'espressif8266@2.0.0', '2.4.2': 'espressif8266@1.8.0', '2.4.1': 'espressif8266@1.7.3', '2.4.0': 'espressif8266@1.6.0', @@ -123,6 +126,7 @@ PLATFORMIO_ESP8266_LUT = { PLATFORMIO_ESP32_LUT = { '1.0.0': 'espressif32@1.4.0', + '1.0.1': 'espressif32@1.6.0', 'RECOMMENDED': 'espressif32@1.5.0', 'LATEST': 'espressif32', 'DEV': ARDUINO_VERSION_ESP32_DEV, @@ -160,7 +164,7 @@ CONFIG_SCHEMA = vol.Schema({ vol.Required(CONF_PLATFORM): cv.one_of('ESP8266', 'ESPRESSIF8266', 'ESP32', 'ESPRESSIF32', upper=True), vol.Required(CONF_BOARD): validate_board, - vol.Optional(CONF_ESPHOMELIB_VERSION, default='latest'): ESPHOMELIB_VERSION_SCHEMA, + vol.Optional(CONF_ESPHOME_CORE_VERSION, default='latest'): ESPHOME_CORE_VERSION_SCHEMA, vol.Optional(CONF_ARDUINO_VERSION, default='recommended'): validate_arduino_version, vol.Optional(CONF_USE_CUSTOM_CODE, default=False): cv.boolean, vol.Optional(CONF_BUILD_PATH, default=default_build_path): cv.string, @@ -168,7 +172,7 @@ CONFIG_SCHEMA = vol.Schema({ cv.string_strict: vol.Any([cv.string], cv.string), }), - vol.Optional(CONF_BOARD_FLASH_MODE): cv.one_of(*BUILD_FLASH_MODES, lower=True), + vol.Optional(CONF_BOARD_FLASH_MODE, default='dout'): cv.one_of(*BUILD_FLASH_MODES, lower=True), vol.Optional(CONF_ON_BOOT): automation.validate_automation({ cv.GenerateID(CONF_TRIGGER_ID): cv.declare_variable_id(StartupTrigger), vol.Optional(CONF_PRIORITY): cv.float_, @@ -182,23 +186,25 @@ CONFIG_SCHEMA = vol.Schema({ vol.Optional(CONF_INCLUDES): cv.ensure_list(cv.file_), vol.Optional(CONF_LIBRARIES): cv.ensure_list(cv.string_strict), - vol.Optional('library_uri'): cv.invalid("The library_uri option has been removed in 1.8.0 and " - "was moved into the esphomelib_version option."), - vol.Optional('use_build_flags'): cv.invalid("The use_build_flags option has been replaced by " - "use_custom_code option in 1.8.0."), + vol.Optional('esphomelib_version'): cv.invalid("The esphomelib_version has been renamed to " + "esphome_core_version in 1.11.0"), }) def preload_core_config(config): - if CONF_ESPHOMEYAML not in config: - raise EsphomeyamlError(u"No esphomeyaml section in config") - core_conf = config[CONF_ESPHOMEYAML] + if 'esphomeyaml' in config: + _LOGGER.warning("The esphomeyaml section has been renamed to esphome in 1.11.0. " + "Please replace 'esphomeyaml:' in your configuration by 'esphome:'.") + config[CONF_ESPHOME] = config.pop('esphomeyaml') + if CONF_ESPHOME not in config: + raise EsphomeError(u"No esphome section in config") + core_conf = config[CONF_ESPHOME] if CONF_PLATFORM not in core_conf: - raise EsphomeyamlError("esphomeyaml.platform not specified.") + raise EsphomeError("esphome.platform not specified.") if CONF_BOARD not in core_conf: - raise EsphomeyamlError("esphomeyaml.board not specified.") + raise EsphomeError("esphome.board not specified.") if CONF_NAME not in core_conf: - raise EsphomeyamlError("esphomeyaml.name not specified.") + raise EsphomeError("esphome.name not specified.") try: CORE.esp_platform = validate_platform(core_conf[CONF_PLATFORM]) @@ -207,7 +213,7 @@ def preload_core_config(config): CORE.build_path = CORE.relative_path( cv.string(core_conf.get(CONF_BUILD_PATH, default_build_path()))) except vol.Invalid as e: - raise EsphomeyamlError(text_type(e)) + raise EsphomeError(text_type(e)) def to_code(config): @@ -238,6 +244,6 @@ def includes(config): ret = [] for include in config.get(CONF_INCLUDES, []): path = CORE.relative_path(include) - res = os.path.relpath(path, CORE.relative_build_path('src', 'main.cpp')) + res = os.path.relpath(path, CORE.relative_build_path('src')) ret.append(u'#include "{}"'.format(res)) return ret diff --git a/esphomeyaml/cpp_generator.py b/esphome/cpp_generator.py similarity index 93% rename from esphomeyaml/cpp_generator.py rename to esphome/cpp_generator.py index 12844a9153..3bbd2bc2b1 100644 --- a/esphomeyaml/cpp_generator.py +++ b/esphome/cpp_generator.py @@ -1,13 +1,13 @@ from collections import OrderedDict -from esphomeyaml.core import CORE, HexInt, Lambda, TimePeriod, TimePeriodMicroseconds, \ +from esphome.core import CORE, HexInt, Lambda, TimePeriod, TimePeriodMicroseconds, \ TimePeriodMilliseconds, TimePeriodSeconds -from esphomeyaml.helpers import cpp_string_escape, indent_all_but_first_and_last +from esphome.helpers import cpp_string_escape, indent_all_but_first_and_last # pylint: disable=unused-import, wrong-import-order from typing import Any, Generator, List, Optional, Tuple, Union # noqa -from esphomeyaml.core import ID # noqa -from esphomeyaml.py_compat import text_type, string_types, integer_types +from esphome.core import ID # noqa +from esphome.py_compat import text_type, string_types, integer_types class Expression(object): @@ -134,7 +134,7 @@ class StructInitializer(Expression): class ArrayInitializer(Expression): def __init__(self, *args, **kwargs): # type: (*Any, **Any) -> None super(ArrayInitializer, self).__init__() - self.multiline = kwargs.get('multiline', True) + self.multiline = kwargs.get('multiline', False) self.args = [] for arg in args: if arg is None: @@ -264,7 +264,8 @@ class FloatLiteral(Literal): # pylint: disable=bad-continuation -def safe_exp(obj # type: Union[Expression, bool, str, unicode, int, long, float, TimePeriod] +def safe_exp( + obj # type: Union[Expression, bool, str, unicode, int, long, float, TimePeriod, list] ): # type: (...) -> Expression if isinstance(obj, Expression): @@ -285,6 +286,8 @@ def safe_exp(obj # type: Union[Expression, bool, str, unicode, int, long, float return IntLiteral(int(obj.total_milliseconds)) if isinstance(obj, TimePeriodSeconds): return IntLiteral(int(obj.total_seconds)) + if isinstance(obj, (tuple, list)): + return ArrayInitializer(*[safe_exp(o) for o in obj]) raise ValueError(u"Object is not an expression", obj) @@ -314,6 +317,27 @@ class ExpressionStatement(Statement): return u"{};".format(self.expression) +class ProgmemAssignmentExpression(AssignmentExpression): + def __init__(self, type, name, rhs, obj): + super(ProgmemAssignmentExpression, self).__init__( + type, '', name, rhs, obj + ) + + def __str__(self): + type_ = self.type + return u"static const {} {}[] PROGMEM = {}".format(type_, self.name, self.rhs) + + +def progmem_array(id, rhs): + rhs = safe_exp(rhs) + obj = MockObj(id, u'.') + assignment = ProgmemAssignmentExpression(id.type, id, rhs, obj) + CORE.add(assignment) + CORE.register_variable(id, obj) + obj.requires.append(assignment) + return obj + + def statement(expression): # type: (Union[Expression, Statement]) -> Statement if isinstance(expression, Statement): return expression @@ -373,7 +397,7 @@ def process_lambda(value, # type: Lambda return_type=None # type: Optional[Expression] ): # type: (...) -> Generator[LambdaExpression] - from esphomeyaml.components.globals import GlobalVariableComponent + from esphome.components.globals import GlobalVariableComponent if value is None: yield diff --git a/esphomeyaml/cpp_helpers.py b/esphome/cpp_helpers.py similarity index 75% rename from esphomeyaml/cpp_helpers.py rename to esphome/cpp_helpers.py index c96dce6977..4b3a628d89 100644 --- a/esphomeyaml/cpp_helpers.py +++ b/esphome/cpp_helpers.py @@ -1,8 +1,8 @@ -from esphomeyaml.const import CONF_INVERTED, CONF_MODE, CONF_NUMBER, CONF_PCF8574, \ +from esphome.const import CONF_INVERTED, CONF_MODE, CONF_NUMBER, CONF_PCF8574, \ CONF_SETUP_PRIORITY -from esphomeyaml.core import CORE, EsphomeyamlError -from esphomeyaml.cpp_generator import IntLiteral, RawExpression -from esphomeyaml.cpp_types import GPIOInputPin, GPIOOutputPin +from esphome.core import CORE, EsphomeError +from esphome.cpp_generator import IntLiteral, RawExpression +from esphome.cpp_types import GPIOInputPin, GPIOOutputPin def generic_gpio_pin_expression_(conf, mock_obj, default_mode): @@ -11,7 +11,7 @@ def generic_gpio_pin_expression_(conf, mock_obj, default_mode): number = conf[CONF_NUMBER] inverted = conf.get(CONF_INVERTED) if CONF_PCF8574 in conf: - from esphomeyaml.components import pcf8574 + from esphome.components import pcf8574 for hub in CORE.get_variable(conf[CONF_PCF8574]): yield None @@ -24,7 +24,7 @@ def generic_gpio_pin_expression_(conf, mock_obj, default_mode): yield hub.make_output_pin(number, inverted) return - raise EsphomeyamlError(u"Unknown default mode {}".format(default_mode)) + raise EsphomeError(u"Unknown default mode {}".format(default_mode)) if len(conf) == 1: yield IntLiteral(number) return diff --git a/esphome/cpp_types.py b/esphome/cpp_types.py new file mode 100644 index 0000000000..8f9a2e2948 --- /dev/null +++ b/esphome/cpp_types.py @@ -0,0 +1,37 @@ +from esphome.cpp_generator import MockObj + +global_ns = MockObj('', '') +void = global_ns.namespace('void') +float_ = global_ns.namespace('float') +bool_ = global_ns.namespace('bool') +std_ns = global_ns.namespace('std') +std_string = std_ns.class_('string') +std_vector = std_ns.class_('vector') +uint8 = global_ns.namespace('uint8_t') +uint16 = global_ns.namespace('uint16_t') +uint32 = global_ns.namespace('uint32_t') +int32 = global_ns.namespace('int32_t') +const_char_ptr = global_ns.namespace('const char *') +NAN = global_ns.namespace('NAN') +esphome_ns = global_ns # using namespace esphome; +NoArg = esphome_ns.class_('NoArg') +App = esphome_ns.App +io_ns = esphome_ns.namespace('io') +Nameable = esphome_ns.class_('Nameable') +Trigger = esphome_ns.class_('Trigger') +Action = esphome_ns.class_('Action') +Component = esphome_ns.class_('Component') +ComponentPtr = Component.operator('ptr') +PollingComponent = esphome_ns.class_('PollingComponent', Component) +Application = esphome_ns.class_('Application') +optional = esphome_ns.class_('optional') +arduino_json_ns = global_ns.namespace('ArduinoJson') +JsonObject = arduino_json_ns.class_('JsonObject') +JsonObjectRef = JsonObject.operator('ref') +JsonObjectConstRef = JsonObjectRef.operator('const') +Controller = esphome_ns.class_('Controller') +StoringController = esphome_ns.class_('StoringController', Controller) + +GPIOPin = esphome_ns.class_('GPIOPin') +GPIOOutputPin = esphome_ns.class_('GPIOOutputPin', GPIOPin) +GPIOInputPin = esphome_ns.class_('GPIOInputPin', GPIOPin) diff --git a/esphomeyaml/dashboard/__init__.py b/esphome/dashboard/__init__.py similarity index 100% rename from esphomeyaml/dashboard/__init__.py rename to esphome/dashboard/__init__.py diff --git a/esphomeyaml/dashboard/dashboard.py b/esphome/dashboard/dashboard.py similarity index 78% rename from esphomeyaml/dashboard/dashboard.py rename to esphome/dashboard/dashboard.py index 3c01e6fdcf..4c7b8f9a76 100644 --- a/esphomeyaml/dashboard/dashboard.py +++ b/esphome/dashboard/dashboard.py @@ -2,38 +2,38 @@ from __future__ import print_function import codecs -import collections import hmac import json import logging -import multiprocessing import os import subprocess import threading import tornado import tornado.concurrent -import tornado.httpserver -import tornado.netutil import tornado.gen +import tornado.httpserver import tornado.ioloop import tornado.iostream from tornado.log import access_log +import tornado.netutil import tornado.process import tornado.web import tornado.websocket -from esphomeyaml import const -from esphomeyaml.__main__ import get_serial_ports -from esphomeyaml.helpers import mkdir_p, run_system_command -from esphomeyaml.py_compat import IS_PY2 -from esphomeyaml.storage_json import EsphomeyamlStorageJSON, StorageJSON, \ - esphomeyaml_storage_path, ext_storage_path -from esphomeyaml.util import shlex_quote +from esphome import const +from esphome.__main__ import get_serial_ports +from esphome.helpers import mkdir_p +from esphome.py_compat import IS_PY2 +from esphome.storage_json import EsphomeStorageJSON, StorageJSON, \ + esphome_storage_path, ext_storage_path +from esphome.util import shlex_quote # pylint: disable=unused-import, wrong-import-order from typing import Optional # noqa +from esphome.zeroconf import DashboardStatus, Zeroconf + _LOGGER = logging.getLogger(__name__) CONFIG_DIR = '' PASSWORD_DIGEST = '' @@ -43,26 +43,31 @@ ON_HASSIO = False USING_HASSIO_AUTH = True HASSIO_MQTT_CONFIG = None +if IS_PY2: + cookie_authenticated_yes = 'yes' +else: + cookie_authenticated_yes = b'yes' + # pylint: disable=abstract-method class BaseHandler(tornado.web.RequestHandler): def is_authenticated(self): if USING_HASSIO_AUTH or USING_PASSWORD: - return self.get_secure_cookie('authenticated') == 'yes' + return self.get_secure_cookie('authenticated') == cookie_authenticated_yes return True # pylint: disable=abstract-method, arguments-differ -class EsphomeyamlCommandWebSocket(tornado.websocket.WebSocketHandler): +class EsphomeCommandWebSocket(tornado.websocket.WebSocketHandler): def __init__(self, application, request, **kwargs): - super(EsphomeyamlCommandWebSocket, self).__init__(application, request, **kwargs) + super(EsphomeCommandWebSocket, self).__init__(application, request, **kwargs) self.proc = None self.closed = False def on_message(self, message): if USING_HASSIO_AUTH or USING_PASSWORD: - if self.get_secure_cookie('authenticated') != 'yes': + if self.get_secure_cookie('authenticated') != cookie_authenticated_yes: return if self.proc is not None: return @@ -108,53 +113,53 @@ class EsphomeyamlCommandWebSocket(tornado.websocket.WebSocketHandler): raise NotImplementedError -class EsphomeyamlLogsHandler(EsphomeyamlCommandWebSocket): +class EsphomeLogsHandler(EsphomeCommandWebSocket): def build_command(self, message): js = json.loads(message) config_file = CONFIG_DIR + '/' + js['configuration'] - return ["esphomeyaml", "--dashboard", config_file, "logs", '--serial-port', js["port"]] + return ["esphome", "--dashboard", config_file, "logs", '--serial-port', js["port"]] -class EsphomeyamlRunHandler(EsphomeyamlCommandWebSocket): +class EsphomeRunHandler(EsphomeCommandWebSocket): def build_command(self, message): js = json.loads(message) config_file = os.path.join(CONFIG_DIR, js['configuration']) - return ["esphomeyaml", "--dashboard", config_file, "run", '--upload-port', js["port"]] + return ["esphome", "--dashboard", config_file, "run", '--upload-port', js["port"]] -class EsphomeyamlCompileHandler(EsphomeyamlCommandWebSocket): +class EsphomeCompileHandler(EsphomeCommandWebSocket): def build_command(self, message): js = json.loads(message) config_file = os.path.join(CONFIG_DIR, js['configuration']) - return ["esphomeyaml", "--dashboard", config_file, "compile"] + return ["esphome", "--dashboard", config_file, "compile"] -class EsphomeyamlValidateHandler(EsphomeyamlCommandWebSocket): +class EsphomeValidateHandler(EsphomeCommandWebSocket): def build_command(self, message): js = json.loads(message) config_file = os.path.join(CONFIG_DIR, js['configuration']) - return ["esphomeyaml", "--dashboard", config_file, "config"] + return ["esphome", "--dashboard", config_file, "config"] -class EsphomeyamlCleanMqttHandler(EsphomeyamlCommandWebSocket): +class EsphomeCleanMqttHandler(EsphomeCommandWebSocket): def build_command(self, message): js = json.loads(message) config_file = os.path.join(CONFIG_DIR, js['configuration']) - return ["esphomeyaml", "--dashboard", config_file, "clean-mqtt"] + return ["esphome", "--dashboard", config_file, "clean-mqtt"] -class EsphomeyamlCleanHandler(EsphomeyamlCommandWebSocket): +class EsphomeCleanHandler(EsphomeCommandWebSocket): def build_command(self, message): js = json.loads(message) config_file = os.path.join(CONFIG_DIR, js['configuration']) - return ["esphomeyaml", "--dashboard", config_file, "clean"] + return ["esphome", "--dashboard", config_file, "clean"] -class EsphomeyamlHassConfigHandler(EsphomeyamlCommandWebSocket): +class EsphomeHassConfigHandler(EsphomeCommandWebSocket): def build_command(self, message): js = json.loads(message) config_file = os.path.join(CONFIG_DIR, js['configuration']) - return ["esphomeyaml", "--dashboard", config_file, "hass-config"] + return ["esphome", "--dashboard", config_file, "hass-config"] class SerialPortRequestHandler(BaseHandler): @@ -179,7 +184,7 @@ class SerialPortRequestHandler(BaseHandler): class WizardRequestHandler(BaseHandler): def post(self): - from esphomeyaml import wizard + from esphome import wizard if not self.is_authenticated(): self.redirect('/login') @@ -286,7 +291,7 @@ class DashboardEntry(object): def update_old(self): if self.storage is None: return '' - return self.storage.esphomeyaml_version or '' + return self.storage.esphome_version or '' @property def update_new(self): @@ -302,63 +307,33 @@ class MainRequestHandler(BaseHandler): begin = bool(self.get_argument('begin', False)) entries = _list_dashboard_entries() version = const.__version__ - docs_link = 'https://beta.esphomelib.com/esphomeyaml/' if 'b' in version else \ - 'https://esphomelib.com/esphomeyaml/' + docs_link = 'https://beta.esphome.io/' if 'b' in version else \ + 'https://esphome.io/' self.render("templates/index.html", entries=entries, version=version, begin=begin, docs_link=docs_link, get_static_file_url=get_static_file_url) -def _ping_func(filename, address): - if os.name == 'nt': - command = ['ping', '-n', '1', address] - else: - command = ['ping', '-c', '1', address] - rc, _, _ = run_system_command(*command) - return filename, rc == 0 - - class PingThread(threading.Thread): def run(self): - pool = multiprocessing.Pool(processes=8) + zc = Zeroconf() + def on_update(dat): + for key, b in dat.items(): + PING_RESULT[key] = b + + stat = DashboardStatus(zc, on_update) + stat.start() while not STOP_EVENT.is_set(): - # Only do pings if somebody has the dashboard open + entries = _list_dashboard_entries() + stat.request_query({entry.filename: entry.name + '.local.' for entry in entries}) + PING_REQUEST.wait() PING_REQUEST.clear() - - def callback(ret): - PING_RESULT[ret[0]] = ret[1] - - entries = _list_dashboard_entries() - queue = collections.deque() - for entry in entries: - if entry.address is None: - PING_RESULT[entry.filename] = None - continue - - result = pool.apply_async(_ping_func, (entry.filename, entry.address), - callback=callback) - queue.append(result) - - while queue: - item = queue[0] - if item.ready(): - queue.popleft() - continue - - try: - item.get(0.1) - except OSError: - # ping not installed - pass - except multiprocessing.TimeoutError: - pass - - if STOP_EVENT.is_set(): - pool.terminate() - return + stat.stop() + stat.join() + zc.close() class PingRequestHandler(BaseHandler): @@ -421,8 +396,8 @@ class LoginHandler(BaseHandler): def render_hassio_login(self, error=None): version = const.__version__ - docs_link = 'https://beta.esphomelib.com/esphomeyaml/' if 'b' in version else \ - 'https://esphomelib.com/esphomeyaml/' + docs_link = 'https://beta.esphome.io/' if 'b' in version else \ + 'https://esphome.io/' self.render("templates/login.html", version=version, docs_link=docs_link, error=error, get_static_file_url=get_static_file_url) @@ -440,7 +415,7 @@ class LoginHandler(BaseHandler): try: req = requests.post('http://hassio/auth', headers=headers, data=data) if req.status_code == 200: - self.set_secure_cookie("authenticated", "yes") + self.set_secure_cookie("authenticated", cookie_authenticated_yes) self.redirect('/') return except Exception as err: # pylint: disable=broad-except @@ -457,9 +432,12 @@ class LoginHandler(BaseHandler): return password = str(self.get_argument("password", '')) - password = hmac.new(password).digest() + if IS_PY2: + password = hmac.new(password).digest() + else: + password = hmac.new(password.encode()).digest() if hmac.compare_digest(PASSWORD_DIGEST, password): - self.set_secure_cookie("authenticated", "yes") + self.set_secure_cookie("authenticated", cookie_authenticated_yes) self.redirect("/") @@ -503,23 +481,29 @@ def make_app(debug=False): self.set_header('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0') static_path = os.path.join(os.path.dirname(__file__), 'static') + settings = { + 'debug': debug, + 'cookie_secret': COOKIE_SECRET, + 'log_function': log_function, + 'websocket_ping_interval': 30.0, + } app = tornado.web.Application([ (r"/", MainRequestHandler), (r"/login", LoginHandler), - (r"/logs", EsphomeyamlLogsHandler), - (r"/run", EsphomeyamlRunHandler), - (r"/compile", EsphomeyamlCompileHandler), - (r"/validate", EsphomeyamlValidateHandler), - (r"/clean-mqtt", EsphomeyamlCleanMqttHandler), - (r"/clean", EsphomeyamlCleanHandler), - (r"/hass-config", EsphomeyamlHassConfigHandler), + (r"/logs", EsphomeLogsHandler), + (r"/run", EsphomeRunHandler), + (r"/compile", EsphomeCompileHandler), + (r"/validate", EsphomeValidateHandler), + (r"/clean-mqtt", EsphomeCleanMqttHandler), + (r"/clean", EsphomeCleanHandler), + (r"/hass-config", EsphomeHassConfigHandler), (r"/edit", EditRequestHandler), (r"/download.bin", DownloadBinaryRequestHandler), (r"/serial-ports", SerialPortRequestHandler), (r"/ping", PingRequestHandler), (r"/wizard.html", WizardRequestHandler), (r'/static/(.*)', StaticFileHandler, {'path': static_path}), - ], debug=debug, cookie_secret=COOKIE_SECRET, log_function=log_function) + ], **settings) if debug: _STATIC_FILE_HASHES.clear() @@ -537,7 +521,7 @@ def start_web_server(args): CONFIG_DIR = args.configuration mkdir_p(CONFIG_DIR) - mkdir_p(os.path.join(CONFIG_DIR, ".esphomeyaml")) + mkdir_p(os.path.join(CONFIG_DIR, ".esphome")) ON_HASSIO = args.hassio if ON_HASSIO: @@ -548,13 +532,16 @@ def start_web_server(args): USING_PASSWORD = args.password if USING_PASSWORD: - PASSWORD_DIGEST = hmac.new(args.password).digest() + if IS_PY2: + PASSWORD_DIGEST = hmac.new(args.password).digest() + else: + PASSWORD_DIGEST = hmac.new(args.password.encode()).digest() if USING_HASSIO_AUTH or USING_PASSWORD: - path = esphomeyaml_storage_path(CONFIG_DIR) - storage = EsphomeyamlStorageJSON.load(path) + path = esphome_storage_path(CONFIG_DIR) + storage = EsphomeStorageJSON.load(path) if storage is None: - storage = EsphomeyamlStorageJSON.get_default() + storage = EsphomeStorageJSON.get_default() storage.save(path) COOKIE_SECRET = storage.cookie_secret diff --git a/esphomeyaml/dashboard/static/ace.js b/esphome/dashboard/static/ace.js similarity index 100% rename from esphomeyaml/dashboard/static/ace.js rename to esphome/dashboard/static/ace.js diff --git a/esphomeyaml/dashboard/static/esphomeyaml.css b/esphome/dashboard/static/esphome.css similarity index 89% rename from esphomeyaml/dashboard/static/esphomeyaml.css rename to esphome/dashboard/static/esphome.css index bfd8d3b893..2e2b4787a6 100644 --- a/esphomeyaml/dashboard/static/esphomeyaml.css +++ b/esphome/dashboard/static/esphome.css @@ -46,17 +46,8 @@ i.very-large { font-family: "SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace; } -.autoscroll { - display: flex; - flex-direction: column-reverse; - flex-basis: auto; -} - -.autoscroll div { - flex-basis: 100%; -} - .log { + max-height: calc(100% - 56px); background-color: #1c1c1c; margin-top: 0; margin-bottom: 0; @@ -76,6 +67,17 @@ i.very-large { .log-underline { text-decoration: underline; } .log-strikethrough { text-decoration: line-through; } .log-underline.log-strikethrough { text-decoration: underline line-through; } +.log-secret { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.log-secret-redacted { + opacity: 0; + width: 1px; + font-size: 1px; +} .log-fg-black { color: rgb(128,128,128); } .log-fg-red { color: rgb(255,0,0); } .log-fg-green { color: rgb(0,255,0); } @@ -133,10 +135,28 @@ ul.stepper:not(.horizontal) .step.active::before, ul.stepper:not(.horizontal) .s width: 350px; } +.select-port-container .select-dropdown { + color: #fff; +} + +.select-port-container .caret { + fill: #fff; +} + .dropdown-trigger { cursor: pointer; } +.select-action { + width: auto !important; + height: auto !important; + white-space: nowrap; +} + +.tap-target-wrapper { + position: fixed !important; +} + /* https://github.com/tnhu/status-indicator/blob/master/styles.css */ .status-indicator .status-indicator-icon { display: inline-block; @@ -199,9 +219,8 @@ ul.stepper:not(.horizontal) .step.active::before, ul.stepper:not(.horizontal) .s #editor { margin-top: 0; margin-bottom: 0; - padding: 16px; border-radius: 3px; - height: 100% + height: calc(100% - 56px); } .update-available i { diff --git a/esphomeyaml/dashboard/static/esphomeyaml.js b/esphome/dashboard/static/esphome.js similarity index 96% rename from esphomeyaml/dashboard/static/esphomeyaml.js rename to esphome/dashboard/static/esphome.js index f3f9b9c1c1..ca33231a06 100644 --- a/esphomeyaml/dashboard/static/esphomeyaml.js +++ b/esphome/dashboard/static/esphome.js @@ -11,6 +11,7 @@ const initializeColorState = () => { foregroundColor: false, backgroundColor: false, carriageReturn: false, + secret: false, }; }; @@ -43,10 +44,18 @@ const colorReplace = (pre, state, text) => { if (state.italic) span.classList.add("log-italic"); if (state.underline) span.classList.add("log-underline"); if (state.strikethrough) span.classList.add("log-strikethrough"); + if (state.secret) span.classList.add("log-secret"); if (state.foregroundColor !== null) span.classList.add(`log-fg-${state.foregroundColor}`); if (state.backgroundColor !== null) span.classList.add(`log-bg-${state.backgroundColor}`); span.appendChild(document.createTextNode(content)); lineSpan.appendChild(span); + + if (state.secret) { + const redacted = document.createElement("span"); + redacted.classList.add("log-secret-redacted"); + redacted.appendChild(document.createTextNode("[redacted]")); + lineSpan.appendChild(redacted); + } }; @@ -71,6 +80,7 @@ const colorReplace = (pre, state, text) => { state.strikethrough = false; state.foregroundColor = null; state.backgroundColor = null; + state.secret = false; break; case 1: state.bold = true; @@ -81,6 +91,12 @@ const colorReplace = (pre, state, text) => { case 4: state.underline = true; break; + case 5: + state.secret = true; + break; + case 6: + state.secret = false; + break; case 9: state.strikethrough = true; break; @@ -152,6 +168,7 @@ const colorReplace = (pre, state, text) => { } } addSpan(text.substring(i)); + scrollToBottomOfElement(pre); }; const removeUpdateAvailable = (filename) => { @@ -321,6 +338,7 @@ document.querySelectorAll(".action-upload").forEach((upload) => { upload.addEventListener('click', (e) => { configuration = e.target.getAttribute('data-node'); const modalInstance = M.Modal.getInstance(uploadModalElem); + modalInstance.options['dismissible'] = false; const log = uploadModalElem.querySelector(".log"); log.innerHTML = ""; const colorState = initializeColorState(); @@ -425,6 +443,7 @@ document.querySelectorAll(".action-compile").forEach((upload) => { upload.addEventListener('click', (e) => { configuration = e.target.getAttribute('data-node'); const modalInstance = M.Modal.getInstance(compileModalElem); + modalInstance.options['dismissible'] = false; const log = compileModalElem.querySelector(".log"); log.innerHTML = ""; const colorState = initializeColorState(); @@ -682,4 +701,15 @@ const startWizard = () => { }); }; +const scrollToBottomOfElement = (element) => { + var atBottom = false; + if (element.scrollTop + 30 >= (element.scrollHeight - element.offsetHeight)) { + atBottom = true; + } + + if (atBottom) { + element.scrollTop = element.scrollHeight; + } +} + setupWizardStart.addEventListener('click', startWizard); \ No newline at end of file diff --git a/esphomeyaml/dashboard/static/ext-searchbox.js b/esphome/dashboard/static/ext-searchbox.js similarity index 100% rename from esphomeyaml/dashboard/static/ext-searchbox.js rename to esphome/dashboard/static/ext-searchbox.js diff --git a/esphome/dashboard/static/favicon.ico b/esphome/dashboard/static/favicon.ico new file mode 100644 index 0000000000..88dcd7e2d1 Binary files /dev/null and b/esphome/dashboard/static/favicon.ico differ diff --git a/esphomeyaml/dashboard/static/jquery-ui.min.js b/esphome/dashboard/static/jquery-ui.min.js similarity index 100% rename from esphomeyaml/dashboard/static/jquery-ui.min.js rename to esphome/dashboard/static/jquery-ui.min.js diff --git a/esphomeyaml/dashboard/static/jquery.min.js b/esphome/dashboard/static/jquery.min.js similarity index 100% rename from esphomeyaml/dashboard/static/jquery.min.js rename to esphome/dashboard/static/jquery.min.js diff --git a/esphomeyaml/dashboard/static/jquery.validate.min.js b/esphome/dashboard/static/jquery.validate.min.js similarity index 100% rename from esphomeyaml/dashboard/static/jquery.validate.min.js rename to esphome/dashboard/static/jquery.validate.min.js diff --git a/esphomeyaml/dashboard/static/materialize-stepper.min.css b/esphome/dashboard/static/materialize-stepper.min.css similarity index 100% rename from esphomeyaml/dashboard/static/materialize-stepper.min.css rename to esphome/dashboard/static/materialize-stepper.min.css diff --git a/esphomeyaml/dashboard/static/materialize-stepper.min.js b/esphome/dashboard/static/materialize-stepper.min.js similarity index 100% rename from esphomeyaml/dashboard/static/materialize-stepper.min.js rename to esphome/dashboard/static/materialize-stepper.min.js diff --git a/esphomeyaml/dashboard/static/materialize.min.css b/esphome/dashboard/static/materialize.min.css similarity index 100% rename from esphomeyaml/dashboard/static/materialize.min.css rename to esphome/dashboard/static/materialize.min.css diff --git a/esphomeyaml/dashboard/static/materialize.min.js b/esphome/dashboard/static/materialize.min.js similarity index 100% rename from esphomeyaml/dashboard/static/materialize.min.js rename to esphome/dashboard/static/materialize.min.js diff --git a/esphomeyaml/dashboard/static/mode-yaml.js b/esphome/dashboard/static/mode-yaml.js similarity index 100% rename from esphomeyaml/dashboard/static/mode-yaml.js rename to esphome/dashboard/static/mode-yaml.js diff --git a/esphomeyaml/dashboard/static/theme-dreamweaver.js b/esphome/dashboard/static/theme-dreamweaver.js similarity index 100% rename from esphomeyaml/dashboard/static/theme-dreamweaver.js rename to esphome/dashboard/static/theme-dreamweaver.js diff --git a/esphomeyaml/dashboard/templates/index.html b/esphome/dashboard/templates/index.html similarity index 84% rename from esphomeyaml/dashboard/templates/index.html rename to esphome/dashboard/templates/index.html index 7a4ad56f30..a478bdf190 100644 --- a/esphomeyaml/dashboard/templates/index.html +++ b/esphome/dashboard/templates/index.html @@ -6,7 +6,7 @@ - + @@ -29,16 +29,19 @@ +{% if begin %}
Select Upload Port

Here you can select where ESPHome will attempt to show logs and upload firmwares to. - By default, this is "OTA", or Over-The-Air. Note that you might have to restart the Hass.io add-on - for new serial ports to be detected. + For newly plugged in serial devices to be detected, restart the add-on. + (Also see + esphomeflasher)

+{% end %}
@@ -77,7 +80,7 @@ Show Logs Validate -