mirror of
https://github.com/esphome/esphome.git
synced 2024-11-25 00:18:11 +01:00
Merge branch 'rc'
This commit is contained in:
commit
d4ce7699d4
152 changed files with 3542 additions and 1669 deletions
299
.gitlab-ci.yml
299
.gitlab-ci.yml
|
@ -61,127 +61,260 @@ test2:
|
||||||
<<: *docker-builder
|
<<: *docker-builder
|
||||||
stage: build
|
stage: build
|
||||||
script:
|
script:
|
||||||
|
- docker run --rm --privileged hassioaddons/qemu-user-static:latest
|
||||||
|
- BUILD_FROM=homeassistant/${ADDON_ARCH}-base-ubuntu:latest
|
||||||
|
- ADDON_VERSION="${CI_COMMIT_TAG#v}"
|
||||||
|
- ADDON_VERSION="${ADDON_VERSION:-${CI_COMMIT_SHA:0:7}}"
|
||||||
|
- ESPHOMELIB_VERSION="${ESPHOMELIB_VERSION:-dev}"
|
||||||
|
- echo "Build from ${BUILD_FROM}"
|
||||||
|
- echo "Add-on version ${ADDON_VERSION}"
|
||||||
|
- echo "Esphomelib version ${ESPHOMELIB_VERSION}"
|
||||||
|
- echo "Tag ${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:dev"
|
||||||
|
- echo "Tag ${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}"
|
||||||
- |
|
- |
|
||||||
hassio-builder.sh \
|
docker build \
|
||||||
-t . \
|
--build-arg "BUILD_FROM=${BUILD_FROM}" \
|
||||||
-i ottowinter/esphomeyaml-hassio-${ADDON_ARCH} \
|
--build-arg "ADDON_ARCH=${ADDON_ARCH}" \
|
||||||
-d "$CI_REGISTRY" \
|
--build-arg "ADDON_VERSION=${ADDON_VERSION}" \
|
||||||
--${ADDON_ARCH}
|
--build-arg "ESPHOMELIB_VERSION=${ESPHOMELIB_VERSION}" \
|
||||||
|
--tag "${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:dev" \
|
||||||
|
--tag "${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \
|
||||||
|
--file "docker/Dockerfile.hassio" \
|
||||||
|
.
|
||||||
- |
|
- |
|
||||||
docker tag \
|
if [ "${DO_PUSH:-true}" = true ]; then
|
||||||
"${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:dev" \
|
echo "Pushing to CI registry"
|
||||||
"${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}"
|
docker push ${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}
|
||||||
- docker push "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}"
|
docker push ${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:dev
|
||||||
- docker push "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:dev"
|
fi
|
||||||
retry: 2
|
|
||||||
|
|
||||||
# Generic deploy template
|
# Generic deploy template
|
||||||
.deploy: &deploy
|
.deploy-release: &deploy-release
|
||||||
<<: *docker-builder
|
<<: *docker-builder
|
||||||
stage: deploy
|
stage: deploy
|
||||||
script:
|
script:
|
||||||
- version=${CI_COMMIT_TAG:1}
|
- version="${CI_COMMIT_TAG#v}"
|
||||||
- echo "Publishing version ${version}"
|
- echo "Publishing release version ${version}"
|
||||||
|
- docker pull "${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}"
|
||||||
- docker login -u "$DOCKER_USER" -p "$DOCKER_PASSWORD"
|
- docker login -u "$DOCKER_USER" -p "$DOCKER_PASSWORD"
|
||||||
- docker pull "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}"
|
|
||||||
|
- echo "Tag ${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
|
||||||
- |
|
- |
|
||||||
docker tag \
|
docker tag \
|
||||||
"${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \
|
"${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \
|
||||||
"${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:latest"
|
"${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
|
||||||
|
- docker push "${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
|
||||||
|
|
||||||
|
- echo "Tag ${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:latest"
|
||||||
- |
|
- |
|
||||||
docker tag \
|
docker tag \
|
||||||
"${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \
|
"${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \
|
||||||
|
"${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:latest"
|
||||||
|
- docker push "${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:latest"
|
||||||
|
|
||||||
|
- echo "Tag ${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:rc"
|
||||||
|
- |
|
||||||
|
docker tag \
|
||||||
|
"${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \
|
||||||
|
"${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:rc"
|
||||||
|
- docker push "${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:rc"
|
||||||
|
|
||||||
|
- echo "Tag ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
|
||||||
|
- |
|
||||||
|
docker tag \
|
||||||
|
"${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \
|
||||||
"ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
|
"ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
|
||||||
|
- docker push "ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
|
||||||
|
|
||||||
|
- echo "Tag ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:latest"
|
||||||
- |
|
- |
|
||||||
docker tag \
|
docker tag \
|
||||||
"ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}" \
|
"${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \
|
||||||
"ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:latest"
|
"ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:latest"
|
||||||
- docker push "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:latest"
|
|
||||||
- docker push "ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
|
|
||||||
- docker push "ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:latest"
|
- docker push "ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:latest"
|
||||||
|
|
||||||
|
- echo "Tag ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:rc"
|
||||||
|
- |
|
||||||
|
docker tag \
|
||||||
|
"${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \
|
||||||
|
"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}/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}"
|
||||||
|
- docker login -u "$DOCKER_USER" -p "$DOCKER_PASSWORD"
|
||||||
|
|
||||||
|
- echo "Tag ${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
|
||||||
|
- |
|
||||||
|
docker tag \
|
||||||
|
"${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \
|
||||||
|
"${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
|
||||||
|
- docker push "${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
|
||||||
|
|
||||||
|
- echo "Tag ${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:rc"
|
||||||
|
- |
|
||||||
|
docker tag \
|
||||||
|
"${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \
|
||||||
|
"${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:rc"
|
||||||
|
- docker push "${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:rc"
|
||||||
|
|
||||||
|
- echo "Tag ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}"
|
||||||
|
- |
|
||||||
|
docker tag \
|
||||||
|
"${CI_REGISTRY}/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 \
|
||||||
|
"${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \
|
||||||
|
"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 jobs
|
||||||
build:normal:
|
build:normal:
|
||||||
<<: *docker-builder
|
<<: *docker-builder
|
||||||
stage: build
|
stage: build
|
||||||
script:
|
script:
|
||||||
- docker build -t "${CI_REGISTRY}/ottowinter/esphomeyaml:dev" .
|
- docker build -t "${CI_REGISTRY}/esphomeyaml:dev" .
|
||||||
- |
|
|
||||||
docker tag \
|
|
||||||
"${CI_REGISTRY}/ottowinter/esphomeyaml:dev" \
|
|
||||||
"${CI_REGISTRY}/ottowinter/esphomeyaml:${CI_COMMIT_SHA}"
|
|
||||||
- docker push "${CI_REGISTRY}/ottowinter/esphomeyaml:${CI_COMMIT_SHA}"
|
|
||||||
- docker push "${CI_REGISTRY}/ottowinter/esphomeyaml:dev"
|
|
||||||
|
|
||||||
build:armhf:
|
.build-hassio-edge: &build-hassio-edge
|
||||||
<<: *build-hassio
|
<<: *build-hassio
|
||||||
variables:
|
|
||||||
ADDON_ARCH: armhf
|
|
||||||
|
|
||||||
#build:aarch64:
|
|
||||||
# <<: *build
|
|
||||||
# variables:
|
|
||||||
# ADDON_ARCH: aarch64
|
|
||||||
|
|
||||||
build:i386:
|
|
||||||
<<: *build-hassio
|
|
||||||
variables:
|
|
||||||
ADDON_ARCH: i386
|
|
||||||
|
|
||||||
build:amd64:
|
|
||||||
<<: *build-hassio
|
|
||||||
variables:
|
|
||||||
ADDON_ARCH: amd64
|
|
||||||
|
|
||||||
# Deploy jobs
|
|
||||||
deploy:armhf:
|
|
||||||
<<: *deploy
|
|
||||||
variables:
|
|
||||||
ADDON_ARCH: armhf
|
|
||||||
only:
|
|
||||||
- /^v\d+\.\d+\.\d+(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?$/
|
|
||||||
except:
|
except:
|
||||||
- /^(?!master).+@/
|
- /^v\d+\.\d+\.\d+$/
|
||||||
|
- /^v\d+\.\d+\.\d+b\d+$/
|
||||||
|
|
||||||
#deploy:aarch64:
|
.build-hassio-release: &build-hassio-release
|
||||||
# <<: *deploy
|
<<: *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
|
||||||
|
ESPHOMELIB_VERSION: "${CI_COMMIT_TAG}"
|
||||||
|
|
||||||
|
#build:hassio-aarch64-edge:
|
||||||
|
# <<: *build-hassio-edge
|
||||||
# variables:
|
# variables:
|
||||||
# ADDON_ARCH: aarch64
|
# ADDON_ARCH: aarch64
|
||||||
# only:
|
# DO_PUSH: "false"
|
||||||
# - /^v\d+\.\d+\.\d+(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?$/
|
|
||||||
# except:
|
|
||||||
# - /^(?!master).+@/
|
|
||||||
|
|
||||||
deploy:i386:
|
#build:hassio-aarch64:
|
||||||
<<: *deploy
|
# <<: *build-hassio-release
|
||||||
|
# variables:
|
||||||
|
# ADDON_ARCH: aarch64
|
||||||
|
# ESPHOMELIB_VERSION: "${CI_COMMIT_TAG}"
|
||||||
|
|
||||||
|
build:hassio-i386-edge:
|
||||||
|
<<: *build-hassio-edge
|
||||||
variables:
|
variables:
|
||||||
ADDON_ARCH: i386
|
ADDON_ARCH: i386
|
||||||
only:
|
DO_PUSH: "false"
|
||||||
- /^v\d+\.\d+\.\d+(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?$/
|
|
||||||
except:
|
|
||||||
- /^(?!master).+@/
|
|
||||||
|
|
||||||
deploy:amd64:
|
build:hassio-i386:
|
||||||
<<: *deploy
|
<<: *build-hassio-release
|
||||||
|
variables:
|
||||||
|
ADDON_ARCH: i386
|
||||||
|
ESPHOMELIB_VERSION: "${CI_COMMIT_TAG}"
|
||||||
|
|
||||||
|
build:hassio-amd64-edge:
|
||||||
|
<<: *build-hassio-edge
|
||||||
variables:
|
variables:
|
||||||
ADDON_ARCH: amd64
|
ADDON_ARCH: amd64
|
||||||
|
DO_PUSH: "false"
|
||||||
|
|
||||||
|
build:hassio-amd64:
|
||||||
|
<<: *build-hassio-release
|
||||||
|
variables:
|
||||||
|
ADDON_ARCH: amd64
|
||||||
|
ESPHOMELIB_VERSION: "${CI_COMMIT_TAG}"
|
||||||
|
|
||||||
|
# Deploy jobs
|
||||||
|
deploy-release:armhf:
|
||||||
|
<<: *deploy-release
|
||||||
|
variables:
|
||||||
|
ADDON_ARCH: armhf
|
||||||
|
|
||||||
|
deploy-beta:armhf:
|
||||||
|
<<: *deploy-beta
|
||||||
|
variables:
|
||||||
|
ADDON_ARCH: armhf
|
||||||
|
|
||||||
|
#deploy-release:aarch64:
|
||||||
|
# <<: *deploy-release
|
||||||
|
# variables:
|
||||||
|
# ADDON_ARCH: aarch64
|
||||||
|
#
|
||||||
|
#deploy-beta:aarch64:
|
||||||
|
# <<: *deploy-beta
|
||||||
|
# variables:
|
||||||
|
# ADDON_ARCH: aarch64
|
||||||
|
|
||||||
|
deploy-release:i386:
|
||||||
|
<<: *deploy-release
|
||||||
|
variables:
|
||||||
|
ADDON_ARCH: i386
|
||||||
|
|
||||||
|
deploy-beta:i386:
|
||||||
|
<<: *deploy-beta
|
||||||
|
variables:
|
||||||
|
ADDON_ARCH: i386
|
||||||
|
|
||||||
|
deploy-release:amd64:
|
||||||
|
<<: *deploy-release
|
||||||
|
variables:
|
||||||
|
ADDON_ARCH: amd64
|
||||||
|
|
||||||
|
deploy-beta:amd64:
|
||||||
|
<<: *deploy-beta
|
||||||
|
variables:
|
||||||
|
ADDON_ARCH: amd64
|
||||||
|
|
||||||
|
.deploy-pypi: &deploy-pypi
|
||||||
|
stage: deploy
|
||||||
|
before_script:
|
||||||
|
- pip install -e .
|
||||||
|
- pip install twine
|
||||||
|
script:
|
||||||
|
- python setup.py sdist
|
||||||
|
- twine upload dist/*
|
||||||
|
tags:
|
||||||
|
- python2.7
|
||||||
|
- esphomeyaml-test
|
||||||
|
|
||||||
|
deploy-release:pypi:
|
||||||
|
<<: *deploy-pypi
|
||||||
only:
|
only:
|
||||||
- /^v\d+\.\d+\.\d+(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?$/
|
- /^v\d+\.\d+\.\d+$/
|
||||||
except:
|
except:
|
||||||
- /^(?!master).+@/
|
- /^(?!master).+@/
|
||||||
|
|
||||||
deploy:pypi:
|
deploy-beta:pypi:
|
||||||
stage: deploy
|
<<: *deploy-pypi
|
||||||
before_script:
|
|
||||||
- pip install -e .
|
|
||||||
- pip install twine
|
|
||||||
script:
|
|
||||||
- python setup.py sdist
|
|
||||||
- twine upload dist/*
|
|
||||||
tags:
|
|
||||||
- python2.7
|
|
||||||
- esphomeyaml-test
|
|
||||||
only:
|
only:
|
||||||
- /^v\d+\.\d+\.\d+(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?$/
|
- /^v\d+\.\d+\.\d+b\d+$/
|
||||||
except:
|
except:
|
||||||
- /^(?!master).+@/
|
- /^(?!rc).+@/
|
||||||
|
|
23
Dockerfile
23
Dockerfile
|
@ -1,25 +1,28 @@
|
||||||
FROM python:2.7
|
ARG BUILD_FROM=python:2.7
|
||||||
|
FROM ${BUILD_FROM}
|
||||||
MAINTAINER Otto Winter <contact@otto-winter.com>
|
MAINTAINER Otto Winter <contact@otto-winter.com>
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y \
|
RUN apt-get update && apt-get install -y \
|
||||||
python-pil \
|
python-pil \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
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
|
ENV ESPHOMEYAML_OTA_HOST_PORT=6123
|
||||||
EXPOSE 6123
|
EXPOSE 6123
|
||||||
VOLUME /config
|
VOLUME /config
|
||||||
WORKDIR /usr/src/app
|
WORKDIR /usr/src/app
|
||||||
|
|
||||||
RUN pip install --no-cache-dir --no-binary :all: platformio && \
|
COPY docker/platformio.ini /pio/platformio.ini
|
||||||
platformio settings set enable_telemetry No
|
RUN platformio run -d /pio; rm -rf /pio
|
||||||
|
|
||||||
COPY docker/platformio.ini /usr/src/app/
|
|
||||||
RUN platformio settings set enable_telemetry No && \
|
|
||||||
platformio run -e espressif32 -e espressif8266; exit 0
|
|
||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
RUN pip install --no-cache-dir -e . && \
|
RUN pip install --no-cache-dir --no-binary :all: -e . && \
|
||||||
pip install --no-cache-dir tzlocal pillow
|
pip install --no-cache-dir --no-binary :all: tzlocal
|
||||||
|
|
||||||
WORKDIR /config
|
WORKDIR /config
|
||||||
ENTRYPOINT ["esphomeyaml"]
|
ENTRYPOINT ["esphomeyaml"]
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
# Dockerfile for aarch64 version of HassIO add-on
|
|
||||||
FROM arm64v8/ubuntu:bionic
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
||||||
python \
|
|
||||||
python-pip \
|
|
||||||
python-setuptools \
|
|
||||||
python-pil \
|
|
||||||
git \
|
|
||||||
&& apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/*rm -rf /var/lib/apt/lists/* /tmp/* && \
|
|
||||||
pip install --no-cache-dir --no-binary :all: platformio && \
|
|
||||||
platformio settings set enable_telemetry No
|
|
||||||
|
|
||||||
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 . && \
|
|
||||||
pip install --no-cache-dir --no-binary :all: tzlocal
|
|
||||||
|
|
||||||
CMD ["esphomeyaml", "/config/esphomeyaml", "dashboard"]
|
|
|
@ -1,21 +0,0 @@
|
||||||
# Dockerfile for amd64 version of HassIO add-on
|
|
||||||
FROM ubuntu:bionic
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
||||||
python \
|
|
||||||
python-pip \
|
|
||||||
python-setuptools \
|
|
||||||
python-pil \
|
|
||||||
git \
|
|
||||||
&& apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/*rm -rf /var/lib/apt/lists/* /tmp/* && \
|
|
||||||
pip install --no-cache-dir --no-binary :all: platformio && \
|
|
||||||
platformio settings set enable_telemetry No
|
|
||||||
|
|
||||||
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 . && \
|
|
||||||
pip install --no-cache-dir --no-binary :all: tzlocal
|
|
||||||
|
|
||||||
CMD ["esphomeyaml", "/config/esphomeyaml", "dashboard"]
|
|
|
@ -1,31 +0,0 @@
|
||||||
# Dockerfile for armhf version of HassIO add-on
|
|
||||||
FROM homeassistant/armhf-base:latest
|
|
||||||
|
|
||||||
RUN apk add --no-cache \
|
|
||||||
python2 \
|
|
||||||
python2-dev \
|
|
||||||
py2-pip \
|
|
||||||
git \
|
|
||||||
gcc \
|
|
||||||
openssh \
|
|
||||||
libc6-compat \
|
|
||||||
jpeg-dev \
|
|
||||||
zlib-dev \
|
|
||||||
freetype-dev \
|
|
||||||
lcms2-dev \
|
|
||||||
openjpeg-dev \
|
|
||||||
tiff-dev \
|
|
||||||
libc-dev \
|
|
||||||
linux-headers \
|
|
||||||
&& \
|
|
||||||
pip install --no-cache-dir --no-binary :all: platformio && \
|
|
||||||
platformio settings set enable_telemetry No
|
|
||||||
|
|
||||||
COPY docker/platformio-esp8266.ini /pio/platformio.ini
|
|
||||||
RUN platformio run -d /pio; rm -rf /pio
|
|
||||||
|
|
||||||
COPY . .
|
|
||||||
RUN pip install --no-cache-dir --no-binary :all: -e . && \
|
|
||||||
pip install --no-cache-dir pillow tzlocal
|
|
||||||
|
|
||||||
CMD ["esphomeyaml", "/config/esphomeyaml", "dashboard"]
|
|
|
@ -27,6 +27,4 @@ RUN apt-get update && apt-get install -y \
|
||||||
binfmt-support \
|
binfmt-support \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
COPY docker/hassio-builder.sh /usr/bin/
|
|
||||||
|
|
||||||
WORKDIR /data
|
WORKDIR /data
|
||||||
|
|
42
docker/Dockerfile.hassio
Normal file
42
docker/Dockerfile.hassio
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
# Dockerfile for HassIO add-on
|
||||||
|
ARG BUILD_FROM=homeassistant/amd64-base-ubuntu:latest
|
||||||
|
FROM ${BUILD_FROM}
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
python \
|
||||||
|
python-pip \
|
||||||
|
python-setuptools \
|
||||||
|
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
|
||||||
|
|
||||||
|
COPY docker/platformio.ini /pio/platformio.ini
|
||||||
|
RUN platformio run -d /pio; rm -rf /pio
|
||||||
|
|
||||||
|
ARG ESPHOMELIB_VERSION="dev"
|
||||||
|
RUN platformio lib -g install "https://github.com/OttoWinter/esphomelib.git#${ESPHOMELIB_VERSION}"
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
RUN pip install --no-cache-dir --no-binary :all: -e . && \
|
||||||
|
pip install --no-cache-dir --no-binary :all: tzlocal
|
||||||
|
|
||||||
|
CMD ["esphomeyaml", "/config/esphomeyaml", "dashboard"]
|
||||||
|
|
||||||
|
# Build arugments
|
||||||
|
ARG ADDON_ARCH
|
||||||
|
ARG ADDON_VERSION
|
||||||
|
|
||||||
|
# Labels
|
||||||
|
LABEL \
|
||||||
|
io.hass.name="esphomeyaml" \
|
||||||
|
io.hass.description="esphomeyaml HassIO add-on for intelligently managing all your ESP8266/ESP32 devices." \
|
||||||
|
io.hass.arch="${ADDON_ARCH}" \
|
||||||
|
io.hass.type="addon" \
|
||||||
|
io.hass.version="${ADDON_VERSION}" \
|
||||||
|
io.hass.url="https://esphomelib.com/esphomeyaml/index.html" \
|
||||||
|
maintainer="Otto Winter <contact@otto-winter.com>"
|
|
@ -1,21 +0,0 @@
|
||||||
# Dockerfile for i386 version of HassIO add-on
|
|
||||||
FROM i386/ubuntu:bionic
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
||||||
python \
|
|
||||||
python-pip \
|
|
||||||
python-setuptools \
|
|
||||||
python-pil \
|
|
||||||
git \
|
|
||||||
&& apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/*rm -rf /var/lib/apt/lists/* /tmp/* && \
|
|
||||||
pip install --no-cache-dir --no-binary :all: platformio && \
|
|
||||||
platformio settings set enable_telemetry No
|
|
||||||
|
|
||||||
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 . && \
|
|
||||||
pip install --no-cache-dir --no-binary :all: tzlocal
|
|
||||||
|
|
||||||
CMD ["esphomeyaml", "/config/esphomeyaml", "dashboard"]
|
|
|
@ -1,318 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
# Based on Home Assistant's docker builder
|
|
||||||
######################
|
|
||||||
# Hass.io Build-env
|
|
||||||
######################
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo -- "$@"
|
|
||||||
|
|
||||||
#### Variable ####
|
|
||||||
|
|
||||||
DOCKER_TIMEOUT=20
|
|
||||||
DOCKER_PID=-1
|
|
||||||
DOCKER_HUB=""
|
|
||||||
DOCKER_CACHE="true"
|
|
||||||
DOCKER_LOCAL="false"
|
|
||||||
TARGET=""
|
|
||||||
IMAGE=""
|
|
||||||
BUILD_LIST=()
|
|
||||||
BUILD_TASKS=()
|
|
||||||
|
|
||||||
#### Misc functions ####
|
|
||||||
|
|
||||||
function print_help() {
|
|
||||||
cat << EOF
|
|
||||||
Hass.io build-env for ecosystem:
|
|
||||||
docker run --rm homeassistant/{arch}-builder:latest [options]
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-h, --help
|
|
||||||
Display this help and exit.
|
|
||||||
|
|
||||||
Repository / Data
|
|
||||||
-t, --target <PATH_TO_BUILD>
|
|
||||||
Set local folder or path inside repository for build.
|
|
||||||
|
|
||||||
Version/Image handling
|
|
||||||
-i, --image <IMAGE_NAME>
|
|
||||||
Overwrite image name of build / support {arch}
|
|
||||||
|
|
||||||
Architecture
|
|
||||||
--armhf
|
|
||||||
Build for arm.
|
|
||||||
--amd64
|
|
||||||
Build for intel/amd 64bit.
|
|
||||||
--aarch64
|
|
||||||
Build for arm 64bit.
|
|
||||||
--i386
|
|
||||||
Build for intel/amd 32bit.
|
|
||||||
--all
|
|
||||||
Build all architecture.
|
|
||||||
|
|
||||||
Build handling
|
|
||||||
--no-cache
|
|
||||||
Disable cache for the build (from latest).
|
|
||||||
-d, --docker-hub <DOCKER_REPOSITORY>
|
|
||||||
Set or overwrite the docker repository.
|
|
||||||
|
|
||||||
Use the host docker socket if mapped into container:
|
|
||||||
/var/run/docker.sock
|
|
||||||
|
|
||||||
EOF
|
|
||||||
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
#### Docker functions ####
|
|
||||||
|
|
||||||
function start_docker() {
|
|
||||||
local starttime
|
|
||||||
local endtime
|
|
||||||
|
|
||||||
if [ -S "/var/run/docker.sock" ]; then
|
|
||||||
echo "[INFO] Use host docker setup with '/var/run/docker.sock'"
|
|
||||||
DOCKER_LOCAL="true"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "[INFO] Starting docker."
|
|
||||||
dockerd 2> /dev/null &
|
|
||||||
DOCKER_PID=$!
|
|
||||||
|
|
||||||
echo "[INFO] Waiting for docker to initialize..."
|
|
||||||
starttime="$(date +%s)"
|
|
||||||
endtime="$(date +%s)"
|
|
||||||
until docker info >/dev/null 2>&1; do
|
|
||||||
if [ $((endtime - starttime)) -le ${DOCKER_TIMEOUT} ]; then
|
|
||||||
sleep 1
|
|
||||||
endtime=$(date +%s)
|
|
||||||
else
|
|
||||||
echo "[ERROR] Timeout while waiting for docker to come up"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
echo "[INFO] Docker was initialized"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function stop_docker() {
|
|
||||||
local starttime
|
|
||||||
local endtime
|
|
||||||
|
|
||||||
if [ "$DOCKER_LOCAL" == "true" ]; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "[INFO] Stopping in container docker..."
|
|
||||||
if [ "$DOCKER_PID" -gt 0 ] && kill -0 "$DOCKER_PID" 2> /dev/null; then
|
|
||||||
starttime="$(date +%s)"
|
|
||||||
endtime="$(date +%s)"
|
|
||||||
|
|
||||||
# Now wait for it to die
|
|
||||||
kill "$DOCKER_PID"
|
|
||||||
while kill -0 "$DOCKER_PID" 2> /dev/null; do
|
|
||||||
if [ $((endtime - starttime)) -le ${DOCKER_TIMEOUT} ]; then
|
|
||||||
sleep 1
|
|
||||||
endtime=$(date +%s)
|
|
||||||
else
|
|
||||||
echo "[ERROR] Timeout while waiting for container docker to die"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
else
|
|
||||||
echo "[WARN] Your host might have been left with unreleased resources"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function run_build() {
|
|
||||||
local build_dir=$1
|
|
||||||
local repository=$2
|
|
||||||
local image=$3
|
|
||||||
local version=$4
|
|
||||||
local build_arch=$5
|
|
||||||
local docker_cli=("${!6}")
|
|
||||||
|
|
||||||
local push_images=()
|
|
||||||
|
|
||||||
# Overwrites
|
|
||||||
if [ ! -z "$DOCKER_HUB" ]; then repository="$DOCKER_HUB"; fi
|
|
||||||
if [ ! -z "$IMAGE" ]; then image="$IMAGE"; fi
|
|
||||||
|
|
||||||
# Init Cache
|
|
||||||
if [ "$DOCKER_CACHE" == "true" ]; then
|
|
||||||
echo "[INFO] Init cache for $repository/$image:$version"
|
|
||||||
if docker pull "$repository/$image:latest" > /dev/null 2>&1; then
|
|
||||||
docker_cli+=("--cache-from" "$repository/$image:latest")
|
|
||||||
else
|
|
||||||
docker_cli+=("--no-cache")
|
|
||||||
echo "[WARN] No cache image found. Cache is disabled for build"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
docker_cli+=("--no-cache")
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Build image
|
|
||||||
echo "[INFO] Run build for $repository/$image:$version"
|
|
||||||
docker build --pull -t "$repository/$image:$version" \
|
|
||||||
--label "io.hass.version=$version" \
|
|
||||||
--label "io.hass.arch=$build_arch" \
|
|
||||||
-f "$TARGET/docker/Dockerfile.$build_arch" \
|
|
||||||
"${docker_cli[@]}" \
|
|
||||||
"$build_dir"
|
|
||||||
|
|
||||||
echo "[INFO] Finish build for $repository/$image:$version"
|
|
||||||
docker tag "$repository/$image:$version" "$repository/$image:dev"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#### HassIO functions ####
|
|
||||||
|
|
||||||
function build_addon() {
|
|
||||||
local build_arch=$1
|
|
||||||
|
|
||||||
local docker_cli=()
|
|
||||||
local image=""
|
|
||||||
local repository=""
|
|
||||||
local raw_image=""
|
|
||||||
local name=""
|
|
||||||
local description=""
|
|
||||||
local url=""
|
|
||||||
local args=""
|
|
||||||
|
|
||||||
# Read addon config.json
|
|
||||||
name="$(jq --raw-output '.name // empty' "$TARGET/esphomeyaml/config.json" | sed "s/'//g")"
|
|
||||||
description="$(jq --raw-output '.description // empty' "$TARGET/esphomeyaml/config.json" | sed "s/'//g")"
|
|
||||||
url="$(jq --raw-output '.url // empty' "$TARGET/esphomeyaml/config.json")"
|
|
||||||
version="$(jq --raw-output '.version' "$TARGET/esphomeyaml/config.json")"
|
|
||||||
raw_image="$(jq --raw-output '.image // empty' "$TARGET/esphomeyaml/config.json")"
|
|
||||||
|
|
||||||
# Read data from image
|
|
||||||
if [ ! -z "$raw_image" ]; then
|
|
||||||
repository="$(echo "$raw_image" | cut -f 1 -d '/')"
|
|
||||||
image="$(echo "$raw_image" | cut -f 2 -d '/')"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Set additional labels
|
|
||||||
docker_cli+=("--label" "io.hass.name=$name")
|
|
||||||
docker_cli+=("--label" "io.hass.description=$description")
|
|
||||||
docker_cli+=("--label" "io.hass.type=addon")
|
|
||||||
|
|
||||||
if [ ! -z "$url" ]; then
|
|
||||||
docker_cli+=("--label" "io.hass.url=$url")
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Start build
|
|
||||||
run_build "$TARGET" "$repository" "$image" "$version" \
|
|
||||||
"$build_arch" docker_cli[@]
|
|
||||||
}
|
|
||||||
|
|
||||||
#### initialized cross-build ####
|
|
||||||
|
|
||||||
function init_crosscompile() {
|
|
||||||
echo "[INFO] Setup crosscompiling feature"
|
|
||||||
(
|
|
||||||
mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
|
|
||||||
update-binfmts --enable qemu-arm
|
|
||||||
update-binfmts --enable qemu-aarch64
|
|
||||||
) > /dev/null 2>&1 || echo "[WARN] Can't enable crosscompiling feature"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function clean_crosscompile() {
|
|
||||||
echo "[INFO] Clean crosscompiling feature"
|
|
||||||
if [ -f /proc/sys/fs/binfmt_misc ]; then
|
|
||||||
umount /proc/sys/fs/binfmt_misc || true
|
|
||||||
fi
|
|
||||||
|
|
||||||
(
|
|
||||||
update-binfmts --disable qemu-arm
|
|
||||||
update-binfmts --disable qemu-aarch64
|
|
||||||
) > /dev/null 2>&1 || echo "[WARN] No crosscompiling feature found for cleanup"
|
|
||||||
}
|
|
||||||
|
|
||||||
#### Error handling ####
|
|
||||||
|
|
||||||
function error_handling() {
|
|
||||||
stop_docker
|
|
||||||
clean_crosscompile
|
|
||||||
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
trap 'error_handling' SIGINT SIGTERM
|
|
||||||
|
|
||||||
#### Parse arguments ####
|
|
||||||
|
|
||||||
while [[ $# -gt 0 ]]; do
|
|
||||||
key=$1
|
|
||||||
case ${key} in
|
|
||||||
-h|--help)
|
|
||||||
print_help
|
|
||||||
;;
|
|
||||||
-t|--target)
|
|
||||||
TARGET=$2
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-i|--image)
|
|
||||||
IMAGE=$2
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
--no-cache)
|
|
||||||
DOCKER_CACHE="false"
|
|
||||||
;;
|
|
||||||
-d|--docker-hub)
|
|
||||||
DOCKER_HUB=$2
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
--armhf)
|
|
||||||
BUILD_LIST+=("armhf")
|
|
||||||
;;
|
|
||||||
--amd64)
|
|
||||||
BUILD_LIST+=("amd64")
|
|
||||||
;;
|
|
||||||
--i386)
|
|
||||||
BUILD_LIST+=("i386")
|
|
||||||
;;
|
|
||||||
--aarch64)
|
|
||||||
BUILD_LIST+=("aarch64")
|
|
||||||
;;
|
|
||||||
--all)
|
|
||||||
BUILD_LIST=("armhf" "amd64" "i386" "aarch64")
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "[WARN] $0 : Argument '$1' unknown will be Ignoring"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
# Check if an architecture is available
|
|
||||||
if [ "${#BUILD_LIST[@]}" -eq 0 ]; then
|
|
||||||
echo "[ERROR] You need select an architecture for build!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
#### Main ####
|
|
||||||
|
|
||||||
mkdir -p /data
|
|
||||||
|
|
||||||
# Setup docker env
|
|
||||||
init_crosscompile
|
|
||||||
start_docker
|
|
||||||
|
|
||||||
# Select arch build
|
|
||||||
for arch in "${BUILD_LIST[@]}"; do
|
|
||||||
(build_addon "$arch") &
|
|
||||||
BUILD_TASKS+=($!)
|
|
||||||
done
|
|
||||||
|
|
||||||
# Wait until all build jobs are done
|
|
||||||
wait "${BUILD_TASKS[@]}"
|
|
||||||
|
|
||||||
# Cleanup docker env
|
|
||||||
clean_crosscompile
|
|
||||||
stop_docker
|
|
||||||
|
|
||||||
exit 0
|
|
|
@ -1,7 +0,0 @@
|
||||||
; This file allows the docker build file to install the required platformio
|
|
||||||
; platforms
|
|
||||||
|
|
||||||
[env:espressif8266]
|
|
||||||
platform = espressif8266
|
|
||||||
board = nodemcuv2
|
|
||||||
framework = arduino
|
|
|
@ -3,7 +3,7 @@
|
||||||
"version": "1.9.0b6",
|
"version": "1.9.0b6",
|
||||||
"slug": "esphomeyaml-beta",
|
"slug": "esphomeyaml-beta",
|
||||||
"description": "Beta version of esphomeyaml HassIO add-on.",
|
"description": "Beta version of esphomeyaml HassIO add-on.",
|
||||||
"url": "https://esphomelib.com/esphomeyaml/index.html",
|
"url": "https://beta.esphomelib.com/esphomeyaml/index.html",
|
||||||
"startup": "application",
|
"startup": "application",
|
||||||
"webui": "http://[HOST]:[PORT:6052]",
|
"webui": "http://[HOST]:[PORT:6052]",
|
||||||
"boot": "auto",
|
"boot": "auto",
|
||||||
|
|
|
@ -1,59 +1,24 @@
|
||||||
# Dockerfile for HassIO add-on
|
# Dockerfile for HassIO edge add-on
|
||||||
ARG BUILD_FROM=ubuntu:bionic
|
ARG BUILD_FROM=homeassistant/amd64-base-ubuntu:latest
|
||||||
FROM ${BUILD_FROM}
|
FROM ${BUILD_FROM}
|
||||||
|
|
||||||
# Re-declare BUILD_FROM to fix weird docker issue
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
ARG BUILD_FROM
|
python \
|
||||||
|
python-pip \
|
||||||
|
python-setuptools \
|
||||||
|
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
|
||||||
|
|
||||||
# On amd64 and alike, using ubuntu as the base is better as building
|
|
||||||
# for the ESP32 only works with glibc (and ubuntu). However, on armhf
|
|
||||||
# the build toolchain frequently procudes segfaults under ubuntu.
|
|
||||||
# -> Use ubuntu for most architectures, except alpine for armhf
|
|
||||||
#
|
|
||||||
# * python and related required because this is a python project
|
|
||||||
# * git required for platformio library dependencies downloads
|
|
||||||
# * libc6-compat and openssh required on alpine for weird reasons
|
|
||||||
# * disable platformio telemetry on install
|
|
||||||
RUN /bin/bash -c "if [[ '$BUILD_FROM' = *\"ubuntu\"* ]]; then \
|
|
||||||
apt-get update && apt-get install -y --no-install-recommends \
|
|
||||||
python python-pip python-setuptools python-pil git && \
|
|
||||||
rm -rf /var/lib/apt/lists/* /tmp/*; \
|
|
||||||
else \
|
|
||||||
apk add --no-cache \
|
|
||||||
python2 \
|
|
||||||
python2-dev \
|
|
||||||
py2-pip \
|
|
||||||
git \
|
|
||||||
gcc \
|
|
||||||
openssh \
|
|
||||||
libc6-compat \
|
|
||||||
jpeg-dev \
|
|
||||||
zlib-dev \
|
|
||||||
freetype-dev \
|
|
||||||
lcms2-dev \
|
|
||||||
openjpeg-dev \
|
|
||||||
tiff-dev \
|
|
||||||
libc-dev \
|
|
||||||
linux-headers; \
|
|
||||||
fi" && \
|
|
||||||
pip install --no-cache-dir platformio && \
|
|
||||||
platformio settings set enable_telemetry No
|
|
||||||
|
|
||||||
|
|
||||||
# Create fake project to make platformio install all depdencies.
|
|
||||||
# * Ignore build errors from platformio - empty project
|
|
||||||
# * On alpine, only install ESP8266 toolchain
|
|
||||||
COPY platformio.ini /pio/platformio.ini
|
COPY platformio.ini /pio/platformio.ini
|
||||||
RUN /bin/bash -c "if [[ '$BUILD_FROM' = *\"ubuntu\"* ]]; then \
|
RUN platformio run -d /pio; rm -rf /pio
|
||||||
platformio run -e espressif32 -e espressif8266 -d /pio; exit 0; \
|
|
||||||
else \
|
|
||||||
echo \"\$(head -8 /pio/platformio.ini)\" >/pio/platformio.ini; \
|
|
||||||
platformio run -e espressif8266 -d /pio; exit 0; \
|
|
||||||
fi"
|
|
||||||
|
|
||||||
# Install latest esphomeyaml from git
|
RUN pip install --no-cache-dir git+https://github.com/OttoWinter/esphomeyaml.git@dev#egg=esphomeyaml && \
|
||||||
RUN pip install --no-cache-dir \
|
|
||||||
git+git://github.com/OttoWinter/esphomeyaml.git && \
|
|
||||||
pip install --no-cache-dir pillow tzlocal
|
pip install --no-cache-dir pillow tzlocal
|
||||||
|
|
||||||
CMD ["esphomeyaml", "/config/esphomeyaml", "dashboard"]
|
CMD ["esphomeyaml", "/config/esphomeyaml", "dashboard"]
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
{
|
{
|
||||||
"squash": false,
|
"squash": false,
|
||||||
"build_from": {
|
"build_from": {
|
||||||
"aarch64": "arm64v8/ubuntu:bionic",
|
"aarch64": "homeassistant/aarch64-base-ubuntu:latest",
|
||||||
"amd64": "ubuntu:bionic",
|
"amd64": "homeassistant/amd64-base-ubuntu:latest",
|
||||||
"armhf": "homeassistant/armhf-base:latest",
|
"armhf": "homeassistant/armhf-base-ubuntu:latest",
|
||||||
"i386": "i386/ubuntu:bionic"
|
"i386": "homeassistant/i386-base-ubuntu:latest"
|
||||||
},
|
},
|
||||||
"args": {}
|
"args": {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,22 +1,22 @@
|
||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
|
from collections import OrderedDict
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import random
|
import random
|
||||||
import sys
|
import sys
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
from esphomeyaml import const, core, core_config, mqtt, wizard, writer, yaml_util
|
from esphomeyaml import const, core, core_config, mqtt, wizard, writer, yaml_util, platformio_api
|
||||||
from esphomeyaml.config import get_component, iter_components, read_config
|
from esphomeyaml.config import get_component, iter_components, read_config
|
||||||
from esphomeyaml.const import CONF_BAUD_RATE, CONF_BUILD_PATH, CONF_DOMAIN, CONF_ESPHOMEYAML, \
|
from esphomeyaml.const import CONF_BAUD_RATE, CONF_BUILD_PATH, CONF_DOMAIN, CONF_ESPHOMEYAML, \
|
||||||
CONF_HOSTNAME, CONF_LOGGER, CONF_MANUAL_IP, CONF_NAME, CONF_STATIC_IP, CONF_USE_CUSTOM_CODE, \
|
CONF_HOSTNAME, CONF_LOGGER, CONF_MANUAL_IP, CONF_NAME, CONF_STATIC_IP, CONF_USE_CUSTOM_CODE, \
|
||||||
CONF_WIFI, ESP_PLATFORM_ESP8266
|
CONF_WIFI, ESP_PLATFORM_ESP8266
|
||||||
from esphomeyaml.core import ESPHomeYAMLError
|
from esphomeyaml.core import ESPHomeYAMLError
|
||||||
from esphomeyaml.helpers import AssignmentExpression, Expression, RawStatement, \
|
from esphomeyaml.helpers import AssignmentExpression, Expression, RawStatement, \
|
||||||
_EXPRESSIONS, add, \
|
_EXPRESSIONS, add, add_job, color, flush_tasks, indent, statement, relative_path
|
||||||
add_job, color, flush_tasks, indent, quote, statement, relative_path
|
from esphomeyaml.util import safe_print, run_external_command
|
||||||
from esphomeyaml.util import safe_print
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -62,34 +62,6 @@ def choose_serial_port(config):
|
||||||
return result[opt][0]
|
return result[opt][0]
|
||||||
|
|
||||||
|
|
||||||
def run_platformio(*cmd, **kwargs):
|
|
||||||
def mock_exit(return_code):
|
|
||||||
raise SystemExit(return_code)
|
|
||||||
|
|
||||||
orig_argv = sys.argv
|
|
||||||
orig_exit = sys.exit # mock sys.exit
|
|
||||||
full_cmd = u' '.join(quote(x) for x in cmd)
|
|
||||||
_LOGGER.info(u"Running: %s", full_cmd)
|
|
||||||
try:
|
|
||||||
func = kwargs.get('main')
|
|
||||||
if func is None:
|
|
||||||
import platformio.__main__
|
|
||||||
func = platformio.__main__.main
|
|
||||||
sys.argv = list(cmd)
|
|
||||||
sys.exit = mock_exit
|
|
||||||
return func() or 0
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
return 1
|
|
||||||
except SystemExit as err:
|
|
||||||
return err.args[0]
|
|
||||||
except Exception as err: # pylint: disable=broad-except
|
|
||||||
_LOGGER.error(u"Running platformio failed: %s", err)
|
|
||||||
_LOGGER.error(u"Please try running %s locally.", full_cmd)
|
|
||||||
finally:
|
|
||||||
sys.argv = orig_argv
|
|
||||||
sys.exit = orig_exit
|
|
||||||
|
|
||||||
|
|
||||||
def run_miniterm(config, port, escape=False):
|
def run_miniterm(config, port, escape=False):
|
||||||
import serial
|
import serial
|
||||||
if CONF_LOGGER not in config:
|
if CONF_LOGGER not in config:
|
||||||
|
@ -100,6 +72,7 @@ def run_miniterm(config, port, escape=False):
|
||||||
_LOGGER.info("UART logging is disabled (baud_rate=0). Not starting UART logs.")
|
_LOGGER.info("UART logging is disabled (baud_rate=0). Not starting UART logs.")
|
||||||
_LOGGER.info("Starting log output from %s with baud rate %s", port, baud_rate)
|
_LOGGER.info("Starting log output from %s with baud rate %s", port, baud_rate)
|
||||||
|
|
||||||
|
backtrace_state = False
|
||||||
with serial.Serial(port, baudrate=baud_rate) as ser:
|
with serial.Serial(port, baudrate=baud_rate) as ser:
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
|
@ -114,6 +87,9 @@ def run_miniterm(config, port, escape=False):
|
||||||
message = message.replace('\033', '\\033')
|
message = message.replace('\033', '\\033')
|
||||||
safe_print(message)
|
safe_print(message)
|
||||||
|
|
||||||
|
backtrace_state = platformio_api.process_stacktrace(
|
||||||
|
config, line, backtrace_state=backtrace_state)
|
||||||
|
|
||||||
|
|
||||||
def write_cpp(config):
|
def write_cpp(config):
|
||||||
_LOGGER.info("Generating C++ source...")
|
_LOGGER.info("Generating C++ source...")
|
||||||
|
@ -154,11 +130,7 @@ def write_cpp(config):
|
||||||
|
|
||||||
def compile_program(args, config):
|
def compile_program(args, config):
|
||||||
_LOGGER.info("Compiling app...")
|
_LOGGER.info("Compiling app...")
|
||||||
build_path = relative_path(config[CONF_ESPHOMEYAML][CONF_BUILD_PATH])
|
return platformio_api.run_compile(config, args.verbose)
|
||||||
command = ['platformio', 'run', '-d', build_path]
|
|
||||||
if args.verbose:
|
|
||||||
command.append('-v')
|
|
||||||
return run_platformio(*command)
|
|
||||||
|
|
||||||
|
|
||||||
def get_upload_host(config):
|
def get_upload_host(config):
|
||||||
|
@ -176,10 +148,10 @@ def upload_using_esptool(config, port):
|
||||||
|
|
||||||
build_path = relative_path(config[CONF_ESPHOMEYAML][CONF_BUILD_PATH])
|
build_path = relative_path(config[CONF_ESPHOMEYAML][CONF_BUILD_PATH])
|
||||||
path = os.path.join(build_path, '.pioenvs', core.NAME, 'firmware.bin')
|
path = os.path.join(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
|
# pylint: disable=protected-access
|
||||||
return run_platformio('esptool.py', '--before', 'default_reset', '--after', 'hard_reset',
|
return run_external_command(esptool._main, *cmd)
|
||||||
'--chip', 'esp8266', '--port', port, 'write_flash', '0x0',
|
|
||||||
path, main=esptool._main)
|
|
||||||
|
|
||||||
|
|
||||||
def upload_program(config, args, port):
|
def upload_program(config, args, port):
|
||||||
|
@ -190,11 +162,7 @@ def upload_program(config, args, port):
|
||||||
if port != 'OTA' and serial_port:
|
if port != 'OTA' and serial_port:
|
||||||
if core.ESP_PLATFORM == ESP_PLATFORM_ESP8266 and args.use_esptoolpy:
|
if core.ESP_PLATFORM == ESP_PLATFORM_ESP8266 and args.use_esptoolpy:
|
||||||
return upload_using_esptool(config, port)
|
return upload_using_esptool(config, port)
|
||||||
command = ['platformio', 'run', '-d', build_path,
|
return platformio_api.run_upload(config, args.verbose, port)
|
||||||
'-t', 'upload', '--upload-port', port]
|
|
||||||
if args.verbose:
|
|
||||||
command.append('-v')
|
|
||||||
return run_platformio(*command)
|
|
||||||
|
|
||||||
if 'ota' not in config:
|
if 'ota' not in config:
|
||||||
_LOGGER.error("No serial port found and OTA not enabled. Can't upload!")
|
_LOGGER.error("No serial port found and OTA not enabled. Can't upload!")
|
||||||
|
@ -243,7 +211,7 @@ def clean_mqtt(config, args):
|
||||||
def setup_log(debug=False):
|
def setup_log(debug=False):
|
||||||
log_level = logging.DEBUG if debug else logging.INFO
|
log_level = logging.DEBUG if debug else logging.INFO
|
||||||
logging.basicConfig(level=log_level)
|
logging.basicConfig(level=log_level)
|
||||||
fmt = "%(levelname)s [%(name)s] %(message)s"
|
fmt = "%(levelname)s %(message)s"
|
||||||
colorfmt = "%(log_color)s{}%(reset)s".format(fmt)
|
colorfmt = "%(log_color)s{}%(reset)s".format(fmt)
|
||||||
datefmt = '%H:%M:%S'
|
datefmt = '%H:%M:%S'
|
||||||
|
|
||||||
|
@ -367,6 +335,28 @@ def command_clean(args, config):
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
def command_hass_config(args, config):
|
||||||
|
from esphomeyaml.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.")
|
||||||
|
data = mqtt_component.GenerateHassConfigData(config)
|
||||||
|
hass_config = OrderedDict()
|
||||||
|
for domain, component, conf in iter_components(config):
|
||||||
|
if not hasattr(component, 'to_hass_config'):
|
||||||
|
continue
|
||||||
|
func = getattr(component, 'to_hass_config')
|
||||||
|
ret = func(data, conf)
|
||||||
|
if not isinstance(ret, (list, tuple)):
|
||||||
|
ret = [ret]
|
||||||
|
ret = [x for x in ret if x is not None]
|
||||||
|
domain_conf = hass_config.setdefault(domain.split('.')[0], [])
|
||||||
|
domain_conf += ret
|
||||||
|
|
||||||
|
safe_print(yaml_util.dump(hass_config))
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
def command_dashboard(args):
|
def command_dashboard(args):
|
||||||
from esphomeyaml.dashboard import dashboard
|
from esphomeyaml.dashboard import dashboard
|
||||||
|
|
||||||
|
@ -388,6 +378,7 @@ POST_CONFIG_ACTIONS = {
|
||||||
'clean-mqtt': command_clean_mqtt,
|
'clean-mqtt': command_clean_mqtt,
|
||||||
'mqtt-fingerprint': command_mqtt_fingerprint,
|
'mqtt-fingerprint': command_mqtt_fingerprint,
|
||||||
'clean': command_clean,
|
'clean': command_clean,
|
||||||
|
'hass-config': command_hass_config,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -469,6 +460,9 @@ def parse_args(argv):
|
||||||
dashboard.add_argument("--open-ui", help="Open the dashboard UI in a browser.",
|
dashboard.add_argument("--open-ui", help="Open the dashboard UI in a browser.",
|
||||||
action='store_true')
|
action='store_true')
|
||||||
|
|
||||||
|
subparsers.add_parser('hass-config', help="Dump the configuration entries that should be added"
|
||||||
|
"to Home Assistant when not using MQTT discovery.")
|
||||||
|
|
||||||
return parser.parse_args(argv[1:])
|
return parser.parse_args(argv[1:])
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
import copy
|
||||||
|
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from esphomeyaml import core
|
from esphomeyaml import core
|
||||||
|
@ -8,7 +10,8 @@ from esphomeyaml.const import CONF_ABOVE, CONF_ACTION_ID, CONF_AND, CONF_AUTOMAT
|
||||||
CONF_OR, CONF_RANGE, CONF_THEN, CONF_TRIGGER_ID
|
CONF_OR, CONF_RANGE, CONF_THEN, CONF_TRIGGER_ID
|
||||||
from esphomeyaml.core import ESPHomeYAMLError
|
from esphomeyaml.core import ESPHomeYAMLError
|
||||||
from esphomeyaml.helpers import App, ArrayInitializer, Pvariable, TemplateArguments, add, add_job, \
|
from esphomeyaml.helpers import App, ArrayInitializer, Pvariable, TemplateArguments, add, add_job, \
|
||||||
esphomelib_ns, float_, process_lambda, templatable, uint32, get_variable
|
esphomelib_ns, float_, process_lambda, templatable, uint32, get_variable, PollingComponent, \
|
||||||
|
Action, Component, Trigger
|
||||||
from esphomeyaml.util import ServiceRegistry
|
from esphomeyaml.util import ServiceRegistry
|
||||||
|
|
||||||
|
|
||||||
|
@ -28,8 +31,9 @@ def validate_recursive_condition(value):
|
||||||
|
|
||||||
|
|
||||||
def validate_recursive_action(value):
|
def validate_recursive_action(value):
|
||||||
value = cv.ensure_list(value)
|
value = cv.ensure_list(value)[:]
|
||||||
for i, item in enumerate(value):
|
for i, item in enumerate(value):
|
||||||
|
item = copy.deepcopy(item)
|
||||||
if not isinstance(item, dict):
|
if not isinstance(item, dict):
|
||||||
raise vol.Invalid(u"Action must consist of key-value mapping! Got {}".format(item))
|
raise vol.Invalid(u"Action must consist of key-value mapping! Got {}".format(item))
|
||||||
key = next((x for x in item if x != CONF_ACTION_ID), None)
|
key = next((x for x in item if x != CONF_ACTION_ID), None)
|
||||||
|
@ -41,11 +45,12 @@ def validate_recursive_action(value):
|
||||||
item.setdefault(CONF_ACTION_ID, None)
|
item.setdefault(CONF_ACTION_ID, None)
|
||||||
key2 = next((x for x in item if x != CONF_ACTION_ID and x != key), None)
|
key2 = next((x for x in item if x != CONF_ACTION_ID and x != key), None)
|
||||||
if key2 is not None:
|
if key2 is not None:
|
||||||
raise vol.Invalid(u"Cannot have two actions in one item. Key {} overrides {}!"
|
raise vol.Invalid(u"Cannot have two actions in one item. Key '{}' overrides '{}'! "
|
||||||
|
u"Did you forget to indent the action?"
|
||||||
u"".format(key, key2))
|
u"".format(key, key2))
|
||||||
validator = ACTION_REGISTRY[key][0]
|
validator = ACTION_REGISTRY[key][0]
|
||||||
value[i] = {
|
value[i] = {
|
||||||
CONF_ACTION_ID: cv.declare_variable_id(None)(item[CONF_ACTION_ID]),
|
CONF_ACTION_ID: cv.declare_variable_id(Action)(item[CONF_ACTION_ID]),
|
||||||
key: validator(item[key])
|
key: validator(item[key])
|
||||||
}
|
}
|
||||||
return value
|
return value
|
||||||
|
@ -54,14 +59,20 @@ def validate_recursive_action(value):
|
||||||
ACTION_REGISTRY = ServiceRegistry()
|
ACTION_REGISTRY = ServiceRegistry()
|
||||||
|
|
||||||
# pylint: disable=invalid-name
|
# pylint: disable=invalid-name
|
||||||
DelayAction = esphomelib_ns.DelayAction
|
DelayAction = esphomelib_ns.class_('DelayAction', Action, Component)
|
||||||
LambdaAction = esphomelib_ns.LambdaAction
|
LambdaAction = esphomelib_ns.class_('LambdaAction', Action)
|
||||||
IfAction = esphomelib_ns.IfAction
|
IfAction = esphomelib_ns.class_('IfAction', Action)
|
||||||
UpdateComponentAction = esphomelib_ns.UpdateComponentAction
|
UpdateComponentAction = esphomelib_ns.class_('UpdateComponentAction', Action)
|
||||||
Automation = esphomelib_ns.Automation
|
Automation = esphomelib_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)
|
||||||
|
|
||||||
CONDITIONS_SCHEMA = vol.All(cv.ensure_list, [cv.templatable({
|
CONDITIONS_SCHEMA = vol.All(cv.ensure_list, [cv.templatable({
|
||||||
cv.GenerateID(CONF_CONDITION_ID): cv.declare_variable_id(None),
|
cv.GenerateID(CONF_CONDITION_ID): cv.declare_variable_id(Condition),
|
||||||
vol.Optional(CONF_AND): validate_recursive_condition,
|
vol.Optional(CONF_AND): validate_recursive_condition,
|
||||||
vol.Optional(CONF_OR): validate_recursive_condition,
|
vol.Optional(CONF_OR): validate_recursive_condition,
|
||||||
vol.Optional(CONF_RANGE): vol.All(vol.Schema({
|
vol.Optional(CONF_RANGE): vol.All(vol.Schema({
|
||||||
|
@ -71,12 +82,6 @@ CONDITIONS_SCHEMA = vol.All(cv.ensure_list, [cv.templatable({
|
||||||
vol.Optional(CONF_LAMBDA): cv.lambda_,
|
vol.Optional(CONF_LAMBDA): cv.lambda_,
|
||||||
})])
|
})])
|
||||||
|
|
||||||
# pylint: disable=invalid-name
|
|
||||||
AndCondition = esphomelib_ns.AndCondition
|
|
||||||
OrCondition = esphomelib_ns.OrCondition
|
|
||||||
RangeCondition = esphomelib_ns.RangeCondition
|
|
||||||
LambdaCondition = esphomelib_ns.LambdaCondition
|
|
||||||
|
|
||||||
|
|
||||||
def validate_automation(extra_schema=None, extra_validators=None, single=False):
|
def validate_automation(extra_schema=None, extra_validators=None, single=False):
|
||||||
schema = AUTOMATION_SCHEMA.extend(extra_schema or {})
|
schema = AUTOMATION_SCHEMA.extend(extra_schema or {})
|
||||||
|
@ -91,6 +96,8 @@ def validate_automation(extra_schema=None, extra_validators=None, single=False):
|
||||||
try:
|
try:
|
||||||
return vol.Schema([schema])(value)
|
return vol.Schema([schema])(value)
|
||||||
except vol.Invalid as err2:
|
except vol.Invalid as err2:
|
||||||
|
if 'Unable to find action' in str(err):
|
||||||
|
raise err2
|
||||||
raise vol.MultipleInvalid([err, err2])
|
raise vol.MultipleInvalid([err, err2])
|
||||||
elif isinstance(value, dict):
|
elif isinstance(value, dict):
|
||||||
if CONF_THEN in value:
|
if CONF_THEN in value:
|
||||||
|
@ -113,8 +120,8 @@ def validate_automation(extra_schema=None, extra_validators=None, single=False):
|
||||||
|
|
||||||
|
|
||||||
AUTOMATION_SCHEMA = vol.Schema({
|
AUTOMATION_SCHEMA = vol.Schema({
|
||||||
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_variable_id(None),
|
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_variable_id(Trigger),
|
||||||
cv.GenerateID(CONF_AUTOMATION_ID): cv.declare_variable_id(None),
|
cv.GenerateID(CONF_AUTOMATION_ID): cv.declare_variable_id(Automation),
|
||||||
vol.Optional(CONF_IF): CONDITIONS_SCHEMA,
|
vol.Optional(CONF_IF): CONDITIONS_SCHEMA,
|
||||||
vol.Required(CONF_THEN): validate_recursive_action,
|
vol.Required(CONF_THEN): validate_recursive_action,
|
||||||
})
|
})
|
||||||
|
@ -222,7 +229,7 @@ def lambda_action_to_code(config, action_id, arg_type):
|
||||||
|
|
||||||
CONF_COMPONENT_UPDATE = 'component.update'
|
CONF_COMPONENT_UPDATE = 'component.update'
|
||||||
COMPONENT_UPDATE_ACTION_SCHEMA = maybe_simple_id({
|
COMPONENT_UPDATE_ACTION_SCHEMA = maybe_simple_id({
|
||||||
vol.Required(CONF_ID): cv.use_variable_id(None),
|
vol.Required(CONF_ID): cv.use_variable_id(PollingComponent),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,22 +1,18 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
|
from esphomeyaml.components import sensor, i2c
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import sensor
|
from esphomeyaml.const import CONF_ADDRESS, CONF_ID
|
||||||
from esphomeyaml.const import CONF_ADDRESS, CONF_ID, CONF_RATE
|
from esphomeyaml.helpers import App, Pvariable, setup_component, Component
|
||||||
from esphomeyaml.helpers import App, Pvariable
|
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ['i2c']
|
||||||
|
|
||||||
ADS1115Component = sensor.sensor_ns.ADS1115Component
|
ADS1115Component = sensor.sensor_ns.class_('ADS1115Component', Component, i2c.I2CDevice)
|
||||||
|
|
||||||
RATE_REMOVE_MESSAGE = """The rate option has been removed in 1.5.0 and is no longer required."""
|
|
||||||
|
|
||||||
ADS1115_SCHEMA = vol.Schema({
|
ADS1115_SCHEMA = vol.Schema({
|
||||||
cv.GenerateID(): cv.declare_variable_id(ADS1115Component),
|
cv.GenerateID(): cv.declare_variable_id(ADS1115Component),
|
||||||
vol.Required(CONF_ADDRESS): cv.i2c_address,
|
vol.Required(CONF_ADDRESS): cv.i2c_address,
|
||||||
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
vol.Optional(CONF_RATE): cv.invalid(RATE_REMOVE_MESSAGE)
|
|
||||||
})
|
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.All(cv.ensure_list, [ADS1115_SCHEMA])
|
CONFIG_SCHEMA = vol.All(cv.ensure_list, [ADS1115_SCHEMA])
|
||||||
|
|
||||||
|
@ -24,7 +20,8 @@ CONFIG_SCHEMA = vol.All(cv.ensure_list, [ADS1115_SCHEMA])
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
for conf in config:
|
for conf in config:
|
||||||
rhs = App.make_ads1115_component(conf[CONF_ADDRESS])
|
rhs = App.make_ads1115_component(conf[CONF_ADDRESS])
|
||||||
Pvariable(conf[CONF_ID], rhs)
|
var = Pvariable(conf[CONF_ID], rhs)
|
||||||
|
setup_component(var, conf)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_ADS1115_SENSOR'
|
BUILD_FLAGS = '-DUSE_ADS1115_SENSOR'
|
||||||
|
|
|
@ -1,13 +1,16 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
|
from esphomeyaml import automation, core
|
||||||
|
from esphomeyaml.components import mqtt
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml import automation
|
from esphomeyaml.const import CONF_DELAYED_OFF, CONF_DELAYED_ON, CONF_DEVICE_CLASS, CONF_FILTERS, \
|
||||||
from esphomeyaml.const import CONF_DEVICE_CLASS, CONF_ID, CONF_INTERNAL, CONF_INVERTED, \
|
CONF_HEARTBEAT, CONF_ID, CONF_INTERNAL, CONF_INVALID_COOLDOWN, CONF_INVERT, CONF_INVERTED, \
|
||||||
CONF_MAX_LENGTH, CONF_MIN_LENGTH, CONF_MQTT_ID, CONF_ON_CLICK, CONF_ON_DOUBLE_CLICK, \
|
CONF_LAMBDA, CONF_MAX_LENGTH, CONF_MIN_LENGTH, CONF_MQTT_ID, CONF_ON_CLICK, \
|
||||||
CONF_ON_PRESS, CONF_ON_RELEASE, CONF_TRIGGER_ID, CONF_FILTERS, CONF_INVERT, CONF_DELAYED_ON, \
|
CONF_ON_DOUBLE_CLICK, CONF_ON_MULTI_CLICK, CONF_ON_PRESS, CONF_ON_RELEASE, CONF_STATE, \
|
||||||
CONF_DELAYED_OFF, CONF_LAMBDA, CONF_HEARTBEAT
|
CONF_TIMING, CONF_TRIGGER_ID
|
||||||
from esphomeyaml.helpers import App, NoArg, Pvariable, add, add_job, esphomelib_ns, \
|
from esphomeyaml.helpers import App, ArrayInitializer, NoArg, Pvariable, StructInitializer, add, \
|
||||||
setup_mqtt_component, bool_, process_lambda, ArrayInitializer
|
add_job, bool_, esphomelib_ns, process_lambda, setup_mqtt_component, Nameable, Trigger, \
|
||||||
|
Component
|
||||||
|
|
||||||
DEVICE_CLASSES = [
|
DEVICE_CLASSES = [
|
||||||
'', 'battery', 'cold', 'connectivity', 'door', 'garage_door', 'gas',
|
'', 'battery', 'cold', 'connectivity', 'door', 'garage_door', 'gas',
|
||||||
|
@ -21,17 +24,25 @@ PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
|
||||||
})
|
})
|
||||||
|
|
||||||
binary_sensor_ns = esphomelib_ns.namespace('binary_sensor')
|
binary_sensor_ns = esphomelib_ns.namespace('binary_sensor')
|
||||||
PressTrigger = binary_sensor_ns.PressTrigger
|
BinarySensor = binary_sensor_ns.class_('BinarySensor', Nameable)
|
||||||
ReleaseTrigger = binary_sensor_ns.ReleaseTrigger
|
MQTTBinarySensorComponent = binary_sensor_ns.class_('MQTTBinarySensorComponent', mqtt.MQTTComponent)
|
||||||
ClickTrigger = binary_sensor_ns.ClickTrigger
|
|
||||||
DoubleClickTrigger = binary_sensor_ns.DoubleClickTrigger
|
# Triggers
|
||||||
BinarySensor = binary_sensor_ns.BinarySensor
|
PressTrigger = binary_sensor_ns.class_('PressTrigger', Trigger.template(NoArg))
|
||||||
InvertFilter = binary_sensor_ns.InvertFilter
|
ReleaseTrigger = binary_sensor_ns.class_('ReleaseTrigger', Trigger.template(NoArg))
|
||||||
LambdaFilter = binary_sensor_ns.LambdaFilter
|
ClickTrigger = binary_sensor_ns.class_('ClickTrigger', Trigger.template(NoArg))
|
||||||
DelayedOnFilter = binary_sensor_ns.DelayedOnFilter
|
DoubleClickTrigger = binary_sensor_ns.class_('DoubleClickTrigger', Trigger.template(NoArg))
|
||||||
DelayedOffFilter = binary_sensor_ns.DelayedOffFilter
|
MultiClickTrigger = binary_sensor_ns.class_('MultiClickTrigger', Trigger.template(NoArg), Component)
|
||||||
HeartbeatFilter = binary_sensor_ns.HeartbeatFilter
|
MultiClickTriggerEvent = binary_sensor_ns.struct('MultiClickTriggerEvent')
|
||||||
MQTTBinarySensorComponent = binary_sensor_ns.MQTTBinarySensorComponent
|
|
||||||
|
# Filters
|
||||||
|
Filter = binary_sensor_ns.class_('Filter')
|
||||||
|
DelayedOnFilter = binary_sensor_ns.class_('DelayedOnFilter', Filter, Component)
|
||||||
|
DelayedOffFilter = binary_sensor_ns.class_('DelayedOffFilter', Filter, Component)
|
||||||
|
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]
|
FILTER_KEYS = [CONF_INVERT, CONF_DELAYED_ON, CONF_DELAYED_OFF, CONF_LAMBDA, CONF_HEARTBEAT]
|
||||||
|
|
||||||
|
@ -43,9 +54,101 @@ FILTERS_SCHEMA = vol.All(cv.ensure_list, [vol.All({
|
||||||
vol.Optional(CONF_LAMBDA): cv.lambda_,
|
vol.Optional(CONF_LAMBDA): cv.lambda_,
|
||||||
}, cv.has_exactly_one_key(*FILTER_KEYS))])
|
}, cv.has_exactly_one_key(*FILTER_KEYS))])
|
||||||
|
|
||||||
|
MULTI_CLICK_TIMING_SCHEMA = vol.Schema({
|
||||||
|
vol.Optional(CONF_STATE): cv.boolean,
|
||||||
|
vol.Optional(CONF_MIN_LENGTH): cv.positive_time_period_milliseconds,
|
||||||
|
vol.Optional(CONF_MAX_LENGTH): cv.positive_time_period_milliseconds,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
def parse_multi_click_timing_str(value):
|
||||||
|
if not isinstance(value, basestring):
|
||||||
|
return value
|
||||||
|
|
||||||
|
parts = value.lower().split(' ')
|
||||||
|
if len(parts) != 5:
|
||||||
|
raise vol.Invalid("Multi click timing grammar consists of exactly 5 words, not {}"
|
||||||
|
"".format(len(parts)))
|
||||||
|
try:
|
||||||
|
state = cv.boolean(parts[0])
|
||||||
|
except vol.Invalid:
|
||||||
|
raise vol.Invalid(u"First word must either be ON or OFF, not {}".format(parts[0]))
|
||||||
|
|
||||||
|
if parts[1] != 'for':
|
||||||
|
raise vol.Invalid(u"Second word must be 'for', got {}".format(parts[1]))
|
||||||
|
|
||||||
|
if parts[2] == 'at':
|
||||||
|
if parts[3] == 'least':
|
||||||
|
key = CONF_MIN_LENGTH
|
||||||
|
elif parts[3] == 'most':
|
||||||
|
key = CONF_MAX_LENGTH
|
||||||
|
else:
|
||||||
|
raise vol.Invalid(u"Third word after at must either be 'least' or 'most', got {}"
|
||||||
|
u"".format(parts[3]))
|
||||||
|
try:
|
||||||
|
length = cv.positive_time_period_milliseconds(parts[4])
|
||||||
|
except vol.Invalid as err:
|
||||||
|
raise vol.Invalid(u"Multi Click Grammar Parsing length failed: {}".format(err))
|
||||||
|
return {
|
||||||
|
CONF_STATE: state,
|
||||||
|
key: str(length)
|
||||||
|
}
|
||||||
|
|
||||||
|
if parts[3] != 'to':
|
||||||
|
raise vol.Invalid("Multi click grammar: 4th word must be 'to'")
|
||||||
|
|
||||||
|
try:
|
||||||
|
min_length = cv.positive_time_period_milliseconds(parts[2])
|
||||||
|
except vol.Invalid as err:
|
||||||
|
raise vol.Invalid(u"Multi Click Grammar Parsing minimum length failed: {}".format(err))
|
||||||
|
|
||||||
|
try:
|
||||||
|
max_length = cv.positive_time_period_milliseconds(parts[4])
|
||||||
|
except vol.Invalid as err:
|
||||||
|
raise vol.Invalid(u"Multi Click Grammar Parsing minimum length failed: {}".format(err))
|
||||||
|
|
||||||
|
return {
|
||||||
|
CONF_STATE: state,
|
||||||
|
CONF_MIN_LENGTH: str(min_length),
|
||||||
|
CONF_MAX_LENGTH: str(max_length)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def validate_multi_click_timing(value):
|
||||||
|
if not isinstance(value, list):
|
||||||
|
raise vol.Invalid("Timing option must be a *list* of times!")
|
||||||
|
timings = []
|
||||||
|
state = None
|
||||||
|
for i, v_ in enumerate(value):
|
||||||
|
v_ = MULTI_CLICK_TIMING_SCHEMA(v_)
|
||||||
|
min_length = v_.get(CONF_MIN_LENGTH)
|
||||||
|
max_length = v_.get(CONF_MAX_LENGTH)
|
||||||
|
if min_length is None and max_length is None:
|
||||||
|
raise vol.Invalid("At least one of min_length and max_length is required!")
|
||||||
|
if min_length is None and max_length is not None:
|
||||||
|
min_length = core.TimePeriodMilliseconds(milliseconds=0)
|
||||||
|
|
||||||
|
new_state = v_.get(CONF_STATE, not state)
|
||||||
|
if new_state == state:
|
||||||
|
raise vol.Invalid("Timings must have alternating state. Indices {} and {} have "
|
||||||
|
"the same state {}".format(i, i + 1, state))
|
||||||
|
if max_length is not None and max_length < min_length:
|
||||||
|
raise vol.Invalid("Max length ({}) must be larger than min length ({})."
|
||||||
|
"".format(max_length, min_length))
|
||||||
|
|
||||||
|
state = new_state
|
||||||
|
tim = {
|
||||||
|
CONF_STATE: new_state,
|
||||||
|
CONF_MIN_LENGTH: min_length,
|
||||||
|
}
|
||||||
|
if max_length is not None:
|
||||||
|
tim[CONF_MAX_LENGTH] = max_length
|
||||||
|
timings.append(tim)
|
||||||
|
return timings
|
||||||
|
|
||||||
|
|
||||||
BINARY_SENSOR_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend({
|
BINARY_SENSOR_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend({
|
||||||
cv.GenerateID(CONF_MQTT_ID): cv.declare_variable_id(MQTTBinarySensorComponent),
|
cv.GenerateID(CONF_MQTT_ID): cv.declare_variable_id(MQTTBinarySensorComponent),
|
||||||
cv.GenerateID(): cv.declare_variable_id(BinarySensor),
|
|
||||||
|
|
||||||
vol.Optional(CONF_DEVICE_CLASS): vol.All(vol.Lower, cv.one_of(*DEVICE_CLASSES)),
|
vol.Optional(CONF_DEVICE_CLASS): vol.All(vol.Lower, cv.one_of(*DEVICE_CLASSES)),
|
||||||
vol.Optional(CONF_FILTERS): FILTERS_SCHEMA,
|
vol.Optional(CONF_FILTERS): FILTERS_SCHEMA,
|
||||||
|
@ -65,6 +168,12 @@ BINARY_SENSOR_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend({
|
||||||
vol.Optional(CONF_MIN_LENGTH, default='50ms'): cv.positive_time_period_milliseconds,
|
vol.Optional(CONF_MIN_LENGTH, default='50ms'): cv.positive_time_period_milliseconds,
|
||||||
vol.Optional(CONF_MAX_LENGTH, default='350ms'): cv.positive_time_period_milliseconds,
|
vol.Optional(CONF_MAX_LENGTH, default='350ms'): cv.positive_time_period_milliseconds,
|
||||||
}),
|
}),
|
||||||
|
vol.Optional(CONF_ON_MULTI_CLICK): automation.validate_automation({
|
||||||
|
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_variable_id(MultiClickTrigger),
|
||||||
|
vol.Required(CONF_TIMING): vol.All([parse_multi_click_timing_str],
|
||||||
|
validate_multi_click_timing),
|
||||||
|
vol.Optional(CONF_INVALID_COOLDOWN): cv.positive_time_period_milliseconds,
|
||||||
|
}),
|
||||||
|
|
||||||
vol.Optional(CONF_INVERTED): cv.invalid(
|
vol.Optional(CONF_INVERTED): cv.invalid(
|
||||||
"The inverted binary_sensor property has been replaced by the "
|
"The inverted binary_sensor property has been replaced by the "
|
||||||
|
@ -136,6 +245,22 @@ def setup_binary_sensor_core_(binary_sensor_var, mqtt_var, config):
|
||||||
trigger = Pvariable(conf[CONF_TRIGGER_ID], rhs)
|
trigger = Pvariable(conf[CONF_TRIGGER_ID], rhs)
|
||||||
automation.build_automation(trigger, NoArg, conf)
|
automation.build_automation(trigger, NoArg, conf)
|
||||||
|
|
||||||
|
for conf in config.get(CONF_ON_MULTI_CLICK, []):
|
||||||
|
timings = []
|
||||||
|
for tim in conf[CONF_TIMING]:
|
||||||
|
timings.append(StructInitializer(
|
||||||
|
MultiClickTriggerEvent,
|
||||||
|
('state', tim[CONF_STATE]),
|
||||||
|
('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:
|
||||||
|
add(trigger.set_invalid_cooldown(conf[CONF_INVALID_COOLDOWN]))
|
||||||
|
automation.build_automation(trigger, NoArg, conf)
|
||||||
|
|
||||||
setup_mqtt_component(mqtt_var, config)
|
setup_mqtt_component(mqtt_var, config)
|
||||||
|
|
||||||
|
|
||||||
|
@ -154,4 +279,14 @@ def register_binary_sensor(var, config):
|
||||||
add_job(setup_binary_sensor_core_, binary_sensor_var, mqtt_var, config)
|
add_job(setup_binary_sensor_core_, binary_sensor_var, mqtt_var, config)
|
||||||
|
|
||||||
|
|
||||||
|
def core_to_hass_config(data, config):
|
||||||
|
ret = mqtt.build_hass_config(data, 'binary_sensor', config,
|
||||||
|
include_state=True, include_command=False)
|
||||||
|
if ret is None:
|
||||||
|
return None
|
||||||
|
if CONF_DEVICE_CLASS in config:
|
||||||
|
ret['device_class'] = config[CONF_DEVICE_CLASS]
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_BINARY_SENSOR'
|
BUILD_FLAGS = '-DUSE_BINARY_SENSOR'
|
||||||
|
|
|
@ -1,15 +1,17 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml.components import binary_sensor
|
from esphomeyaml.components import binary_sensor
|
||||||
from esphomeyaml.components.esp32_ble_tracker import CONF_ESP32_BLE_ID, ESP32BLETracker, \
|
from esphomeyaml.components.esp32_ble_tracker import CONF_ESP32_BLE_ID, ESP32BLETracker, \
|
||||||
make_address_array
|
make_address_array
|
||||||
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.const import CONF_MAC_ADDRESS, CONF_NAME
|
from esphomeyaml.const import CONF_MAC_ADDRESS, CONF_NAME
|
||||||
from esphomeyaml.helpers import get_variable
|
from esphomeyaml.helpers import esphomelib_ns, get_variable
|
||||||
|
|
||||||
DEPENDENCIES = ['esp32_ble_tracker']
|
DEPENDENCIES = ['esp32_ble_tracker']
|
||||||
|
ESP32BLEPresenceDevice = esphomelib_ns.class_('ESP32BLEPresenceDevice', binary_sensor.BinarySensor)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(ESP32BLEPresenceDevice),
|
||||||
vol.Required(CONF_MAC_ADDRESS): cv.mac_address,
|
vol.Required(CONF_MAC_ADDRESS): cv.mac_address,
|
||||||
cv.GenerateID(CONF_ESP32_BLE_ID): cv.use_variable_id(ESP32BLETracker)
|
cv.GenerateID(CONF_ESP32_BLE_ID): cv.use_variable_id(ESP32BLETracker)
|
||||||
}))
|
}))
|
||||||
|
@ -21,3 +23,7 @@ def to_code(config):
|
||||||
yield
|
yield
|
||||||
rhs = hub.make_presence_sensor(config[CONF_NAME], make_address_array(config[CONF_MAC_ADDRESS]))
|
rhs = hub.make_presence_sensor(config[CONF_NAME], make_address_array(config[CONF_MAC_ADDRESS]))
|
||||||
binary_sensor.register_binary_sensor(rhs, config)
|
binary_sensor.register_binary_sensor(rhs, config)
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return binary_sensor.core_to_hass_config(data, config)
|
||||||
|
|
|
@ -34,7 +34,11 @@ def validate_touch_pad(value):
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
ESP32TouchBinarySensor = binary_sensor.binary_sensor_ns.class_('ESP32TouchBinarySensor',
|
||||||
|
binary_sensor.BinarySensor)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(ESP32TouchBinarySensor),
|
||||||
vol.Required(CONF_PIN): validate_touch_pad,
|
vol.Required(CONF_PIN): validate_touch_pad,
|
||||||
vol.Required(CONF_THRESHOLD): cv.uint16_t,
|
vol.Required(CONF_THRESHOLD): cv.uint16_t,
|
||||||
cv.GenerateID(CONF_ESP32_TOUCH_ID): cv.use_variable_id(ESP32TouchComponent),
|
cv.GenerateID(CONF_ESP32_TOUCH_ID): cv.use_variable_id(ESP32TouchComponent),
|
||||||
|
@ -51,3 +55,7 @@ def to_code(config):
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_ESP32_TOUCH_BINARY_SENSOR'
|
BUILD_FLAGS = '-DUSE_ESP32_TOUCH_BINARY_SENSOR'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return binary_sensor.core_to_hass_config(data, config)
|
||||||
|
|
|
@ -4,14 +4,19 @@ import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml import pins
|
from esphomeyaml import pins
|
||||||
from esphomeyaml.components import binary_sensor
|
from esphomeyaml.components import binary_sensor
|
||||||
from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_PIN
|
from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_PIN
|
||||||
from esphomeyaml.helpers import App, gpio_input_pin_expression, variable, Application
|
from esphomeyaml.helpers import App, gpio_input_pin_expression, variable, Application, \
|
||||||
|
setup_component, Component
|
||||||
|
|
||||||
MakeGPIOBinarySensor = Application.MakeGPIOBinarySensor
|
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({
|
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),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeGPIOBinarySensor),
|
||||||
vol.Required(CONF_PIN): pins.gpio_input_pin_schema
|
vol.Required(CONF_PIN): pins.gpio_input_pin_schema
|
||||||
}))
|
}).extend(cv.COMPONENT_SCHEMA.schema))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
@ -21,6 +26,11 @@ def to_code(config):
|
||||||
rhs = App.make_gpio_binary_sensor(config[CONF_NAME], pin)
|
rhs = App.make_gpio_binary_sensor(config[CONF_NAME], pin)
|
||||||
gpio = variable(config[CONF_MAKE_ID], rhs)
|
gpio = variable(config[CONF_MAKE_ID], rhs)
|
||||||
binary_sensor.setup_binary_sensor(gpio.Pgpio, gpio.Pmqtt, config)
|
binary_sensor.setup_binary_sensor(gpio.Pgpio, gpio.Pmqtt, config)
|
||||||
|
setup_component(gpio.Pgpio, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_GPIO_BINARY_SENSOR'
|
BUILD_FLAGS = '-DUSE_GPIO_BINARY_SENSOR'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return binary_sensor.core_to_hass_config(data, config)
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
from esphomeyaml.components import binary_sensor, display
|
||||||
from esphomeyaml.components import binary_sensor
|
|
||||||
from esphomeyaml.components.display.nextion import Nextion
|
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.const import CONF_COMPONENT_ID, CONF_NAME, CONF_PAGE_ID
|
||||||
from esphomeyaml.helpers import get_variable
|
from esphomeyaml.helpers import get_variable
|
||||||
|
|
||||||
|
@ -10,7 +10,11 @@ DEPENDENCIES = ['display']
|
||||||
|
|
||||||
CONF_NEXTION_ID = 'nextion_id'
|
CONF_NEXTION_ID = 'nextion_id'
|
||||||
|
|
||||||
|
NextionTouchComponent = display.display_ns.class_('NextionTouchComponent',
|
||||||
|
binary_sensor.BinarySensor)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(NextionTouchComponent),
|
||||||
vol.Required(CONF_PAGE_ID): cv.uint8_t,
|
vol.Required(CONF_PAGE_ID): cv.uint8_t,
|
||||||
vol.Required(CONF_COMPONENT_ID): cv.uint8_t,
|
vol.Required(CONF_COMPONENT_ID): cv.uint8_t,
|
||||||
cv.GenerateID(CONF_NEXTION_ID): cv.use_variable_id(Nextion)
|
cv.GenerateID(CONF_NEXTION_ID): cv.use_variable_id(Nextion)
|
||||||
|
@ -24,3 +28,7 @@ def to_code(config):
|
||||||
rhs = hub.make_touch_component(config[CONF_NAME], config[CONF_PAGE_ID],
|
rhs = hub.make_touch_component(config[CONF_NAME], config[CONF_PAGE_ID],
|
||||||
config[CONF_COMPONENT_ID])
|
config[CONF_COMPONENT_ID])
|
||||||
binary_sensor.register_binary_sensor(rhs, config)
|
binary_sensor.register_binary_sensor(rhs, config)
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return binary_sensor.core_to_hass_config(data, config)
|
||||||
|
|
|
@ -27,16 +27,23 @@ def validate_uid(value):
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
PN532BinarySensor = binary_sensor.binary_sensor_ns.class_('PN532BinarySensor',
|
||||||
|
binary_sensor.BinarySensor)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(PN532BinarySensor),
|
||||||
vol.Required(CONF_UID): validate_uid,
|
vol.Required(CONF_UID): validate_uid,
|
||||||
cv.GenerateID(CONF_PN532_ID): cv.use_variable_id(PN532Component)
|
cv.GenerateID(CONF_PN532_ID): cv.use_variable_id(PN532Component)
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
hub = None
|
|
||||||
for hub in get_variable(config[CONF_PN532_ID]):
|
for hub in get_variable(config[CONF_PN532_ID]):
|
||||||
yield
|
yield
|
||||||
addr = [HexInt(int(x, 16)) for x in config[CONF_UID].split('-')]
|
addr = [HexInt(int(x, 16)) for x in config[CONF_UID].split('-')]
|
||||||
rhs = hub.make_tag(config[CONF_NAME], ArrayInitializer(*addr, multiline=False))
|
rhs = hub.make_tag(config[CONF_NAME], ArrayInitializer(*addr, multiline=False))
|
||||||
binary_sensor.register_binary_sensor(rhs, config)
|
binary_sensor.register_binary_sensor(rhs, config)
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return binary_sensor.core_to_hass_config(data, config)
|
||||||
|
|
|
@ -9,15 +9,22 @@ DEPENDENCIES = ['rdm6300']
|
||||||
|
|
||||||
CONF_RDM6300_ID = 'rdm6300_id'
|
CONF_RDM6300_ID = 'rdm6300_id'
|
||||||
|
|
||||||
|
RDM6300BinarySensor = binary_sensor.binary_sensor_ns.class_('RDM6300BinarySensor',
|
||||||
|
binary_sensor.BinarySensor)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(RDM6300BinarySensor),
|
||||||
vol.Required(CONF_UID): cv.uint32_t,
|
vol.Required(CONF_UID): cv.uint32_t,
|
||||||
cv.GenerateID(CONF_RDM6300_ID): cv.use_variable_id(rdm6300.RDM6300Component)
|
cv.GenerateID(CONF_RDM6300_ID): cv.use_variable_id(rdm6300.RDM6300Component)
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
hub = None
|
|
||||||
for hub in get_variable(config[CONF_RDM6300_ID]):
|
for hub in get_variable(config[CONF_RDM6300_ID]):
|
||||||
yield
|
yield
|
||||||
rhs = hub.make_card(config[CONF_NAME], config[CONF_UID])
|
rhs = hub.make_card(config[CONF_NAME], config[CONF_UID])
|
||||||
binary_sensor.register_binary_sensor(rhs, config)
|
binary_sensor.register_binary_sensor(rhs, config)
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return binary_sensor.core_to_hass_config(data, config)
|
||||||
|
|
|
@ -22,20 +22,21 @@ REMOTE_KEYS = [CONF_NEC, CONF_LG, CONF_SONY, CONF_PANASONIC, CONF_SAMSUNG, CONF_
|
||||||
CONF_REMOTE_RECEIVER_ID = 'remote_receiver_id'
|
CONF_REMOTE_RECEIVER_ID = 'remote_receiver_id'
|
||||||
CONF_RECEIVER_ID = 'receiver_id'
|
CONF_RECEIVER_ID = 'receiver_id'
|
||||||
|
|
||||||
RemoteReceiver = remote_ns.RemoteReceiver
|
RemoteReceiver = remote_ns.class_('RemoteReceiver', binary_sensor.BinarySensor)
|
||||||
LGReceiver = remote_ns.LGReceiver
|
LGReceiver = remote_ns.class_('LGReceiver', RemoteReceiver)
|
||||||
NECReceiver = remote_ns.NECReceiver
|
NECReceiver = remote_ns.class_('NECReceiver', RemoteReceiver)
|
||||||
PanasonicReceiver = remote_ns.PanasonicReceiver
|
PanasonicReceiver = remote_ns.class_('PanasonicReceiver', RemoteReceiver)
|
||||||
RawReceiver = remote_ns.RawReceiver
|
RawReceiver = remote_ns.class_('RawReceiver', RemoteReceiver)
|
||||||
SamsungReceiver = remote_ns.SamsungReceiver
|
SamsungReceiver = remote_ns.class_('SamsungReceiver', RemoteReceiver)
|
||||||
SonyReceiver = remote_ns.SonyReceiver
|
SonyReceiver = remote_ns.class_('SonyReceiver', RemoteReceiver)
|
||||||
RCSwitchRawReceiver = remote_ns.RCSwitchRawReceiver
|
RCSwitchRawReceiver = remote_ns.class_('RCSwitchRawReceiver', RemoteReceiver)
|
||||||
RCSwitchTypeAReceiver = remote_ns.RCSwitchTypeAReceiver
|
RCSwitchTypeAReceiver = remote_ns.class_('RCSwitchTypeAReceiver', RCSwitchRawReceiver)
|
||||||
RCSwitchTypeBReceiver = remote_ns.RCSwitchTypeBReceiver
|
RCSwitchTypeBReceiver = remote_ns.class_('RCSwitchTypeBReceiver', RCSwitchRawReceiver)
|
||||||
RCSwitchTypeCReceiver = remote_ns.RCSwitchTypeCReceiver
|
RCSwitchTypeCReceiver = remote_ns.class_('RCSwitchTypeCReceiver', RCSwitchRawReceiver)
|
||||||
RCSwitchTypeDReceiver = remote_ns.RCSwitchTypeDReceiver
|
RCSwitchTypeDReceiver = remote_ns.class_('RCSwitchTypeDReceiver', RCSwitchRawReceiver)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(RemoteReceiver),
|
||||||
vol.Optional(CONF_LG): vol.Schema({
|
vol.Optional(CONF_LG): vol.Schema({
|
||||||
vol.Required(CONF_DATA): cv.hex_uint32_t,
|
vol.Required(CONF_DATA): cv.hex_uint32_t,
|
||||||
vol.Optional(CONF_NBITS, default=28): vol.All(vol.Coerce(int), cv.one_of(28, 32)),
|
vol.Optional(CONF_NBITS, default=28): vol.All(vol.Coerce(int), cv.one_of(28, 32)),
|
||||||
|
@ -109,7 +110,6 @@ def receiver_base(full_config):
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
remote = None
|
|
||||||
for remote in get_variable(config[CONF_REMOTE_RECEIVER_ID]):
|
for remote in get_variable(config[CONF_REMOTE_RECEIVER_ID]):
|
||||||
yield
|
yield
|
||||||
rhs = receiver_base(config)
|
rhs = receiver_base(config)
|
||||||
|
@ -119,3 +119,7 @@ def to_code(config):
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_REMOTE_RECEIVER'
|
BUILD_FLAGS = '-DUSE_REMOTE_RECEIVER'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return binary_sensor.core_to_hass_config(data, config)
|
||||||
|
|
|
@ -1,21 +1,30 @@
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import binary_sensor
|
from esphomeyaml.components import binary_sensor
|
||||||
from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME
|
from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME
|
||||||
from esphomeyaml.helpers import App, Application, variable
|
from esphomeyaml.helpers import App, Application, variable, setup_component, Component
|
||||||
|
|
||||||
DEPENDENCIES = ['mqtt']
|
DEPENDENCIES = ['mqtt']
|
||||||
|
|
||||||
MakeStatusBinarySensor = Application.MakeStatusBinarySensor
|
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({
|
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeStatusBinarySensor),
|
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):
|
def to_code(config):
|
||||||
rhs = App.make_status_binary_sensor(config[CONF_NAME])
|
rhs = App.make_status_binary_sensor(config[CONF_NAME])
|
||||||
status = variable(config[CONF_MAKE_ID], rhs)
|
status = variable(config[CONF_MAKE_ID], rhs)
|
||||||
binary_sensor.setup_binary_sensor(status.Pstatus, status.Pmqtt, config)
|
binary_sensor.setup_binary_sensor(status.Pstatus, status.Pmqtt, config)
|
||||||
|
setup_component(status.Pstatus, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_STATUS_BINARY_SENSOR'
|
BUILD_FLAGS = '-DUSE_STATUS_BINARY_SENSOR'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return binary_sensor.core_to_hass_config(data, config)
|
||||||
|
|
|
@ -1,22 +1,28 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml.components import binary_sensor
|
from esphomeyaml.components import binary_sensor
|
||||||
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.const import CONF_LAMBDA, CONF_MAKE_ID, CONF_NAME
|
from esphomeyaml.const import CONF_LAMBDA, CONF_MAKE_ID, CONF_NAME
|
||||||
from esphomeyaml.helpers import App, Application, process_lambda, variable, optional, bool_, add
|
from esphomeyaml.helpers import App, Application, add, bool_, optional, process_lambda, variable, \
|
||||||
|
setup_component, Component
|
||||||
|
|
||||||
MakeTemplateBinarySensor = Application.MakeTemplateBinarySensor
|
MakeTemplateBinarySensor = Application.struct('MakeTemplateBinarySensor')
|
||||||
|
TemplateBinarySensor = binary_sensor.binary_sensor_ns.class_('TemplateBinarySensor',
|
||||||
|
binary_sensor.BinarySensor,
|
||||||
|
Component)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(TemplateBinarySensor),
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeTemplateBinarySensor),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeTemplateBinarySensor),
|
||||||
vol.Required(CONF_LAMBDA): cv.lambda_,
|
vol.Required(CONF_LAMBDA): cv.lambda_,
|
||||||
}))
|
}).extend(cv.COMPONENT_SCHEMA.schema))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
rhs = App.make_template_binary_sensor(config[CONF_NAME])
|
rhs = App.make_template_binary_sensor(config[CONF_NAME])
|
||||||
make = variable(config[CONF_MAKE_ID], rhs)
|
make = variable(config[CONF_MAKE_ID], rhs)
|
||||||
binary_sensor.setup_binary_sensor(make.Ptemplate_, make.Pmqtt, config)
|
binary_sensor.setup_binary_sensor(make.Ptemplate_, make.Pmqtt, config)
|
||||||
|
setup_component(make.Ptemplate_, config)
|
||||||
|
|
||||||
template_ = None
|
template_ = None
|
||||||
for template_ in process_lambda(config[CONF_LAMBDA], [],
|
for template_ in process_lambda(config[CONF_LAMBDA], [],
|
||||||
|
@ -26,3 +32,7 @@ def to_code(config):
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_TEMPLATE_BINARY_SENSOR'
|
BUILD_FLAGS = '-DUSE_TEMPLATE_BINARY_SENSOR'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return binary_sensor.core_to_hass_config(data, config)
|
||||||
|
|
|
@ -1,24 +1,29 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY
|
from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY
|
||||||
|
from esphomeyaml.components import mqtt
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.const import CONF_ID, CONF_MQTT_ID, CONF_INTERNAL
|
from esphomeyaml.const import CONF_ID, CONF_MQTT_ID, CONF_INTERNAL
|
||||||
from esphomeyaml.helpers import Pvariable, esphomelib_ns, setup_mqtt_component, add, \
|
from esphomeyaml.helpers import Pvariable, esphomelib_ns, setup_mqtt_component, add, \
|
||||||
TemplateArguments, get_variable
|
TemplateArguments, get_variable, Action, Nameable
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
cover_ns = esphomelib_ns.namespace('cover')
|
cover_ns = esphomelib_ns.namespace('cover')
|
||||||
Cover = cover_ns.Cover
|
|
||||||
MQTTCoverComponent = cover_ns.MQTTCoverComponent
|
Cover = cover_ns.class_('Cover', Nameable)
|
||||||
CoverState = cover_ns.CoverState
|
MQTTCoverComponent = cover_ns.class_('MQTTCoverComponent', mqtt.MQTTComponent)
|
||||||
|
|
||||||
|
CoverState = cover_ns.class_('CoverState')
|
||||||
COVER_OPEN = cover_ns.COVER_OPEN
|
COVER_OPEN = cover_ns.COVER_OPEN
|
||||||
COVER_CLOSED = cover_ns.COVER_CLOSED
|
COVER_CLOSED = cover_ns.COVER_CLOSED
|
||||||
OpenAction = cover_ns.OpenAction
|
|
||||||
CloseAction = cover_ns.CloseAction
|
# Actions
|
||||||
StopAction = cover_ns.StopAction
|
OpenAction = cover_ns.class_('OpenAction', Action)
|
||||||
|
CloseAction = cover_ns.class_('CloseAction', Action)
|
||||||
|
StopAction = cover_ns.class_('StopAction', Action)
|
||||||
|
|
||||||
COVER_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend({
|
COVER_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend({
|
||||||
cv.GenerateID(): cv.declare_variable_id(Cover),
|
cv.GenerateID(): cv.declare_variable_id(Cover),
|
||||||
|
@ -44,7 +49,7 @@ BUILD_FLAGS = '-DUSE_COVER'
|
||||||
|
|
||||||
CONF_COVER_OPEN = 'cover.open'
|
CONF_COVER_OPEN = 'cover.open'
|
||||||
COVER_OPEN_ACTION_SCHEMA = maybe_simple_id({
|
COVER_OPEN_ACTION_SCHEMA = maybe_simple_id({
|
||||||
vol.Required(CONF_ID): cv.use_variable_id(None),
|
vol.Required(CONF_ID): cv.use_variable_id(Cover),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@ -60,7 +65,7 @@ def cover_open_to_code(config, action_id, arg_type):
|
||||||
|
|
||||||
CONF_COVER_CLOSE = 'cover.close'
|
CONF_COVER_CLOSE = 'cover.close'
|
||||||
COVER_CLOSE_ACTION_SCHEMA = maybe_simple_id({
|
COVER_CLOSE_ACTION_SCHEMA = maybe_simple_id({
|
||||||
vol.Required(CONF_ID): cv.use_variable_id(None),
|
vol.Required(CONF_ID): cv.use_variable_id(Cover),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@ -76,7 +81,7 @@ def cover_close_to_code(config, action_id, arg_type):
|
||||||
|
|
||||||
CONF_COVER_STOP = 'cover.stop'
|
CONF_COVER_STOP = 'cover.stop'
|
||||||
COVER_STOP_ACTION_SCHEMA = maybe_simple_id({
|
COVER_STOP_ACTION_SCHEMA = maybe_simple_id({
|
||||||
vol.Required(CONF_ID): cv.use_variable_id(None),
|
vol.Required(CONF_ID): cv.use_variable_id(Cover),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@ -88,3 +93,10 @@ def cover_stop_to_code(config, action_id, arg_type):
|
||||||
rhs = var.make_stop_action(template_arg)
|
rhs = var.make_stop_action(template_arg)
|
||||||
type = StopAction.template(arg_type)
|
type = StopAction.template(arg_type)
|
||||||
yield Pvariable(action_id, rhs, type=type)
|
yield Pvariable(action_id, rhs, type=type)
|
||||||
|
|
||||||
|
|
||||||
|
def core_to_hass_config(data, config):
|
||||||
|
ret = mqtt.build_hass_config(data, 'cover', config, include_state=True, include_command=True)
|
||||||
|
if ret is None:
|
||||||
|
return None
|
||||||
|
return ret
|
||||||
|
|
|
@ -5,18 +5,21 @@ from esphomeyaml import automation
|
||||||
from esphomeyaml.components import cover
|
from esphomeyaml.components import cover
|
||||||
from esphomeyaml.const import CONF_CLOSE_ACTION, CONF_LAMBDA, CONF_MAKE_ID, CONF_NAME, \
|
from esphomeyaml.const import CONF_CLOSE_ACTION, CONF_LAMBDA, CONF_MAKE_ID, CONF_NAME, \
|
||||||
CONF_OPEN_ACTION, CONF_STOP_ACTION, CONF_OPTIMISTIC
|
CONF_OPEN_ACTION, CONF_STOP_ACTION, CONF_OPTIMISTIC
|
||||||
from esphomeyaml.helpers import App, Application, NoArg, add, process_lambda, variable, optional
|
from esphomeyaml.helpers import App, Application, NoArg, add, process_lambda, variable, optional, \
|
||||||
|
setup_component
|
||||||
|
|
||||||
MakeTemplateCover = Application.MakeTemplateCover
|
MakeTemplateCover = Application.struct('MakeTemplateCover')
|
||||||
|
TemplateCover = cover.cover_ns.class_('TemplateCover', cover.Cover)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(cover.COVER_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(cover.COVER_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeTemplateCover),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeTemplateCover),
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(TemplateCover),
|
||||||
vol.Optional(CONF_LAMBDA): cv.lambda_,
|
vol.Optional(CONF_LAMBDA): cv.lambda_,
|
||||||
vol.Optional(CONF_OPTIMISTIC): cv.boolean,
|
vol.Optional(CONF_OPTIMISTIC): cv.boolean,
|
||||||
vol.Optional(CONF_OPEN_ACTION): automation.validate_automation(single=True),
|
vol.Optional(CONF_OPEN_ACTION): automation.validate_automation(single=True),
|
||||||
vol.Optional(CONF_CLOSE_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),
|
vol.Optional(CONF_STOP_ACTION): automation.validate_automation(single=True),
|
||||||
}), cv.has_at_least_one_key(CONF_LAMBDA, CONF_OPTIMISTIC))
|
}).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_least_one_key(CONF_LAMBDA, CONF_OPTIMISTIC))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
@ -24,9 +27,9 @@ def to_code(config):
|
||||||
make = variable(config[CONF_MAKE_ID], rhs)
|
make = variable(config[CONF_MAKE_ID], rhs)
|
||||||
|
|
||||||
cover.setup_cover(make.Ptemplate_, make.Pmqtt, config)
|
cover.setup_cover(make.Ptemplate_, make.Pmqtt, config)
|
||||||
|
setup_component(make.Ptemplate_, config)
|
||||||
|
|
||||||
if CONF_LAMBDA in config:
|
if CONF_LAMBDA in config:
|
||||||
template_ = None
|
|
||||||
for template_ in process_lambda(config[CONF_LAMBDA], [],
|
for template_ in process_lambda(config[CONF_LAMBDA], [],
|
||||||
return_type=optional.template(cover.CoverState)):
|
return_type=optional.template(cover.CoverState)):
|
||||||
yield
|
yield
|
||||||
|
@ -45,3 +48,12 @@ def to_code(config):
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_TEMPLATE_COVER'
|
BUILD_FLAGS = '-DUSE_TEMPLATE_COVER'
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
@ -4,21 +4,22 @@ import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml import pins
|
from esphomeyaml import pins
|
||||||
from esphomeyaml.components import sensor
|
from esphomeyaml.components import sensor
|
||||||
from esphomeyaml.const import CONF_ID, CONF_PIN, CONF_UPDATE_INTERVAL
|
from esphomeyaml.const import CONF_ID, CONF_PIN, CONF_UPDATE_INTERVAL
|
||||||
from esphomeyaml.helpers import App, Pvariable
|
from esphomeyaml.helpers import App, Pvariable, setup_component, PollingComponent
|
||||||
|
|
||||||
DallasComponent = sensor.sensor_ns.DallasComponent
|
DallasComponent = sensor.sensor_ns.class_('DallasComponent', PollingComponent)
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.All(cv.ensure_list, [vol.Schema({
|
CONFIG_SCHEMA = vol.All(cv.ensure_list, [vol.Schema({
|
||||||
cv.GenerateID(): cv.declare_variable_id(DallasComponent),
|
cv.GenerateID(): cv.declare_variable_id(DallasComponent),
|
||||||
vol.Required(CONF_PIN): pins.input_output_pin,
|
vol.Required(CONF_PIN): pins.input_output_pin,
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
||||||
})])
|
}).extend(cv.COMPONENT_SCHEMA.schema)])
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
for conf in config:
|
for conf in config:
|
||||||
rhs = App.make_dallas_component(conf[CONF_PIN], conf.get(CONF_UPDATE_INTERVAL))
|
rhs = App.make_dallas_component(conf[CONF_PIN], conf.get(CONF_UPDATE_INTERVAL))
|
||||||
Pvariable(conf[CONF_ID], rhs)
|
var = Pvariable(conf[CONF_ID], rhs)
|
||||||
|
setup_component(var, conf)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_DALLAS_SENSOR'
|
BUILD_FLAGS = '-DUSE_DALLAS_SENSOR'
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from esphomeyaml import config_validation as cv, pins
|
from esphomeyaml import config_validation as cv, pins
|
||||||
from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY
|
from esphomeyaml.automation import ACTION_REGISTRY, maybe_simple_id
|
||||||
from esphomeyaml.const import CONF_ID, CONF_NUMBER, CONF_RUN_CYCLES, CONF_RUN_DURATION, \
|
from esphomeyaml.const import CONF_ID, CONF_NUMBER, CONF_RUN_CYCLES, CONF_RUN_DURATION, \
|
||||||
CONF_SLEEP_DURATION, CONF_WAKEUP_PIN
|
CONF_SLEEP_DURATION, CONF_WAKEUP_PIN, CONF_MODE, CONF_PINS
|
||||||
from esphomeyaml.helpers import App, Pvariable, add, gpio_input_pin_expression, esphomelib_ns, \
|
from esphomeyaml.helpers import Action, App, Component, Pvariable, TemplateArguments, add, \
|
||||||
TemplateArguments, get_variable
|
esphomelib_ns, get_variable, gpio_input_pin_expression, setup_component, global_ns, \
|
||||||
|
StructInitializer
|
||||||
|
|
||||||
|
|
||||||
def validate_pin_number(value):
|
def validate_pin_number(value):
|
||||||
|
@ -16,17 +17,26 @@ def validate_pin_number(value):
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
DeepSleepComponent = esphomelib_ns.DeepSleepComponent
|
DeepSleepComponent = esphomelib_ns.class_('DeepSleepComponent', Component)
|
||||||
EnterDeepSleepAction = esphomelib_ns.EnterDeepSleepAction
|
EnterDeepSleepAction = esphomelib_ns.class_('EnterDeepSleepAction', Action)
|
||||||
PreventDeepSleepAction = esphomelib_ns.PreventDeepSleepAction
|
PreventDeepSleepAction = esphomelib_ns.class_('PreventDeepSleepAction', Action)
|
||||||
|
|
||||||
|
WakeupPinMode = esphomelib_ns.enum('WakeupPinMode')
|
||||||
WAKEUP_PIN_MODES = {
|
WAKEUP_PIN_MODES = {
|
||||||
'IGNORE': esphomelib_ns.WAKEUP_PIN_MODE_IGNORE,
|
'IGNORE': WakeupPinMode.WAKEUP_PIN_MODE_IGNORE,
|
||||||
'KEEP_AWAKE': esphomelib_ns.WAKEUP_PIN_MODE_KEEP_AWAKE,
|
'KEEP_AWAKE': WakeupPinMode.WAKEUP_PIN_MODE_KEEP_AWAKE,
|
||||||
'INVERT_WAKEUP': esphomelib_ns.WAKEUP_PIN_MODE_INVERT_WAKEUP,
|
'INVERT_WAKEUP': WakeupPinMode.WAKEUP_PIN_MODE_INVERT_WAKEUP,
|
||||||
|
}
|
||||||
|
|
||||||
|
esp_sleep_ext1_wakeup_mode_t = global_ns.enum('esp_sleep_ext1_wakeup_mode_t')
|
||||||
|
Ext1Wakeup = esphomelib_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,
|
||||||
}
|
}
|
||||||
|
|
||||||
CONF_WAKEUP_PIN_MODE = 'wakeup_pin_mode'
|
CONF_WAKEUP_PIN_MODE = 'wakeup_pin_mode'
|
||||||
|
CONF_ESP32_EXT1_WAKEUP = 'esp32_ext1_wakeup'
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.Schema({
|
CONFIG_SCHEMA = vol.Schema({
|
||||||
cv.GenerateID(): cv.declare_variable_id(DeepSleepComponent),
|
cv.GenerateID(): cv.declare_variable_id(DeepSleepComponent),
|
||||||
|
@ -35,9 +45,14 @@ CONFIG_SCHEMA = vol.Schema({
|
||||||
validate_pin_number),
|
validate_pin_number),
|
||||||
vol.Optional(CONF_WAKEUP_PIN_MODE): vol.All(cv.only_on_esp32, vol.Upper,
|
vol.Optional(CONF_WAKEUP_PIN_MODE): vol.All(cv.only_on_esp32, vol.Upper,
|
||||||
cv.one_of(*WAKEUP_PIN_MODES)),
|
cv.one_of(*WAKEUP_PIN_MODES)),
|
||||||
|
vol.Optional(CONF_ESP32_EXT1_WAKEUP): vol.All(cv.only_on_esp32, vol.Schema({
|
||||||
|
vol.Required(CONF_PINS): vol.All(cv.ensure_list, [pins.shorthand_input_pin],
|
||||||
|
[validate_pin_number]),
|
||||||
|
vol.Required(CONF_MODE): vol.All(vol.Upper, cv.one_of(*EXT1_WAKEUP_MODES)),
|
||||||
|
})),
|
||||||
vol.Optional(CONF_RUN_CYCLES): cv.positive_int,
|
vol.Optional(CONF_RUN_CYCLES): cv.positive_int,
|
||||||
vol.Optional(CONF_RUN_DURATION): cv.positive_time_period_milliseconds,
|
vol.Optional(CONF_RUN_DURATION): cv.positive_time_period_milliseconds,
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
@ -46,7 +61,6 @@ def to_code(config):
|
||||||
if CONF_SLEEP_DURATION in config:
|
if CONF_SLEEP_DURATION in config:
|
||||||
add(deep_sleep.set_sleep_duration(config[CONF_SLEEP_DURATION]))
|
add(deep_sleep.set_sleep_duration(config[CONF_SLEEP_DURATION]))
|
||||||
if CONF_WAKEUP_PIN in config:
|
if CONF_WAKEUP_PIN in config:
|
||||||
pin = None
|
|
||||||
for pin in gpio_input_pin_expression(config[CONF_WAKEUP_PIN]):
|
for pin in gpio_input_pin_expression(config[CONF_WAKEUP_PIN]):
|
||||||
yield
|
yield
|
||||||
add(deep_sleep.set_wakeup_pin(pin))
|
add(deep_sleep.set_wakeup_pin(pin))
|
||||||
|
@ -57,10 +71,23 @@ def to_code(config):
|
||||||
if CONF_RUN_DURATION in config:
|
if CONF_RUN_DURATION in config:
|
||||||
add(deep_sleep.set_run_duration(config[CONF_RUN_DURATION]))
|
add(deep_sleep.set_run_duration(config[CONF_RUN_DURATION]))
|
||||||
|
|
||||||
|
if CONF_ESP32_EXT1_WAKEUP in config:
|
||||||
|
conf = config[CONF_ESP32_EXT1_WAKEUP]
|
||||||
|
mask = 0
|
||||||
|
for pin in conf[CONF_PINS]:
|
||||||
|
mask |= 1 << pin[CONF_NUMBER]
|
||||||
|
struct = StructInitializer(
|
||||||
|
Ext1Wakeup,
|
||||||
|
('mask', mask),
|
||||||
|
('wakeup_mode', EXT1_WAKEUP_MODES[conf[CONF_MODE]])
|
||||||
|
)
|
||||||
|
add(deep_sleep.set_ext1_wakeup(struct))
|
||||||
|
|
||||||
|
setup_component(deep_sleep, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_DEEP_SLEEP'
|
BUILD_FLAGS = '-DUSE_DEEP_SLEEP'
|
||||||
|
|
||||||
|
|
||||||
CONF_DEEP_SLEEP_ENTER = 'deep_sleep.enter'
|
CONF_DEEP_SLEEP_ENTER = 'deep_sleep.enter'
|
||||||
DEEP_SLEEP_ENTER_ACTION_SCHEMA = maybe_simple_id({
|
DEEP_SLEEP_ENTER_ACTION_SCHEMA = maybe_simple_id({
|
||||||
vol.Required(CONF_ID): cv.use_variable_id(DeepSleepComponent),
|
vol.Required(CONF_ID): cv.use_variable_id(DeepSleepComponent),
|
||||||
|
|
|
@ -10,7 +10,7 @@ PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
|
||||||
})
|
})
|
||||||
|
|
||||||
display_ns = esphomelib_ns.namespace('display')
|
display_ns = esphomelib_ns.namespace('display')
|
||||||
DisplayBuffer = display_ns.DisplayBuffer
|
DisplayBuffer = display_ns.class_('DisplayBuffer')
|
||||||
DisplayBufferRef = DisplayBuffer.operator('ref')
|
DisplayBufferRef = DisplayBuffer.operator('ref')
|
||||||
|
|
||||||
DISPLAY_ROTATIONS = {
|
DISPLAY_ROTATIONS = {
|
||||||
|
|
|
@ -5,11 +5,12 @@ from esphomeyaml import pins
|
||||||
from esphomeyaml.components import display
|
from esphomeyaml.components import display
|
||||||
from esphomeyaml.const import CONF_DATA_PINS, CONF_DIMENSIONS, CONF_ENABLE_PIN, CONF_ID, \
|
from esphomeyaml.const import CONF_DATA_PINS, CONF_DIMENSIONS, CONF_ENABLE_PIN, CONF_ID, \
|
||||||
CONF_LAMBDA, CONF_RS_PIN, CONF_RW_PIN
|
CONF_LAMBDA, CONF_RS_PIN, CONF_RW_PIN
|
||||||
from esphomeyaml.helpers import App, Pvariable, add, gpio_output_pin_expression, process_lambda
|
from esphomeyaml.helpers import App, Pvariable, add, gpio_output_pin_expression, process_lambda, \
|
||||||
|
setup_component, PollingComponent
|
||||||
|
|
||||||
GPIOLCDDisplay = display.display_ns.GPIOLCDDisplay
|
LCDDisplay = display.display_ns.class_('LCDDisplay', PollingComponent)
|
||||||
LCDDisplay = display.display_ns.LCDDisplay
|
|
||||||
LCDDisplayRef = LCDDisplay.operator('ref')
|
LCDDisplayRef = LCDDisplay.operator('ref')
|
||||||
|
GPIOLCDDisplay = display.display_ns.class_('GPIOLCDDisplay', LCDDisplay)
|
||||||
|
|
||||||
|
|
||||||
def validate_lcd_dimensions(value):
|
def validate_lcd_dimensions(value):
|
||||||
|
@ -36,7 +37,7 @@ PLATFORM_SCHEMA = display.BASIC_DISPLAY_PLATFORM_SCHEMA.extend({
|
||||||
vol.Required(CONF_ENABLE_PIN): pins.gpio_output_pin_schema,
|
vol.Required(CONF_ENABLE_PIN): pins.gpio_output_pin_schema,
|
||||||
vol.Required(CONF_RS_PIN): pins.gpio_output_pin_schema,
|
vol.Required(CONF_RS_PIN): pins.gpio_output_pin_schema,
|
||||||
vol.Optional(CONF_RW_PIN): pins.gpio_output_pin_schema,
|
vol.Optional(CONF_RW_PIN): pins.gpio_output_pin_schema,
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
@ -67,6 +68,7 @@ def to_code(config):
|
||||||
add(lcd.set_writer(lambda_))
|
add(lcd.set_writer(lambda_))
|
||||||
|
|
||||||
display.setup_display(lcd, config)
|
display.setup_display(lcd, config)
|
||||||
|
setup_component(lcd, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_LCD_DISPLAY'
|
BUILD_FLAGS = '-DUSE_LCD_DISPLAY'
|
||||||
|
|
|
@ -1,20 +1,21 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import display
|
from esphomeyaml.components import display, i2c
|
||||||
from esphomeyaml.components.display.lcd_gpio import LCDDisplayRef, validate_lcd_dimensions
|
from esphomeyaml.components.display.lcd_gpio import LCDDisplayRef, validate_lcd_dimensions, \
|
||||||
|
LCDDisplay
|
||||||
from esphomeyaml.const import CONF_ADDRESS, CONF_DIMENSIONS, CONF_ID, CONF_LAMBDA
|
from esphomeyaml.const import CONF_ADDRESS, CONF_DIMENSIONS, CONF_ID, CONF_LAMBDA
|
||||||
from esphomeyaml.helpers import App, Pvariable, add, process_lambda
|
from esphomeyaml.helpers import App, Pvariable, add, process_lambda, setup_component
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ['i2c']
|
||||||
|
|
||||||
PCF8574LCDDisplay = display.display_ns.PCF8574LCDDisplay
|
PCF8574LCDDisplay = display.display_ns.class_('PCF8574LCDDisplay', LCDDisplay, i2c.I2CDevice)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = display.BASIC_DISPLAY_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = display.BASIC_DISPLAY_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(): cv.declare_variable_id(PCF8574LCDDisplay),
|
cv.GenerateID(): cv.declare_variable_id(PCF8574LCDDisplay),
|
||||||
vol.Required(CONF_DIMENSIONS): validate_lcd_dimensions,
|
vol.Required(CONF_DIMENSIONS): validate_lcd_dimensions,
|
||||||
vol.Optional(CONF_ADDRESS): cv.i2c_address,
|
vol.Optional(CONF_ADDRESS): cv.i2c_address,
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
@ -30,6 +31,7 @@ def to_code(config):
|
||||||
add(lcd.set_writer(lambda_))
|
add(lcd.set_writer(lambda_))
|
||||||
|
|
||||||
display.setup_display(lcd, config)
|
display.setup_display(lcd, config)
|
||||||
|
setup_component(lcd, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = ['-DUSE_LCD_DISPLAY', '-DUSE_LCD_DISPLAY_PCF8574']
|
BUILD_FLAGS = ['-DUSE_LCD_DISPLAY', '-DUSE_LCD_DISPLAY_PCF8574']
|
||||||
|
|
|
@ -2,16 +2,16 @@ import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml import pins
|
from esphomeyaml import pins
|
||||||
from esphomeyaml.components import display
|
from esphomeyaml.components import display, spi
|
||||||
from esphomeyaml.components.spi import SPIComponent
|
from esphomeyaml.components.spi import SPIComponent
|
||||||
from esphomeyaml.const import CONF_CS_PIN, CONF_ID, CONF_INTENSITY, CONF_LAMBDA, CONF_NUM_CHIPS, \
|
from esphomeyaml.const import CONF_CS_PIN, CONF_ID, CONF_INTENSITY, CONF_LAMBDA, CONF_NUM_CHIPS, \
|
||||||
CONF_SPI_ID
|
CONF_SPI_ID
|
||||||
from esphomeyaml.helpers import App, Pvariable, add, get_variable, gpio_output_pin_expression, \
|
from esphomeyaml.helpers import App, Pvariable, add, get_variable, gpio_output_pin_expression, \
|
||||||
process_lambda
|
process_lambda, setup_component, PollingComponent
|
||||||
|
|
||||||
DEPENDENCIES = ['spi']
|
DEPENDENCIES = ['spi']
|
||||||
|
|
||||||
MAX7219Component = display.display_ns.MAX7219Component
|
MAX7219Component = display.display_ns.class_('MAX7219Component', PollingComponent, spi.SPIDevice)
|
||||||
MAX7219ComponentRef = MAX7219Component.operator('ref')
|
MAX7219ComponentRef = MAX7219Component.operator('ref')
|
||||||
|
|
||||||
PLATFORM_SCHEMA = display.BASIC_DISPLAY_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = display.BASIC_DISPLAY_PLATFORM_SCHEMA.extend({
|
||||||
|
@ -21,15 +21,15 @@ PLATFORM_SCHEMA = display.BASIC_DISPLAY_PLATFORM_SCHEMA.extend({
|
||||||
|
|
||||||
vol.Optional(CONF_NUM_CHIPS): vol.All(cv.uint8_t, vol.Range(min=1)),
|
vol.Optional(CONF_NUM_CHIPS): vol.All(cv.uint8_t, vol.Range(min=1)),
|
||||||
vol.Optional(CONF_INTENSITY): vol.All(cv.uint8_t, vol.Range(min=0, max=15)),
|
vol.Optional(CONF_INTENSITY): vol.All(cv.uint8_t, vol.Range(min=0, max=15)),
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
for spi in get_variable(config[CONF_SPI_ID]):
|
for spi_ in get_variable(config[CONF_SPI_ID]):
|
||||||
yield
|
yield
|
||||||
for cs in gpio_output_pin_expression(config[CONF_CS_PIN]):
|
for cs in gpio_output_pin_expression(config[CONF_CS_PIN]):
|
||||||
yield
|
yield
|
||||||
rhs = App.make_max7219(spi, cs)
|
rhs = App.make_max7219(spi_, cs)
|
||||||
max7219 = Pvariable(config[CONF_ID], rhs)
|
max7219 = Pvariable(config[CONF_ID], rhs)
|
||||||
|
|
||||||
if CONF_NUM_CHIPS in config:
|
if CONF_NUM_CHIPS in config:
|
||||||
|
@ -43,6 +43,7 @@ def to_code(config):
|
||||||
add(max7219.set_writer(lambda_))
|
add(max7219.set_writer(lambda_))
|
||||||
|
|
||||||
display.setup_display(max7219, config)
|
display.setup_display(max7219, config)
|
||||||
|
setup_component(max7219, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_MAX7219'
|
BUILD_FLAGS = '-DUSE_MAX7219'
|
||||||
|
|
|
@ -1,24 +1,26 @@
|
||||||
import esphomeyaml.config_validation as cv
|
from esphomeyaml.components import display, uart
|
||||||
from esphomeyaml.components import display
|
|
||||||
from esphomeyaml.components.uart import UARTComponent
|
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.const import CONF_ID, CONF_LAMBDA, CONF_UART_ID
|
||||||
from esphomeyaml.helpers import App, Pvariable, add, get_variable, process_lambda
|
from esphomeyaml.helpers import App, PollingComponent, Pvariable, add, get_variable, \
|
||||||
|
process_lambda, \
|
||||||
|
setup_component
|
||||||
|
|
||||||
DEPENDENCIES = ['uart']
|
DEPENDENCIES = ['uart']
|
||||||
|
|
||||||
Nextion = display.display_ns.Nextion
|
Nextion = display.display_ns.class_('Nextion', PollingComponent, uart.UARTDevice)
|
||||||
NextionRef = Nextion.operator('ref')
|
NextionRef = Nextion.operator('ref')
|
||||||
|
|
||||||
PLATFORM_SCHEMA = display.BASIC_DISPLAY_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = display.BASIC_DISPLAY_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(): cv.declare_variable_id(Nextion),
|
cv.GenerateID(): cv.declare_variable_id(Nextion),
|
||||||
cv.GenerateID(CONF_UART_ID): cv.use_variable_id(UARTComponent),
|
cv.GenerateID(CONF_UART_ID): cv.use_variable_id(UARTComponent),
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
for uart in get_variable(config[CONF_UART_ID]):
|
for uart_ in get_variable(config[CONF_UART_ID]):
|
||||||
yield
|
yield
|
||||||
rhs = App.make_nextion(uart)
|
rhs = App.make_nextion(uart_)
|
||||||
nextion = Pvariable(config[CONF_ID], rhs)
|
nextion = Pvariable(config[CONF_ID], rhs)
|
||||||
|
|
||||||
if CONF_LAMBDA in config:
|
if CONF_LAMBDA in config:
|
||||||
|
@ -27,6 +29,7 @@ def to_code(config):
|
||||||
add(nextion.set_writer(lambda_))
|
add(nextion.set_writer(lambda_))
|
||||||
|
|
||||||
display.setup_display(nextion, config)
|
display.setup_display(nextion, config)
|
||||||
|
setup_component(nextion, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_NEXTION'
|
BUILD_FLAGS = '-DUSE_NEXTION'
|
||||||
|
|
|
@ -7,11 +7,11 @@ from esphomeyaml.components.display import ssd1306_spi
|
||||||
from esphomeyaml.const import CONF_ADDRESS, CONF_EXTERNAL_VCC, CONF_ID, \
|
from esphomeyaml.const import CONF_ADDRESS, CONF_EXTERNAL_VCC, CONF_ID, \
|
||||||
CONF_MODEL, CONF_RESET_PIN, CONF_LAMBDA
|
CONF_MODEL, CONF_RESET_PIN, CONF_LAMBDA
|
||||||
from esphomeyaml.helpers import App, Pvariable, add, \
|
from esphomeyaml.helpers import App, Pvariable, add, \
|
||||||
gpio_output_pin_expression, process_lambda
|
gpio_output_pin_expression, process_lambda, setup_component
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ['i2c']
|
||||||
|
|
||||||
I2CSSD1306 = display.display_ns.I2CSSD1306
|
I2CSSD1306 = display.display_ns.class_('I2CSSD1306', ssd1306_spi.SSD1306)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(): cv.declare_variable_id(I2CSSD1306),
|
cv.GenerateID(): cv.declare_variable_id(I2CSSD1306),
|
||||||
|
@ -19,7 +19,7 @@ PLATFORM_SCHEMA = display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({
|
||||||
vol.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema,
|
vol.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema,
|
||||||
vol.Optional(CONF_EXTERNAL_VCC): cv.boolean,
|
vol.Optional(CONF_EXTERNAL_VCC): cv.boolean,
|
||||||
vol.Optional(CONF_ADDRESS): cv.i2c_address,
|
vol.Optional(CONF_ADDRESS): cv.i2c_address,
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
@ -41,6 +41,7 @@ def to_code(config):
|
||||||
add(ssd.set_writer(lambda_))
|
add(ssd.set_writer(lambda_))
|
||||||
|
|
||||||
display.setup_display(ssd, config)
|
display.setup_display(ssd, config)
|
||||||
|
setup_component(ssd, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_SSD1306'
|
BUILD_FLAGS = '-DUSE_SSD1306'
|
||||||
|
|
|
@ -2,27 +2,29 @@ import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml import pins
|
from esphomeyaml import pins
|
||||||
from esphomeyaml.components import display
|
from esphomeyaml.components import display, spi
|
||||||
from esphomeyaml.components.spi import SPIComponent
|
from esphomeyaml.components.spi import SPIComponent
|
||||||
from esphomeyaml.const import CONF_CS_PIN, CONF_DC_PIN, CONF_EXTERNAL_VCC, \
|
from esphomeyaml.const import CONF_CS_PIN, CONF_DC_PIN, CONF_EXTERNAL_VCC, \
|
||||||
CONF_ID, CONF_MODEL, \
|
CONF_ID, CONF_MODEL, \
|
||||||
CONF_RESET_PIN, CONF_SPI_ID, CONF_LAMBDA
|
CONF_RESET_PIN, CONF_SPI_ID, CONF_LAMBDA
|
||||||
from esphomeyaml.helpers import App, Pvariable, add, get_variable, \
|
from esphomeyaml.helpers import App, Pvariable, add, get_variable, \
|
||||||
gpio_output_pin_expression, process_lambda
|
gpio_output_pin_expression, process_lambda, setup_component, PollingComponent
|
||||||
|
|
||||||
DEPENDENCIES = ['spi']
|
DEPENDENCIES = ['spi']
|
||||||
|
|
||||||
SPISSD1306 = display.display_ns.SPISSD1306
|
SSD1306 = display.display_ns.class_('SSD1306', PollingComponent, display.DisplayBuffer)
|
||||||
|
SPISSD1306 = display.display_ns.class_('SPISSD1306', SSD1306, spi.SPIDevice)
|
||||||
|
SSD1306Model = display.display_ns.enum('SSD1306Model')
|
||||||
|
|
||||||
MODELS = {
|
MODELS = {
|
||||||
'SSD1306_128X32': display.display_ns.SSD1306_MODEL_128_32,
|
'SSD1306_128X32': SSD1306Model.SSD1306_MODEL_128_32,
|
||||||
'SSD1306_128X64': display.display_ns.SSD1306_MODEL_128_64,
|
'SSD1306_128X64': SSD1306Model.SSD1306_MODEL_128_64,
|
||||||
'SSD1306_96X16': display.display_ns.SSD1306_MODEL_96_16,
|
'SSD1306_96X16': SSD1306Model.SSD1306_MODEL_96_16,
|
||||||
'SSD1306_64X48': display.display_ns.SSD1306_MODEL_64_48,
|
'SSD1306_64X48': SSD1306Model.SSD1306_MODEL_64_48,
|
||||||
'SH1106_128X32': display.display_ns.SH1106_MODEL_128_32,
|
'SH1106_128X32': SSD1306Model.SH1106_MODEL_128_32,
|
||||||
'SH1106_128X64': display.display_ns.SH1106_MODEL_128_64,
|
'SH1106_128X64': SSD1306Model.SH1106_MODEL_128_64,
|
||||||
'SH1106_96X16': display.display_ns.SH1106_MODEL_96_16,
|
'SH1106_96X16': SSD1306Model.SH1106_MODEL_96_16,
|
||||||
'SH1106_64X48': display.display_ns.SH1106_MODEL_64_48,
|
'SH1106_64X48': SSD1306Model.SH1106_MODEL_64_48,
|
||||||
}
|
}
|
||||||
|
|
||||||
SSD1306_MODEL = vol.All(vol.Upper, vol.Replace(' ', '_'), cv.one_of(*MODELS))
|
SSD1306_MODEL = vol.All(vol.Upper, vol.Replace(' ', '_'), cv.one_of(*MODELS))
|
||||||
|
@ -35,18 +37,18 @@ PLATFORM_SCHEMA = display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({
|
||||||
vol.Required(CONF_MODEL): SSD1306_MODEL,
|
vol.Required(CONF_MODEL): SSD1306_MODEL,
|
||||||
vol.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema,
|
vol.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema,
|
||||||
vol.Optional(CONF_EXTERNAL_VCC): cv.boolean,
|
vol.Optional(CONF_EXTERNAL_VCC): cv.boolean,
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
for spi in get_variable(config[CONF_SPI_ID]):
|
for spi_ in get_variable(config[CONF_SPI_ID]):
|
||||||
yield
|
yield
|
||||||
for cs in gpio_output_pin_expression(config[CONF_CS_PIN]):
|
for cs in gpio_output_pin_expression(config[CONF_CS_PIN]):
|
||||||
yield
|
yield
|
||||||
for dc in gpio_output_pin_expression(config[CONF_DC_PIN]):
|
for dc in gpio_output_pin_expression(config[CONF_DC_PIN]):
|
||||||
yield
|
yield
|
||||||
|
|
||||||
rhs = App.make_spi_ssd1306(spi, cs, dc)
|
rhs = App.make_spi_ssd1306(spi_, cs, dc)
|
||||||
ssd = Pvariable(config[CONF_ID], rhs)
|
ssd = Pvariable(config[CONF_ID], rhs)
|
||||||
add(ssd.set_model(MODELS[config[CONF_MODEL]]))
|
add(ssd.set_model(MODELS[config[CONF_MODEL]]))
|
||||||
|
|
||||||
|
@ -63,6 +65,7 @@ def to_code(config):
|
||||||
add(ssd.set_writer(lambda_))
|
add(ssd.set_writer(lambda_))
|
||||||
|
|
||||||
display.setup_display(ssd, config)
|
display.setup_display(ssd, config)
|
||||||
|
setup_component(ssd, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_SSD1306'
|
BUILD_FLAGS = '-DUSE_SSD1306'
|
||||||
|
|
|
@ -2,25 +2,30 @@ import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml import pins
|
from esphomeyaml import pins
|
||||||
from esphomeyaml.components import display
|
from esphomeyaml.components import display, spi
|
||||||
from esphomeyaml.components.spi import SPIComponent
|
from esphomeyaml.components.spi import SPIComponent
|
||||||
from esphomeyaml.const import CONF_BUSY_PIN, CONF_CS_PIN, CONF_DC_PIN, CONF_FULL_UPDATE_EVERY, \
|
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
|
CONF_ID, CONF_LAMBDA, CONF_MODEL, CONF_RESET_PIN, CONF_SPI_ID
|
||||||
from esphomeyaml.helpers import App, Pvariable, add, get_variable, gpio_input_pin_expression, \
|
from esphomeyaml.helpers import App, Pvariable, add, get_variable, gpio_input_pin_expression, \
|
||||||
gpio_output_pin_expression, process_lambda
|
gpio_output_pin_expression, process_lambda, setup_component, PollingComponent
|
||||||
|
|
||||||
DEPENDENCIES = ['spi']
|
DEPENDENCIES = ['spi']
|
||||||
|
|
||||||
WaveshareEPaperTypeA = display.display_ns.WaveshareEPaperTypeA
|
WaveshareEPaperTypeA = display.display_ns.WaveshareEPaperTypeA
|
||||||
WaveshareEPaper = display.display_ns.WaveshareEPaper
|
WaveshareEPaper = display.display_ns.class_('WaveshareEPaper',
|
||||||
|
PollingComponent, spi.SPIDevice, display.DisplayBuffer)
|
||||||
|
|
||||||
|
|
||||||
|
WaveshareEPaperTypeAModel = display.display_ns.enum('WaveshareEPaperTypeAModel')
|
||||||
|
WaveshareEPaperTypeBModel = display.display_ns.enum('WaveshareEPaperTypeBModel')
|
||||||
|
|
||||||
MODELS = {
|
MODELS = {
|
||||||
'1.54in': ('a', display.display_ns.WAVESHARE_EPAPER_1_54_IN),
|
'1.54in': ('a', WaveshareEPaperTypeAModel.WAVESHARE_EPAPER_1_54_IN),
|
||||||
'2.13in': ('a', display.display_ns.WAVESHARE_EPAPER_2_13_IN),
|
'2.13in': ('a', WaveshareEPaperTypeAModel.WAVESHARE_EPAPER_2_13_IN),
|
||||||
'2.90in': ('a', display.display_ns.WAVESHARE_EPAPER_2_9_IN),
|
'2.90in': ('a', WaveshareEPaperTypeAModel.WAVESHARE_EPAPER_2_9_IN),
|
||||||
'2.70in': ('b', display.display_ns.WAVESHARE_EPAPER_2_7_IN),
|
'2.70in': ('b', WaveshareEPaperTypeBModel.WAVESHARE_EPAPER_2_7_IN),
|
||||||
'4.20in': ('b', display.display_ns.WAVESHARE_EPAPER_4_2_IN),
|
'4.20in': ('b', WaveshareEPaperTypeBModel.WAVESHARE_EPAPER_4_2_IN),
|
||||||
'7.50in': ('b', display.display_ns.WAVESHARE_EPAPER_7_5_IN),
|
'7.50in': ('b', WaveshareEPaperTypeBModel.WAVESHARE_EPAPER_7_5_IN),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -34,7 +39,7 @@ def validate_full_update_every_only_type_a(value):
|
||||||
|
|
||||||
|
|
||||||
PLATFORM_SCHEMA = vol.All(display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = vol.All(display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(): cv.declare_variable_id(None),
|
cv.GenerateID(): cv.declare_variable_id(WaveshareEPaper),
|
||||||
cv.GenerateID(CONF_SPI_ID): cv.use_variable_id(SPIComponent),
|
cv.GenerateID(CONF_SPI_ID): cv.use_variable_id(SPIComponent),
|
||||||
vol.Required(CONF_CS_PIN): pins.gpio_output_pin_schema,
|
vol.Required(CONF_CS_PIN): pins.gpio_output_pin_schema,
|
||||||
vol.Required(CONF_DC_PIN): pins.gpio_output_pin_schema,
|
vol.Required(CONF_DC_PIN): pins.gpio_output_pin_schema,
|
||||||
|
@ -42,11 +47,11 @@ PLATFORM_SCHEMA = vol.All(display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({
|
||||||
vol.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema,
|
vol.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema,
|
||||||
vol.Optional(CONF_BUSY_PIN): pins.gpio_input_pin_schema,
|
vol.Optional(CONF_BUSY_PIN): pins.gpio_input_pin_schema,
|
||||||
vol.Optional(CONF_FULL_UPDATE_EVERY): cv.uint32_t,
|
vol.Optional(CONF_FULL_UPDATE_EVERY): cv.uint32_t,
|
||||||
}), validate_full_update_every_only_type_a)
|
}).extend(cv.COMPONENT_SCHEMA.schema), validate_full_update_every_only_type_a)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
for spi in get_variable(config[CONF_SPI_ID]):
|
for spi_ in get_variable(config[CONF_SPI_ID]):
|
||||||
yield
|
yield
|
||||||
for cs in gpio_output_pin_expression(config[CONF_CS_PIN]):
|
for cs in gpio_output_pin_expression(config[CONF_CS_PIN]):
|
||||||
yield
|
yield
|
||||||
|
@ -55,10 +60,10 @@ def to_code(config):
|
||||||
|
|
||||||
model_type, model = MODELS[config[CONF_MODEL]]
|
model_type, model = MODELS[config[CONF_MODEL]]
|
||||||
if model_type == 'a':
|
if model_type == 'a':
|
||||||
rhs = App.make_waveshare_epaper_type_a(spi, cs, dc, model)
|
rhs = App.make_waveshare_epaper_type_a(spi_, cs, dc, model)
|
||||||
epaper = Pvariable(config[CONF_ID], rhs, type=WaveshareEPaperTypeA)
|
epaper = Pvariable(config[CONF_ID], rhs, type=WaveshareEPaperTypeA)
|
||||||
elif model_type == 'b':
|
elif model_type == 'b':
|
||||||
rhs = App.make_waveshare_epaper_type_b(spi, cs, dc, model)
|
rhs = App.make_waveshare_epaper_type_b(spi_, cs, dc, model)
|
||||||
epaper = Pvariable(config[CONF_ID], rhs, type=WaveshareEPaper)
|
epaper = Pvariable(config[CONF_ID], rhs, type=WaveshareEPaper)
|
||||||
else:
|
else:
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
@ -79,6 +84,7 @@ def to_code(config):
|
||||||
add(epaper.set_full_update_every(config[CONF_FULL_UPDATE_EVERY]))
|
add(epaper.set_full_update_every(config[CONF_FULL_UPDATE_EVERY]))
|
||||||
|
|
||||||
display.setup_display(epaper, config)
|
display.setup_display(epaper, config)
|
||||||
|
setup_component(epaper, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_WAVESHARE_EPAPER'
|
BUILD_FLAGS = '-DUSE_WAVESHARE_EPAPER'
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
from esphomeyaml import config_validation as cv
|
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.invalid("The 'esp32_ble' component has been renamed to the 'esp32_ble_tracker' "
|
|
||||||
"component in order to avoid confusion with the new 'esp32_ble_beacon' "
|
|
||||||
"component.")
|
|
|
@ -1,12 +1,13 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from esphomeyaml import config_validation as cv
|
from esphomeyaml import config_validation as cv
|
||||||
from esphomeyaml.const import CONF_ID, CONF_SCAN_INTERVAL, ESP_PLATFORM_ESP32, CONF_UUID, CONF_TYPE
|
from esphomeyaml.const import CONF_ID, CONF_SCAN_INTERVAL, CONF_TYPE, CONF_UUID, ESP_PLATFORM_ESP32
|
||||||
from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns, RawExpression, ArrayInitializer
|
from esphomeyaml.helpers import App, ArrayInitializer, Component, Pvariable, RawExpression, add, \
|
||||||
|
esphomelib_ns, setup_component
|
||||||
|
|
||||||
ESP_PLATFORMS = [ESP_PLATFORM_ESP32]
|
ESP_PLATFORMS = [ESP_PLATFORM_ESP32]
|
||||||
|
|
||||||
ESP32BLEBeacon = esphomelib_ns.ESP32BLEBeacon
|
ESP32BLEBeacon = esphomelib_ns.class_('ESP32BLEBeacon', Component)
|
||||||
|
|
||||||
CONF_MAJOR = 'major'
|
CONF_MAJOR = 'major'
|
||||||
CONF_MINOR = 'minor'
|
CONF_MINOR = 'minor'
|
||||||
|
@ -18,12 +19,12 @@ CONFIG_SCHEMA = vol.Schema({
|
||||||
vol.Optional(CONF_MAJOR): cv.uint16_t,
|
vol.Optional(CONF_MAJOR): cv.uint16_t,
|
||||||
vol.Optional(CONF_MINOR): cv.uint16_t,
|
vol.Optional(CONF_MINOR): cv.uint16_t,
|
||||||
vol.Optional(CONF_SCAN_INTERVAL): cv.positive_time_period_milliseconds,
|
vol.Optional(CONF_SCAN_INTERVAL): cv.positive_time_period_milliseconds,
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
uuid = config[CONF_UUID].hex
|
uuid = config[CONF_UUID].hex
|
||||||
uuid_arr = [RawExpression('0x{}'.format(uuid[i:i+2])) for i in range(0, len(uuid), 2)]
|
uuid_arr = [RawExpression('0x{}'.format(uuid[i:i + 2])) for i in range(0, len(uuid), 2)]
|
||||||
rhs = App.make_esp32_ble_beacon(ArrayInitializer(*uuid_arr, multiline=False))
|
rhs = App.make_esp32_ble_beacon(ArrayInitializer(*uuid_arr, multiline=False))
|
||||||
ble = Pvariable(config[CONF_ID], rhs)
|
ble = Pvariable(config[CONF_ID], rhs)
|
||||||
if CONF_MAJOR in config:
|
if CONF_MAJOR in config:
|
||||||
|
@ -31,5 +32,7 @@ def to_code(config):
|
||||||
if CONF_MINOR in config:
|
if CONF_MINOR in config:
|
||||||
add(ble.set_minor(config[CONF_MINOR]))
|
add(ble.set_minor(config[CONF_MINOR]))
|
||||||
|
|
||||||
|
setup_component(ble, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_ESP32_BLE_BEACON'
|
BUILD_FLAGS = '-DUSE_ESP32_BLE_BEACON'
|
||||||
|
|
|
@ -1,19 +1,26 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from esphomeyaml import config_validation as cv
|
from esphomeyaml import config_validation as cv
|
||||||
|
from esphomeyaml.components import sensor
|
||||||
from esphomeyaml.const import CONF_ID, CONF_SCAN_INTERVAL, ESP_PLATFORM_ESP32
|
from esphomeyaml.const import CONF_ID, CONF_SCAN_INTERVAL, ESP_PLATFORM_ESP32
|
||||||
from esphomeyaml.core import HexInt
|
from esphomeyaml.core import HexInt
|
||||||
from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns, ArrayInitializer
|
from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns, ArrayInitializer, \
|
||||||
|
setup_component, Component
|
||||||
|
|
||||||
ESP_PLATFORMS = [ESP_PLATFORM_ESP32]
|
ESP_PLATFORMS = [ESP_PLATFORM_ESP32]
|
||||||
|
|
||||||
CONF_ESP32_BLE_ID = 'esp32_ble_id'
|
CONF_ESP32_BLE_ID = 'esp32_ble_id'
|
||||||
ESP32BLETracker = esphomelib_ns.ESP32BLETracker
|
ESP32BLETracker = esphomelib_ns.class_('ESP32BLETracker', Component)
|
||||||
|
XiaomiSensor = esphomelib_ns.class_('XiaomiSensor', sensor.Sensor)
|
||||||
|
XiaomiDevice = esphomelib_ns.class_('XiaomiDevice')
|
||||||
|
XIAOMI_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(XiaomiSensor)
|
||||||
|
})
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.Schema({
|
CONFIG_SCHEMA = vol.Schema({
|
||||||
cv.GenerateID(): cv.declare_variable_id(ESP32BLETracker),
|
cv.GenerateID(): cv.declare_variable_id(ESP32BLETracker),
|
||||||
vol.Optional(CONF_SCAN_INTERVAL): cv.positive_time_period_milliseconds,
|
vol.Optional(CONF_SCAN_INTERVAL): cv.positive_time_period_milliseconds,
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
def make_address_array(address):
|
def make_address_array(address):
|
||||||
|
@ -27,5 +34,7 @@ def to_code(config):
|
||||||
if CONF_SCAN_INTERVAL in config:
|
if CONF_SCAN_INTERVAL in config:
|
||||||
add(ble.set_scan_interval(config[CONF_SCAN_INTERVAL]))
|
add(ble.set_scan_interval(config[CONF_SCAN_INTERVAL]))
|
||||||
|
|
||||||
|
setup_component(ble, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_ESP32_BLE_TRACKER'
|
BUILD_FLAGS = '-DUSE_ESP32_BLE_TRACKER'
|
||||||
|
|
|
@ -6,7 +6,7 @@ from esphomeyaml.const import CONF_ID, CONF_SETUP_MODE, CONF_IIR_FILTER, \
|
||||||
CONF_SLEEP_DURATION, CONF_MEASUREMENT_DURATION, CONF_LOW_VOLTAGE_REFERENCE, \
|
CONF_SLEEP_DURATION, CONF_MEASUREMENT_DURATION, CONF_LOW_VOLTAGE_REFERENCE, \
|
||||||
CONF_HIGH_VOLTAGE_REFERENCE, CONF_VOLTAGE_ATTENUATION, ESP_PLATFORM_ESP32
|
CONF_HIGH_VOLTAGE_REFERENCE, CONF_VOLTAGE_ATTENUATION, ESP_PLATFORM_ESP32
|
||||||
from esphomeyaml.core import TimePeriod
|
from esphomeyaml.core import TimePeriod
|
||||||
from esphomeyaml.helpers import App, Pvariable, add, global_ns
|
from esphomeyaml.helpers import App, Pvariable, add, global_ns, setup_component, Component
|
||||||
|
|
||||||
ESP_PLATFORMS = [ESP_PLATFORM_ESP32]
|
ESP_PLATFORMS = [ESP_PLATFORM_ESP32]
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ VOLTAGE_ATTENUATION = {
|
||||||
'0V': global_ns.TOUCH_HVOLT_ATTEN_0V,
|
'0V': global_ns.TOUCH_HVOLT_ATTEN_0V,
|
||||||
}
|
}
|
||||||
|
|
||||||
ESP32TouchComponent = binary_sensor.binary_sensor_ns.ESP32TouchComponent
|
ESP32TouchComponent = binary_sensor.binary_sensor_ns.class_('ESP32TouchComponent', Component)
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.Schema({
|
CONFIG_SCHEMA = vol.Schema({
|
||||||
cv.GenerateID(): cv.declare_variable_id(ESP32TouchComponent),
|
cv.GenerateID(): cv.declare_variable_id(ESP32TouchComponent),
|
||||||
|
@ -54,7 +54,7 @@ CONFIG_SCHEMA = vol.Schema({
|
||||||
vol.Optional(CONF_LOW_VOLTAGE_REFERENCE): validate_voltage(LOW_VOLTAGE_REFERENCE),
|
vol.Optional(CONF_LOW_VOLTAGE_REFERENCE): validate_voltage(LOW_VOLTAGE_REFERENCE),
|
||||||
vol.Optional(CONF_HIGH_VOLTAGE_REFERENCE): validate_voltage(HIGH_VOLTAGE_REFERENCE),
|
vol.Optional(CONF_HIGH_VOLTAGE_REFERENCE): validate_voltage(HIGH_VOLTAGE_REFERENCE),
|
||||||
vol.Optional(CONF_VOLTAGE_ATTENUATION): validate_voltage(VOLTAGE_ATTENUATION),
|
vol.Optional(CONF_VOLTAGE_ATTENUATION): validate_voltage(VOLTAGE_ATTENUATION),
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
@ -80,5 +80,7 @@ def to_code(config):
|
||||||
value = VOLTAGE_ATTENUATION[config[CONF_VOLTAGE_ATTENUATION]]
|
value = VOLTAGE_ATTENUATION[config[CONF_VOLTAGE_ATTENUATION]]
|
||||||
add(touch.set_voltage_attenuation(value))
|
add(touch.set_voltage_attenuation(value))
|
||||||
|
|
||||||
|
setup_component(touch, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_ESP32_TOUCH_BINARY_SENSOR'
|
BUILD_FLAGS = '-DUSE_ESP32_TOUCH_BINARY_SENSOR'
|
||||||
|
|
|
@ -1,29 +1,33 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY
|
from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY
|
||||||
|
from esphomeyaml.components import mqtt
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.const import CONF_ID, CONF_MQTT_ID, CONF_OSCILLATION_COMMAND_TOPIC, \
|
from esphomeyaml.const import CONF_ID, CONF_MQTT_ID, CONF_OSCILLATION_COMMAND_TOPIC, \
|
||||||
CONF_OSCILLATION_STATE_TOPIC, CONF_SPEED_COMMAND_TOPIC, CONF_SPEED_STATE_TOPIC, CONF_INTERNAL, \
|
CONF_OSCILLATION_STATE_TOPIC, CONF_SPEED_COMMAND_TOPIC, CONF_SPEED_STATE_TOPIC, CONF_INTERNAL, \
|
||||||
CONF_SPEED, CONF_OSCILLATING
|
CONF_SPEED, CONF_OSCILLATING, CONF_OSCILLATION_OUTPUT, CONF_NAME
|
||||||
from esphomeyaml.helpers import Application, Pvariable, add, esphomelib_ns, setup_mqtt_component, \
|
from esphomeyaml.helpers import Application, Pvariable, add, esphomelib_ns, setup_mqtt_component, \
|
||||||
TemplateArguments, get_variable, templatable, bool_
|
TemplateArguments, get_variable, templatable, bool_, Action, Nameable, Component
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
fan_ns = esphomelib_ns.namespace('fan')
|
fan_ns = esphomelib_ns.namespace('fan')
|
||||||
FanState = fan_ns.FanState
|
FanState = fan_ns.class_('FanState', Nameable, Component)
|
||||||
MQTTFanComponent = fan_ns.MQTTFanComponent
|
MQTTFanComponent = fan_ns.class_('MQTTFanComponent', mqtt.MQTTComponent)
|
||||||
MakeFan = Application.MakeFan
|
MakeFan = Application.struct('MakeFan')
|
||||||
TurnOnAction = fan_ns.TurnOnAction
|
|
||||||
TurnOffAction = fan_ns.TurnOffAction
|
# Actions
|
||||||
ToggleAction = fan_ns.ToggleAction
|
TurnOnAction = fan_ns.class_('TurnOnAction', Action)
|
||||||
FanSpeed = fan_ns.FanSpeed
|
TurnOffAction = fan_ns.class_('TurnOffAction', Action)
|
||||||
FAN_SPEED_OFF = fan_ns.FAN_SPEED_OFF
|
ToggleAction = fan_ns.class_('ToggleAction', Action)
|
||||||
FAN_SPEED_LOW = fan_ns.FAN_SPEED_LOW
|
|
||||||
FAN_SPEED_MEDIUM = fan_ns.FAN_SPEED_MEDIUM
|
FanSpeed = fan_ns.enum('FanSpeed')
|
||||||
FAN_SPEED_HIGH = fan_ns.FAN_SPEED_HIGH
|
FAN_SPEED_OFF = FanSpeed.FAN_SPEED_OFF
|
||||||
|
FAN_SPEED_LOW = FanSpeed.FAN_SPEED_LOW
|
||||||
|
FAN_SPEED_MEDIUM = FanSpeed.FAN_SPEED_MEDIUM
|
||||||
|
FAN_SPEED_HIGH = FanSpeed.FAN_SPEED_HIGH
|
||||||
|
|
||||||
FAN_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend({
|
FAN_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend({
|
||||||
cv.GenerateID(): cv.declare_variable_id(FanState),
|
cv.GenerateID(): cv.declare_variable_id(FanState),
|
||||||
|
@ -73,7 +77,7 @@ BUILD_FLAGS = '-DUSE_FAN'
|
||||||
|
|
||||||
CONF_FAN_TOGGLE = 'fan.toggle'
|
CONF_FAN_TOGGLE = 'fan.toggle'
|
||||||
FAN_TOGGLE_ACTION_SCHEMA = maybe_simple_id({
|
FAN_TOGGLE_ACTION_SCHEMA = maybe_simple_id({
|
||||||
vol.Required(CONF_ID): cv.use_variable_id(None),
|
vol.Required(CONF_ID): cv.use_variable_id(FanState),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@ -89,7 +93,7 @@ def fan_toggle_to_code(config, action_id, arg_type):
|
||||||
|
|
||||||
CONF_FAN_TURN_OFF = 'fan.turn_off'
|
CONF_FAN_TURN_OFF = 'fan.turn_off'
|
||||||
FAN_TURN_OFF_ACTION_SCHEMA = maybe_simple_id({
|
FAN_TURN_OFF_ACTION_SCHEMA = maybe_simple_id({
|
||||||
vol.Required(CONF_ID): cv.use_variable_id(None),
|
vol.Required(CONF_ID): cv.use_variable_id(FanState),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@ -105,7 +109,7 @@ def fan_turn_off_to_code(config, action_id, arg_type):
|
||||||
|
|
||||||
CONF_FAN_TURN_ON = 'fan.turn_on'
|
CONF_FAN_TURN_ON = 'fan.turn_on'
|
||||||
FAN_TURN_ON_ACTION_SCHEMA = maybe_simple_id({
|
FAN_TURN_ON_ACTION_SCHEMA = maybe_simple_id({
|
||||||
vol.Required(CONF_ID): cv.use_variable_id(None),
|
vol.Required(CONF_ID): cv.use_variable_id(FanState),
|
||||||
vol.Optional(CONF_OSCILLATING): cv.templatable(cv.boolean),
|
vol.Optional(CONF_OSCILLATING): cv.templatable(cv.boolean),
|
||||||
vol.Optional(CONF_SPEED): cv.templatable(validate_fan_speed),
|
vol.Optional(CONF_SPEED): cv.templatable(validate_fan_speed),
|
||||||
})
|
})
|
||||||
|
@ -128,3 +132,15 @@ def fan_turn_on_to_code(config, action_id, arg_type):
|
||||||
yield None
|
yield None
|
||||||
add(action.set_speed(template_))
|
add(action.set_speed(template_))
|
||||||
yield action
|
yield action
|
||||||
|
|
||||||
|
|
||||||
|
def core_to_hass_config(data, config):
|
||||||
|
ret = mqtt.build_hass_config(data, 'fan', config, include_state=True, include_command=True)
|
||||||
|
if ret is None:
|
||||||
|
return None
|
||||||
|
if CONF_OSCILLATION_OUTPUT in config:
|
||||||
|
default = mqtt.get_default_topic_for(data, 'fan', config[CONF_NAME], 'oscillation/state')
|
||||||
|
ret['oscillation_state_topic'] = config.get(CONF_OSCILLATION_STATE_TOPIC, default)
|
||||||
|
default = mqtt.get_default_topic_for(data, 'fan', config[CONF_NAME], 'oscillation/command')
|
||||||
|
ret['oscillation_command__topic'] = config.get(CONF_OSCILLATION_COMMAND_TOPIC, default)
|
||||||
|
return ret
|
||||||
|
|
|
@ -1,29 +1,32 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import fan
|
from esphomeyaml.components import fan, output
|
||||||
from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_OSCILLATION_OUTPUT, CONF_OUTPUT
|
from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_OSCILLATION_OUTPUT, CONF_OUTPUT
|
||||||
from esphomeyaml.helpers import App, add, get_variable, variable
|
from esphomeyaml.helpers import App, add, get_variable, variable, setup_component
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(fan.FAN_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(fan.FAN_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(fan.MakeFan),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(fan.MakeFan),
|
||||||
vol.Required(CONF_OUTPUT): cv.use_variable_id(None),
|
vol.Required(CONF_OUTPUT): cv.use_variable_id(output.BinaryOutput),
|
||||||
vol.Optional(CONF_OSCILLATION_OUTPUT): cv.use_variable_id(None),
|
vol.Optional(CONF_OSCILLATION_OUTPUT): cv.use_variable_id(output.BinaryOutput),
|
||||||
}))
|
}).extend(cv.COMPONENT_SCHEMA.schema))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
output = None
|
for output_ in get_variable(config[CONF_OUTPUT]):
|
||||||
for output in get_variable(config[CONF_OUTPUT]):
|
|
||||||
yield
|
yield
|
||||||
|
|
||||||
rhs = App.make_fan(config[CONF_NAME])
|
rhs = App.make_fan(config[CONF_NAME])
|
||||||
fan_struct = variable(config[CONF_MAKE_ID], rhs)
|
fan_struct = variable(config[CONF_MAKE_ID], rhs)
|
||||||
add(fan_struct.Poutput.set_binary(output))
|
add(fan_struct.Poutput.set_binary(output_))
|
||||||
if CONF_OSCILLATION_OUTPUT in config:
|
if CONF_OSCILLATION_OUTPUT in config:
|
||||||
oscillation_output = None
|
|
||||||
for oscillation_output in get_variable(config[CONF_OSCILLATION_OUTPUT]):
|
for oscillation_output in get_variable(config[CONF_OSCILLATION_OUTPUT]):
|
||||||
yield
|
yield
|
||||||
add(fan_struct.Poutput.set_oscillation(oscillation_output))
|
add(fan_struct.Poutput.set_oscillation(oscillation_output))
|
||||||
|
|
||||||
fan.setup_fan(fan_struct.Pstate, fan_struct.Pmqtt, config)
|
fan.setup_fan(fan_struct.Pstate, fan_struct.Pmqtt, config)
|
||||||
|
setup_component(fan_struct.Poutput, config)
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return fan.core_to_hass_config(data, config)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import fan
|
from esphomeyaml.components import fan, mqtt, output
|
||||||
from esphomeyaml.const import CONF_HIGH, CONF_LOW, CONF_MAKE_ID, CONF_MEDIUM, CONF_NAME, \
|
from esphomeyaml.const import CONF_HIGH, CONF_LOW, CONF_MAKE_ID, CONF_MEDIUM, CONF_NAME, \
|
||||||
CONF_OSCILLATION_OUTPUT, CONF_OUTPUT, CONF_SPEED, CONF_SPEED_COMMAND_TOPIC, \
|
CONF_OSCILLATION_OUTPUT, CONF_OUTPUT, CONF_SPEED, CONF_SPEED_COMMAND_TOPIC, \
|
||||||
CONF_SPEED_STATE_TOPIC
|
CONF_SPEED_STATE_TOPIC
|
||||||
|
@ -9,37 +9,46 @@ from esphomeyaml.helpers import App, add, get_variable, variable
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(fan.FAN_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(fan.FAN_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(fan.MakeFan),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(fan.MakeFan),
|
||||||
vol.Required(CONF_OUTPUT): cv.use_variable_id(None),
|
vol.Required(CONF_OUTPUT): cv.use_variable_id(output.FloatOutput),
|
||||||
vol.Optional(CONF_SPEED_STATE_TOPIC): cv.publish_topic,
|
vol.Optional(CONF_SPEED_STATE_TOPIC): cv.publish_topic,
|
||||||
vol.Optional(CONF_SPEED_COMMAND_TOPIC): cv.subscribe_topic,
|
vol.Optional(CONF_SPEED_COMMAND_TOPIC): cv.subscribe_topic,
|
||||||
vol.Optional(CONF_OSCILLATION_OUTPUT): cv.use_variable_id(None),
|
vol.Optional(CONF_OSCILLATION_OUTPUT): cv.use_variable_id(output.BinaryOutput),
|
||||||
vol.Optional(CONF_SPEED): vol.Schema({
|
vol.Optional(CONF_SPEED): vol.Schema({
|
||||||
vol.Required(CONF_LOW): cv.percentage,
|
vol.Required(CONF_LOW): cv.percentage,
|
||||||
vol.Required(CONF_MEDIUM): cv.percentage,
|
vol.Required(CONF_MEDIUM): cv.percentage,
|
||||||
vol.Required(CONF_HIGH): cv.percentage,
|
vol.Required(CONF_HIGH): cv.percentage,
|
||||||
}),
|
}),
|
||||||
}))
|
}).extend(cv.COMPONENT_SCHEMA.schema))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
output = None
|
for output_ in get_variable(config[CONF_OUTPUT]):
|
||||||
for output in get_variable(config[CONF_OUTPUT]):
|
|
||||||
yield
|
yield
|
||||||
rhs = App.make_fan(config[CONF_NAME])
|
rhs = App.make_fan(config[CONF_NAME])
|
||||||
fan_struct = variable(config[CONF_MAKE_ID], rhs)
|
fan_struct = variable(config[CONF_MAKE_ID], rhs)
|
||||||
if CONF_SPEED in config:
|
if CONF_SPEED in config:
|
||||||
speeds = config[CONF_SPEED]
|
speeds = config[CONF_SPEED]
|
||||||
add(fan_struct.Poutput.set_speed(output,
|
add(fan_struct.Poutput.set_speed(output_,
|
||||||
speeds[CONF_LOW],
|
speeds[CONF_LOW],
|
||||||
speeds[CONF_MEDIUM],
|
speeds[CONF_MEDIUM],
|
||||||
speeds[CONF_HIGH]))
|
speeds[CONF_HIGH]))
|
||||||
else:
|
else:
|
||||||
add(fan_struct.Poutput.set_speed(output))
|
add(fan_struct.Poutput.set_speed(output_))
|
||||||
|
|
||||||
if CONF_OSCILLATION_OUTPUT in config:
|
if CONF_OSCILLATION_OUTPUT in config:
|
||||||
oscillation_output = None
|
|
||||||
for oscillation_output in get_variable(config[CONF_OSCILLATION_OUTPUT]):
|
for oscillation_output in get_variable(config[CONF_OSCILLATION_OUTPUT]):
|
||||||
yield
|
yield
|
||||||
add(fan_struct.Poutput.set_oscillation(oscillation_output))
|
add(fan_struct.Poutput.set_oscillation(oscillation_output))
|
||||||
|
|
||||||
fan.setup_fan(fan_struct.Pstate, fan_struct.Pmqtt, config)
|
fan.setup_fan(fan_struct.Pstate, fan_struct.Pmqtt, config)
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
ret = fan.core_to_hass_config(data, config)
|
||||||
|
if ret is None:
|
||||||
|
return None
|
||||||
|
default = mqtt.get_default_topic_for(data, 'fan', config[CONF_NAME], 'speed/state')
|
||||||
|
ret['speed_state_topic'] = config.get(CONF_SPEED_STATE_TOPIC, default)
|
||||||
|
default = mqtt.get_default_topic_for(data, 'fan', config[CONF_NAME], 'speed/command')
|
||||||
|
ret['speed_command__topic'] = config.get(CONF_SPEED_COMMAND_TOPIC, default)
|
||||||
|
return ret
|
||||||
|
|
|
@ -11,8 +11,8 @@ from esphomeyaml.helpers import App, ArrayInitializer, MockObj, Pvariable, RawEx
|
||||||
|
|
||||||
DEPENDENCIES = ['display']
|
DEPENDENCIES = ['display']
|
||||||
|
|
||||||
Font = display.display_ns.Font
|
Font = display.display_ns.class_('Font')
|
||||||
Glyph = display.display_ns.Glyph
|
Glyph = display.display_ns.class_('Glyph')
|
||||||
|
|
||||||
|
|
||||||
def validate_glyphs(value):
|
def validate_glyphs(value):
|
||||||
|
|
35
esphomeyaml/components/globals.py
Normal file
35
esphomeyaml/components/globals.py
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
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.helpers import App, Component, Pvariable, RawExpression, TemplateArguments, add, \
|
||||||
|
esphomelib_ns, setup_component
|
||||||
|
|
||||||
|
GlobalVariableComponent = esphomelib_ns.class_('GlobalVariableComponent', Component)
|
||||||
|
|
||||||
|
GLOBAL_VAR_SCHEMA = vol.Schema({
|
||||||
|
vol.Required(CONF_ID): cv.declare_variable_id(GlobalVariableComponent),
|
||||||
|
vol.Required(CONF_TYPE): cv.string_strict,
|
||||||
|
vol.Optional(CONF_INITIAL_VALUE): cv.string_strict,
|
||||||
|
vol.Optional(CONF_RESTORE_VALUE): cv.boolean,
|
||||||
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
CONFIG_SCHEMA = vol.All(cv.ensure_list, [GLOBAL_VAR_SCHEMA])
|
||||||
|
|
||||||
|
|
||||||
|
def to_code(config):
|
||||||
|
for conf in config:
|
||||||
|
type_ = RawExpression(conf[CONF_TYPE])
|
||||||
|
template_args = TemplateArguments(type_)
|
||||||
|
res_type = GlobalVariableComponent.template(template_args)
|
||||||
|
initial_value = None
|
||||||
|
if CONF_INITIAL_VALUE in conf:
|
||||||
|
initial_value = RawExpression(conf[CONF_INITIAL_VALUE])
|
||||||
|
rhs = App.Pmake_global_variable(template_args, initial_value)
|
||||||
|
glob = Pvariable(conf[CONF_ID], rhs, type=res_type)
|
||||||
|
|
||||||
|
if conf.get(CONF_RESTORE_VALUE, False):
|
||||||
|
hash_ = hash(conf[CONF_ID].id) % 2**32
|
||||||
|
add(glob.set_restore_value(hash_))
|
||||||
|
|
||||||
|
setup_component(glob, conf)
|
|
@ -4,9 +4,10 @@ import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml import pins
|
from esphomeyaml import pins
|
||||||
from esphomeyaml.const import CONF_FREQUENCY, CONF_SCL, CONF_SDA, CONF_SCAN, CONF_ID, \
|
from esphomeyaml.const import CONF_FREQUENCY, CONF_SCL, CONF_SDA, CONF_SCAN, CONF_ID, \
|
||||||
CONF_RECEIVE_TIMEOUT
|
CONF_RECEIVE_TIMEOUT
|
||||||
from esphomeyaml.helpers import App, add, Pvariable, esphomelib_ns
|
from esphomeyaml.helpers import App, add, Pvariable, esphomelib_ns, setup_component, Component
|
||||||
|
|
||||||
I2CComponent = esphomelib_ns.I2CComponent
|
I2CComponent = esphomelib_ns.class_('I2CComponent', Component)
|
||||||
|
I2CDevice = pins.I2CDevice
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.Schema({
|
CONFIG_SCHEMA = vol.Schema({
|
||||||
cv.GenerateID(): cv.declare_variable_id(I2CComponent),
|
cv.GenerateID(): cv.declare_variable_id(I2CComponent),
|
||||||
|
@ -18,7 +19,7 @@ CONFIG_SCHEMA = vol.Schema({
|
||||||
vol.Optional(CONF_RECEIVE_TIMEOUT): cv.invalid("The receive_timeout option has been removed "
|
vol.Optional(CONF_RECEIVE_TIMEOUT): cv.invalid("The receive_timeout option has been removed "
|
||||||
"because timeouts are already handled by the "
|
"because timeouts are already handled by the "
|
||||||
"low-level i2c interface.")
|
"low-level i2c interface.")
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
@ -27,6 +28,8 @@ def to_code(config):
|
||||||
if CONF_FREQUENCY in config:
|
if CONF_FREQUENCY in config:
|
||||||
add(i2c.set_frequency(config[CONF_FREQUENCY]))
|
add(i2c.set_frequency(config[CONF_FREQUENCY]))
|
||||||
|
|
||||||
|
setup_component(i2c, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_I2C'
|
BUILD_FLAGS = '-DUSE_I2C'
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ _LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
DEPENDENCIES = ['display']
|
DEPENDENCIES = ['display']
|
||||||
|
|
||||||
Image_ = display.display_ns.Image
|
Image_ = display.display_ns.class_('Image')
|
||||||
|
|
||||||
CONF_RAW_DATA_ID = 'raw_data_id'
|
CONF_RAW_DATA_ID = 'raw_data_id'
|
||||||
|
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
import voluptuous as vol
|
|
||||||
|
|
||||||
|
|
||||||
def CONFIG_SCHEMA(config):
|
|
||||||
raise vol.Invalid("The ir_transmitter component has been renamed to "
|
|
||||||
"remote_transmitter because of 433MHz signal support.")
|
|
|
@ -1,6 +1,7 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY
|
from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY
|
||||||
|
from esphomeyaml.components import mqtt
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.const import CONF_ALPHA, CONF_BLUE, CONF_BRIGHTNESS, CONF_COLORS, \
|
from esphomeyaml.const import CONF_ALPHA, CONF_BLUE, CONF_BRIGHTNESS, CONF_COLORS, \
|
||||||
CONF_DEFAULT_TRANSITION_LENGTH, CONF_DURATION, CONF_EFFECTS, CONF_EFFECT_ID, \
|
CONF_DEFAULT_TRANSITION_LENGTH, CONF_DURATION, CONF_EFFECTS, CONF_EFFECT_ID, \
|
||||||
|
@ -10,36 +11,48 @@ from esphomeyaml.const import CONF_ALPHA, CONF_BLUE, CONF_BRIGHTNESS, CONF_COLOR
|
||||||
CONF_EFFECT
|
CONF_EFFECT
|
||||||
from esphomeyaml.helpers import Application, ArrayInitializer, Pvariable, RawExpression, \
|
from esphomeyaml.helpers import Application, ArrayInitializer, Pvariable, RawExpression, \
|
||||||
StructInitializer, add, add_job, esphomelib_ns, process_lambda, setup_mqtt_component, \
|
StructInitializer, add, add_job, esphomelib_ns, process_lambda, setup_mqtt_component, \
|
||||||
get_variable, TemplateArguments, templatable, uint32, float_, std_string
|
get_variable, TemplateArguments, templatable, uint32, float_, std_string, Nameable, Component, \
|
||||||
|
Action
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
# Base
|
||||||
light_ns = esphomelib_ns.namespace('light')
|
light_ns = esphomelib_ns.namespace('light')
|
||||||
LightState = light_ns.LightState
|
LightState = light_ns.class_('LightState', Nameable, Component)
|
||||||
LightColorValues = light_ns.LightColorValues
|
MakeLight = Application.struct('MakeLight')
|
||||||
MQTTJSONLightComponent = light_ns.MQTTJSONLightComponent
|
LightOutput = light_ns.class_('LightOutput')
|
||||||
ToggleAction = light_ns.ToggleAction
|
FastLEDLightOutputComponent = light_ns.class_('FastLEDLightOutputComponent', LightOutput)
|
||||||
TurnOffAction = light_ns.TurnOffAction
|
|
||||||
TurnOnAction = light_ns.TurnOnAction
|
# Actions
|
||||||
MakeLight = Application.MakeLight
|
ToggleAction = light_ns.class_('ToggleAction', Action)
|
||||||
RandomLightEffect = light_ns.RandomLightEffect
|
TurnOffAction = light_ns.class_('TurnOffAction', Action)
|
||||||
LambdaLightEffect = light_ns.LambdaLightEffect
|
TurnOnAction = light_ns.class_('TurnOnAction', Action)
|
||||||
StrobeLightEffect = light_ns.StrobeLightEffect
|
|
||||||
StrobeLightEffectColor = light_ns.StrobeLightEffectColor
|
LightColorValues = light_ns.class_('LightColorValues')
|
||||||
FlickerLightEffect = light_ns.FlickerLightEffect
|
|
||||||
FastLEDLambdaLightEffect = light_ns.FastLEDLambdaLightEffect
|
|
||||||
FastLEDRainbowLightEffect = light_ns.FastLEDRainbowLightEffect
|
MQTTJSONLightComponent = light_ns.class_('MQTTJSONLightComponent', mqtt.MQTTComponent)
|
||||||
FastLEDColorWipeEffect = light_ns.FastLEDColorWipeEffect
|
|
||||||
FastLEDColorWipeEffectColor = light_ns.FastLEDColorWipeEffectColor
|
# Effects
|
||||||
FastLEDScanEffect = light_ns.FastLEDScanEffect
|
LightEffect = light_ns.class_('LightEffect')
|
||||||
FastLEDScanEffectColor = light_ns.FastLEDScanEffectColor
|
RandomLightEffect = light_ns.class_('RandomLightEffect', LightEffect)
|
||||||
FastLEDTwinkleEffect = light_ns.FastLEDTwinkleEffect
|
LambdaLightEffect = light_ns.class_('LambdaLightEffect', LightEffect)
|
||||||
FastLEDRandomTwinkleEffect = light_ns.FastLEDRandomTwinkleEffect
|
StrobeLightEffect = light_ns.class_('StrobeLightEffect', LightEffect)
|
||||||
FastLEDFireworksEffect = light_ns.FastLEDFireworksEffect
|
StrobeLightEffectColor = light_ns.class_('StrobeLightEffectColor', LightEffect)
|
||||||
FastLEDFlickerEffect = light_ns.FastLEDFlickerEffect
|
FlickerLightEffect = light_ns.class_('FlickerLightEffect', LightEffect)
|
||||||
FastLEDLightOutputComponent = light_ns.FastLEDLightOutputComponent
|
BaseFastLEDLightEffect = light_ns.class_('BaseFastLEDLightEffect', LightEffect)
|
||||||
|
FastLEDLambdaLightEffect = light_ns.class_('FastLEDLambdaLightEffect', BaseFastLEDLightEffect)
|
||||||
|
FastLEDRainbowLightEffect = light_ns.class_('FastLEDRainbowLightEffect', BaseFastLEDLightEffect)
|
||||||
|
FastLEDColorWipeEffect = light_ns.class_('FastLEDColorWipeEffect', BaseFastLEDLightEffect)
|
||||||
|
FastLEDColorWipeEffectColor = light_ns.class_('FastLEDColorWipeEffectColor', BaseFastLEDLightEffect)
|
||||||
|
FastLEDScanEffect = light_ns.class_('FastLEDScanEffect', BaseFastLEDLightEffect)
|
||||||
|
FastLEDScanEffectColor = light_ns.class_('FastLEDScanEffectColor', BaseFastLEDLightEffect)
|
||||||
|
FastLEDTwinkleEffect = light_ns.class_('FastLEDTwinkleEffect', BaseFastLEDLightEffect)
|
||||||
|
FastLEDRandomTwinkleEffect = light_ns.class_('FastLEDRandomTwinkleEffect', BaseFastLEDLightEffect)
|
||||||
|
FastLEDFireworksEffect = light_ns.class_('FastLEDFireworksEffect', BaseFastLEDLightEffect)
|
||||||
|
FastLEDFlickerEffect = light_ns.class_('FastLEDFlickerEffect', BaseFastLEDLightEffect)
|
||||||
|
|
||||||
CONF_STROBE = 'strobe'
|
CONF_STROBE = 'strobe'
|
||||||
CONF_FLICKER = 'flicker'
|
CONF_FLICKER = 'flicker'
|
||||||
|
@ -344,7 +357,7 @@ BUILD_FLAGS = '-DUSE_LIGHT'
|
||||||
|
|
||||||
CONF_LIGHT_TOGGLE = 'light.toggle'
|
CONF_LIGHT_TOGGLE = 'light.toggle'
|
||||||
LIGHT_TOGGLE_ACTION_SCHEMA = maybe_simple_id({
|
LIGHT_TOGGLE_ACTION_SCHEMA = maybe_simple_id({
|
||||||
vol.Required(CONF_ID): cv.use_variable_id(None),
|
vol.Required(CONF_ID): cv.use_variable_id(LightState),
|
||||||
vol.Optional(CONF_TRANSITION_LENGTH): cv.templatable(cv.positive_time_period_milliseconds),
|
vol.Optional(CONF_TRANSITION_LENGTH): cv.templatable(cv.positive_time_period_milliseconds),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -366,7 +379,7 @@ def light_toggle_to_code(config, action_id, arg_type):
|
||||||
|
|
||||||
CONF_LIGHT_TURN_OFF = 'light.turn_off'
|
CONF_LIGHT_TURN_OFF = 'light.turn_off'
|
||||||
LIGHT_TURN_OFF_ACTION_SCHEMA = maybe_simple_id({
|
LIGHT_TURN_OFF_ACTION_SCHEMA = maybe_simple_id({
|
||||||
vol.Required(CONF_ID): cv.use_variable_id(None),
|
vol.Required(CONF_ID): cv.use_variable_id(LightState),
|
||||||
vol.Optional(CONF_TRANSITION_LENGTH): cv.templatable(cv.positive_time_period_milliseconds),
|
vol.Optional(CONF_TRANSITION_LENGTH): cv.templatable(cv.positive_time_period_milliseconds),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -388,7 +401,7 @@ def light_turn_off_to_code(config, action_id, arg_type):
|
||||||
|
|
||||||
CONF_LIGHT_TURN_ON = 'light.turn_on'
|
CONF_LIGHT_TURN_ON = 'light.turn_on'
|
||||||
LIGHT_TURN_ON_ACTION_SCHEMA = maybe_simple_id({
|
LIGHT_TURN_ON_ACTION_SCHEMA = maybe_simple_id({
|
||||||
vol.Required(CONF_ID): cv.use_variable_id(None),
|
vol.Required(CONF_ID): cv.use_variable_id(LightState),
|
||||||
vol.Exclusive(CONF_TRANSITION_LENGTH, 'transformer'):
|
vol.Exclusive(CONF_TRANSITION_LENGTH, 'transformer'):
|
||||||
cv.templatable(cv.positive_time_period_milliseconds),
|
cv.templatable(cv.positive_time_period_milliseconds),
|
||||||
vol.Exclusive(CONF_FLASH_LENGTH, 'transformer'):
|
vol.Exclusive(CONF_FLASH_LENGTH, 'transformer'):
|
||||||
|
@ -448,3 +461,24 @@ def light_turn_on_to_code(config, action_id, arg_type):
|
||||||
yield None
|
yield None
|
||||||
add(action.set_effect(template_))
|
add(action.set_effect(template_))
|
||||||
yield action
|
yield action
|
||||||
|
|
||||||
|
|
||||||
|
def core_to_hass_config(data, config, brightness=True, rgb=True, color_temp=True,
|
||||||
|
white_value=True):
|
||||||
|
ret = mqtt.build_hass_config(data, 'light', config, include_state=True, include_command=True,
|
||||||
|
platform='mqtt_json')
|
||||||
|
if ret is None:
|
||||||
|
return None
|
||||||
|
if brightness:
|
||||||
|
ret['brightness'] = True
|
||||||
|
if rgb:
|
||||||
|
ret['rgb'] = True
|
||||||
|
if color_temp:
|
||||||
|
ret['color_temp'] = True
|
||||||
|
if white_value:
|
||||||
|
ret['white_value'] = True
|
||||||
|
for effect in config.get(CONF_EFFECTS, []):
|
||||||
|
ret["effect"] = True
|
||||||
|
effects = ret.setdefault("effect_list", [])
|
||||||
|
effects.append(next(x for x in effect.values())[CONF_NAME])
|
||||||
|
return ret
|
||||||
|
|
|
@ -1,21 +1,26 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
|
from esphomeyaml.components import light, output
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import light
|
from esphomeyaml.const import CONF_EFFECTS, CONF_MAKE_ID, CONF_NAME, CONF_OUTPUT
|
||||||
from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_OUTPUT, CONF_EFFECTS
|
from esphomeyaml.helpers import App, get_variable, setup_component, variable
|
||||||
from esphomeyaml.helpers import App, get_variable, variable
|
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight),
|
||||||
vol.Required(CONF_OUTPUT): cv.use_variable_id(None),
|
vol.Required(CONF_OUTPUT): cv.use_variable_id(output.BinaryOutput),
|
||||||
vol.Optional(CONF_EFFECTS): light.validate_effects(light.BINARY_EFFECTS),
|
vol.Optional(CONF_EFFECTS): light.validate_effects(light.BINARY_EFFECTS),
|
||||||
}))
|
}).extend(cv.COMPONENT_SCHEMA.schema))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
output = None
|
for output_ in get_variable(config[CONF_OUTPUT]):
|
||||||
for output in get_variable(config[CONF_OUTPUT]):
|
|
||||||
yield
|
yield
|
||||||
rhs = App.make_binary_light(config[CONF_NAME], output)
|
rhs = App.make_binary_light(config[CONF_NAME], output_)
|
||||||
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
||||||
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config)
|
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config)
|
||||||
|
setup_component(light_struct.Pstate, config)
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return light.core_to_hass_config(data, config, brightness=False, rgb=False, color_temp=False,
|
||||||
|
white_value=False)
|
||||||
|
|
|
@ -1,25 +1,25 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import light
|
from esphomeyaml.components import light, output
|
||||||
from esphomeyaml.components.light.rgbww import validate_cold_white_colder, \
|
from esphomeyaml.components.light.rgbww import validate_cold_white_colder, \
|
||||||
validate_color_temperature
|
validate_color_temperature
|
||||||
from esphomeyaml.const import CONF_COLD_WHITE, CONF_COLD_WHITE_COLOR_TEMPERATURE, \
|
from esphomeyaml.const import CONF_COLD_WHITE, CONF_COLD_WHITE_COLOR_TEMPERATURE, \
|
||||||
CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_GAMMA_CORRECT, CONF_MAKE_ID, \
|
CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_GAMMA_CORRECT, CONF_MAKE_ID, \
|
||||||
CONF_NAME, CONF_WARM_WHITE, CONF_WARM_WHITE_COLOR_TEMPERATURE
|
CONF_NAME, CONF_WARM_WHITE, CONF_WARM_WHITE_COLOR_TEMPERATURE
|
||||||
from esphomeyaml.helpers import App, get_variable, variable
|
from esphomeyaml.helpers import App, get_variable, variable, setup_component
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight),
|
||||||
vol.Required(CONF_COLD_WHITE): cv.use_variable_id(None),
|
vol.Required(CONF_COLD_WHITE): cv.use_variable_id(output.FloatOutput),
|
||||||
vol.Required(CONF_WARM_WHITE): cv.use_variable_id(None),
|
vol.Required(CONF_WARM_WHITE): cv.use_variable_id(output.FloatOutput),
|
||||||
vol.Required(CONF_COLD_WHITE_COLOR_TEMPERATURE): validate_color_temperature,
|
vol.Required(CONF_COLD_WHITE_COLOR_TEMPERATURE): validate_color_temperature,
|
||||||
vol.Required(CONF_WARM_WHITE_COLOR_TEMPERATURE): validate_color_temperature,
|
vol.Required(CONF_WARM_WHITE_COLOR_TEMPERATURE): validate_color_temperature,
|
||||||
|
|
||||||
vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float,
|
vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float,
|
||||||
vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds,
|
vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds,
|
||||||
vol.Optional(CONF_EFFECTS): light.validate_effects(light.MONOCHROMATIC_EFFECTS),
|
vol.Optional(CONF_EFFECTS): light.validate_effects(light.MONOCHROMATIC_EFFECTS),
|
||||||
}), validate_cold_white_colder)
|
}).extend(cv.COMPONENT_SCHEMA.schema), validate_cold_white_colder)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
@ -32,3 +32,9 @@ def to_code(config):
|
||||||
cold_white, warm_white)
|
cold_white, warm_white)
|
||||||
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
||||||
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config)
|
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config)
|
||||||
|
setup_component(light_struct.Pstate, config)
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return light.core_to_hass_config(data, config, brightness=True, rgb=False, color_temp=True,
|
||||||
|
white_value=False)
|
||||||
|
|
|
@ -8,7 +8,7 @@ from esphomeyaml.const import CONF_CHIPSET, CONF_DEFAULT_TRANSITION_LENGTH, CONF
|
||||||
CONF_MAKE_ID, CONF_MAX_REFRESH_RATE, CONF_NAME, CONF_NUM_LEDS, CONF_PIN, CONF_POWER_SUPPLY, \
|
CONF_MAKE_ID, CONF_MAX_REFRESH_RATE, CONF_NAME, CONF_NUM_LEDS, CONF_PIN, CONF_POWER_SUPPLY, \
|
||||||
CONF_RGB_ORDER, CONF_EFFECTS, CONF_COLOR_CORRECT
|
CONF_RGB_ORDER, CONF_EFFECTS, CONF_COLOR_CORRECT
|
||||||
from esphomeyaml.helpers import App, Application, RawExpression, TemplateArguments, add, \
|
from esphomeyaml.helpers import App, Application, RawExpression, TemplateArguments, add, \
|
||||||
get_variable, variable
|
get_variable, variable, setup_component
|
||||||
|
|
||||||
TYPES = [
|
TYPES = [
|
||||||
'NEOPIXEL',
|
'NEOPIXEL',
|
||||||
|
@ -53,7 +53,7 @@ def validate(value):
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
MakeFastLEDLight = Application.MakeFastLEDLight
|
MakeFastLEDLight = Application.struct('MakeFastLEDLight')
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeFastLEDLight),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeFastLEDLight),
|
||||||
|
@ -70,7 +70,7 @@ PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
|
||||||
vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds,
|
vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds,
|
||||||
vol.Optional(CONF_POWER_SUPPLY): cv.use_variable_id(PowerSupplyComponent),
|
vol.Optional(CONF_POWER_SUPPLY): cv.use_variable_id(PowerSupplyComponent),
|
||||||
vol.Optional(CONF_EFFECTS): light.validate_effects(light.FASTLED_EFFECTS),
|
vol.Optional(CONF_EFFECTS): light.validate_effects(light.FASTLED_EFFECTS),
|
||||||
}), validate)
|
}).extend(cv.COMPONENT_SCHEMA.schema), validate)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
@ -89,7 +89,6 @@ def to_code(config):
|
||||||
add(fast_led.set_max_refresh_rate(config[CONF_MAX_REFRESH_RATE]))
|
add(fast_led.set_max_refresh_rate(config[CONF_MAX_REFRESH_RATE]))
|
||||||
|
|
||||||
if CONF_POWER_SUPPLY in config:
|
if CONF_POWER_SUPPLY in config:
|
||||||
power_supply = None
|
|
||||||
for power_supply in get_variable(config[CONF_POWER_SUPPLY]):
|
for power_supply in get_variable(config[CONF_POWER_SUPPLY]):
|
||||||
yield
|
yield
|
||||||
add(fast_led.set_power_supply(power_supply))
|
add(fast_led.set_power_supply(power_supply))
|
||||||
|
@ -99,6 +98,12 @@ def to_code(config):
|
||||||
add(fast_led.set_correction(r, g, b))
|
add(fast_led.set_correction(r, g, b))
|
||||||
|
|
||||||
light.setup_light(make.Pstate, make.Pmqtt, config)
|
light.setup_light(make.Pstate, make.Pmqtt, config)
|
||||||
|
setup_component(fast_led, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_FAST_LED_LIGHT'
|
BUILD_FLAGS = '-DUSE_FAST_LED_LIGHT'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return light.core_to_hass_config(data, config, brightness=True, rgb=True, color_temp=False,
|
||||||
|
white_value=False)
|
||||||
|
|
|
@ -8,7 +8,7 @@ from esphomeyaml.const import CONF_CHIPSET, CONF_CLOCK_PIN, CONF_DATA_PIN, \
|
||||||
CONF_DEFAULT_TRANSITION_LENGTH, CONF_GAMMA_CORRECT, CONF_MAKE_ID, CONF_MAX_REFRESH_RATE, \
|
CONF_DEFAULT_TRANSITION_LENGTH, CONF_GAMMA_CORRECT, CONF_MAKE_ID, CONF_MAX_REFRESH_RATE, \
|
||||||
CONF_NAME, CONF_NUM_LEDS, CONF_POWER_SUPPLY, CONF_RGB_ORDER, CONF_EFFECTS, CONF_COLOR_CORRECT
|
CONF_NAME, CONF_NUM_LEDS, CONF_POWER_SUPPLY, CONF_RGB_ORDER, CONF_EFFECTS, CONF_COLOR_CORRECT
|
||||||
from esphomeyaml.helpers import App, Application, RawExpression, TemplateArguments, add, \
|
from esphomeyaml.helpers import App, Application, RawExpression, TemplateArguments, add, \
|
||||||
get_variable, variable
|
get_variable, variable, setup_component
|
||||||
|
|
||||||
CHIPSETS = [
|
CHIPSETS = [
|
||||||
'LPD8806',
|
'LPD8806',
|
||||||
|
@ -30,7 +30,7 @@ RGB_ORDERS = [
|
||||||
'BGR',
|
'BGR',
|
||||||
]
|
]
|
||||||
|
|
||||||
MakeFastLEDLight = Application.MakeFastLEDLight
|
MakeFastLEDLight = Application.struct('MakeFastLEDLight')
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeFastLEDLight),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeFastLEDLight),
|
||||||
|
@ -48,7 +48,7 @@ PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
|
||||||
vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds,
|
vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds,
|
||||||
vol.Optional(CONF_POWER_SUPPLY): cv.use_variable_id(PowerSupplyComponent),
|
vol.Optional(CONF_POWER_SUPPLY): cv.use_variable_id(PowerSupplyComponent),
|
||||||
vol.Optional(CONF_EFFECTS): light.validate_effects(light.FASTLED_EFFECTS),
|
vol.Optional(CONF_EFFECTS): light.validate_effects(light.FASTLED_EFFECTS),
|
||||||
}))
|
}).extend(cv.COMPONENT_SCHEMA.schema))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
@ -69,7 +69,6 @@ def to_code(config):
|
||||||
add(fast_led.set_max_refresh_rate(config[CONF_MAX_REFRESH_RATE]))
|
add(fast_led.set_max_refresh_rate(config[CONF_MAX_REFRESH_RATE]))
|
||||||
|
|
||||||
if CONF_POWER_SUPPLY in config:
|
if CONF_POWER_SUPPLY in config:
|
||||||
power_supply = None
|
|
||||||
for power_supply in get_variable(config[CONF_POWER_SUPPLY]):
|
for power_supply in get_variable(config[CONF_POWER_SUPPLY]):
|
||||||
yield
|
yield
|
||||||
add(fast_led.set_power_supply(power_supply))
|
add(fast_led.set_power_supply(power_supply))
|
||||||
|
@ -79,6 +78,12 @@ def to_code(config):
|
||||||
add(fast_led.set_correction(r, g, b))
|
add(fast_led.set_correction(r, g, b))
|
||||||
|
|
||||||
light.setup_light(make.Pstate, make.Pmqtt, config)
|
light.setup_light(make.Pstate, make.Pmqtt, config)
|
||||||
|
setup_component(fast_led, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_FAST_LED_LIGHT'
|
BUILD_FLAGS = '-DUSE_FAST_LED_LIGHT'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return light.core_to_hass_config(data, config, brightness=True, rgb=True, color_temp=False,
|
||||||
|
white_value=False)
|
||||||
|
|
|
@ -1,24 +1,29 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
|
from esphomeyaml.components import light, output
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import light
|
from esphomeyaml.const import CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_GAMMA_CORRECT, \
|
||||||
from esphomeyaml.const import CONF_DEFAULT_TRANSITION_LENGTH, CONF_GAMMA_CORRECT, CONF_MAKE_ID, \
|
CONF_MAKE_ID, CONF_NAME, CONF_OUTPUT
|
||||||
CONF_NAME, CONF_OUTPUT, CONF_EFFECTS
|
from esphomeyaml.helpers import App, get_variable, setup_component, variable
|
||||||
from esphomeyaml.helpers import App, get_variable, variable
|
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight),
|
||||||
vol.Required(CONF_OUTPUT): cv.use_variable_id(None),
|
vol.Required(CONF_OUTPUT): cv.use_variable_id(output.FloatOutput),
|
||||||
vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float,
|
vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float,
|
||||||
vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds,
|
vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds,
|
||||||
vol.Optional(CONF_EFFECTS): light.validate_effects(light.MONOCHROMATIC_EFFECTS),
|
vol.Optional(CONF_EFFECTS): light.validate_effects(light.MONOCHROMATIC_EFFECTS),
|
||||||
}))
|
}).extend(cv.COMPONENT_SCHEMA.schema))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
output = None
|
for output_ in get_variable(config[CONF_OUTPUT]):
|
||||||
for output in get_variable(config[CONF_OUTPUT]):
|
|
||||||
yield
|
yield
|
||||||
rhs = App.make_monochromatic_light(config[CONF_NAME], output)
|
rhs = App.make_monochromatic_light(config[CONF_NAME], output_)
|
||||||
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
||||||
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config)
|
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config)
|
||||||
|
setup_component(light_struct.Pstate, config)
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return light.core_to_hass_config(data, config, brightness=True, rgb=False, color_temp=False,
|
||||||
|
white_value=False)
|
||||||
|
|
|
@ -1,32 +1,35 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import light
|
from esphomeyaml.components import light, output
|
||||||
from esphomeyaml.const import CONF_BLUE, CONF_DEFAULT_TRANSITION_LENGTH, CONF_GAMMA_CORRECT, \
|
from esphomeyaml.const import CONF_BLUE, CONF_DEFAULT_TRANSITION_LENGTH, CONF_GAMMA_CORRECT, \
|
||||||
CONF_GREEN, CONF_MAKE_ID, CONF_NAME, CONF_RED, CONF_EFFECTS
|
CONF_GREEN, CONF_MAKE_ID, CONF_NAME, CONF_RED, CONF_EFFECTS
|
||||||
from esphomeyaml.helpers import App, get_variable, variable
|
from esphomeyaml.helpers import App, get_variable, variable, setup_component
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight),
|
||||||
vol.Required(CONF_RED): cv.use_variable_id(None),
|
vol.Required(CONF_RED): cv.use_variable_id(output.FloatOutput),
|
||||||
vol.Required(CONF_GREEN): cv.use_variable_id(None),
|
vol.Required(CONF_GREEN): cv.use_variable_id(output.FloatOutput),
|
||||||
vol.Required(CONF_BLUE): cv.use_variable_id(None),
|
vol.Required(CONF_BLUE): cv.use_variable_id(output.FloatOutput),
|
||||||
vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float,
|
vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float,
|
||||||
vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds,
|
vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds,
|
||||||
vol.Optional(CONF_EFFECTS): light.validate_effects(light.RGB_EFFECTS),
|
vol.Optional(CONF_EFFECTS): light.validate_effects(light.RGB_EFFECTS),
|
||||||
}))
|
}).extend(cv.COMPONENT_SCHEMA.schema))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
red = None
|
|
||||||
for red in get_variable(config[CONF_RED]):
|
for red in get_variable(config[CONF_RED]):
|
||||||
yield
|
yield
|
||||||
green = None
|
|
||||||
for green in get_variable(config[CONF_GREEN]):
|
for green in get_variable(config[CONF_GREEN]):
|
||||||
yield
|
yield
|
||||||
blue = None
|
|
||||||
for blue in get_variable(config[CONF_BLUE]):
|
for blue in get_variable(config[CONF_BLUE]):
|
||||||
yield
|
yield
|
||||||
rhs = App.make_rgb_light(config[CONF_NAME], red, green, blue)
|
rhs = App.make_rgb_light(config[CONF_NAME], red, green, blue)
|
||||||
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
||||||
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config)
|
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config)
|
||||||
|
setup_component(light_struct.Pstate, config)
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return light.core_to_hass_config(data, config, brightness=True, rgb=True, color_temp=False,
|
||||||
|
white_value=False)
|
||||||
|
|
|
@ -1,36 +1,38 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import light
|
from esphomeyaml.components import light, output
|
||||||
from esphomeyaml.const import CONF_BLUE, CONF_DEFAULT_TRANSITION_LENGTH, CONF_GAMMA_CORRECT, \
|
from esphomeyaml.const import CONF_BLUE, CONF_DEFAULT_TRANSITION_LENGTH, CONF_GAMMA_CORRECT, \
|
||||||
CONF_GREEN, CONF_MAKE_ID, CONF_NAME, CONF_RED, CONF_WHITE, CONF_EFFECTS
|
CONF_GREEN, CONF_MAKE_ID, CONF_NAME, CONF_RED, CONF_WHITE, CONF_EFFECTS
|
||||||
from esphomeyaml.helpers import App, get_variable, variable
|
from esphomeyaml.helpers import App, get_variable, variable, setup_component
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight),
|
||||||
vol.Required(CONF_RED): cv.use_variable_id(None),
|
vol.Required(CONF_RED): cv.use_variable_id(output.FloatOutput),
|
||||||
vol.Required(CONF_GREEN): cv.use_variable_id(None),
|
vol.Required(CONF_GREEN): cv.use_variable_id(output.FloatOutput),
|
||||||
vol.Required(CONF_BLUE): cv.use_variable_id(None),
|
vol.Required(CONF_BLUE): cv.use_variable_id(output.FloatOutput),
|
||||||
vol.Required(CONF_WHITE): cv.use_variable_id(None),
|
vol.Required(CONF_WHITE): cv.use_variable_id(output.FloatOutput),
|
||||||
vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float,
|
vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float,
|
||||||
vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds,
|
vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds,
|
||||||
vol.Optional(CONF_EFFECTS): light.validate_effects(light.RGB_EFFECTS),
|
vol.Optional(CONF_EFFECTS): light.validate_effects(light.RGB_EFFECTS),
|
||||||
}))
|
}).extend(cv.COMPONENT_SCHEMA.schema))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
red = None
|
|
||||||
for red in get_variable(config[CONF_RED]):
|
for red in get_variable(config[CONF_RED]):
|
||||||
yield
|
yield
|
||||||
green = None
|
|
||||||
for green in get_variable(config[CONF_GREEN]):
|
for green in get_variable(config[CONF_GREEN]):
|
||||||
yield
|
yield
|
||||||
blue = None
|
|
||||||
for blue in get_variable(config[CONF_BLUE]):
|
for blue in get_variable(config[CONF_BLUE]):
|
||||||
yield
|
yield
|
||||||
white = None
|
|
||||||
for white in get_variable(config[CONF_WHITE]):
|
for white in get_variable(config[CONF_WHITE]):
|
||||||
yield
|
yield
|
||||||
rhs = App.make_rgbw_light(config[CONF_NAME], red, green, blue, white)
|
rhs = App.make_rgbw_light(config[CONF_NAME], red, green, blue, white)
|
||||||
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
||||||
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config)
|
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config)
|
||||||
|
setup_component(light_struct.Pstate, config)
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return light.core_to_hass_config(data, config, brightness=True, rgb=True, color_temp=False,
|
||||||
|
white_value=True)
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import light
|
from esphomeyaml.components import light, output
|
||||||
from esphomeyaml.const import CONF_BLUE, CONF_COLD_WHITE, CONF_COLD_WHITE_COLOR_TEMPERATURE, \
|
from esphomeyaml.const import CONF_BLUE, CONF_COLD_WHITE, CONF_COLD_WHITE_COLOR_TEMPERATURE, \
|
||||||
CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_GAMMA_CORRECT, CONF_GREEN, CONF_MAKE_ID, \
|
CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_GAMMA_CORRECT, CONF_GREEN, CONF_MAKE_ID, \
|
||||||
CONF_NAME, CONF_RED, CONF_WARM_WHITE, CONF_WARM_WHITE_COLOR_TEMPERATURE
|
CONF_NAME, CONF_RED, CONF_WARM_WHITE, CONF_WARM_WHITE_COLOR_TEMPERATURE
|
||||||
from esphomeyaml.helpers import App, get_variable, variable
|
from esphomeyaml.helpers import App, get_variable, variable, setup_component
|
||||||
|
|
||||||
|
|
||||||
def validate_color_temperature(value):
|
def validate_color_temperature(value):
|
||||||
|
@ -30,18 +30,18 @@ def validate_cold_white_colder(value):
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight),
|
||||||
vol.Required(CONF_RED): cv.use_variable_id(None),
|
vol.Required(CONF_RED): cv.use_variable_id(output.FloatOutput),
|
||||||
vol.Required(CONF_GREEN): cv.use_variable_id(None),
|
vol.Required(CONF_GREEN): cv.use_variable_id(output.FloatOutput),
|
||||||
vol.Required(CONF_BLUE): cv.use_variable_id(None),
|
vol.Required(CONF_BLUE): cv.use_variable_id(output.FloatOutput),
|
||||||
vol.Required(CONF_COLD_WHITE): cv.use_variable_id(None),
|
vol.Required(CONF_COLD_WHITE): cv.use_variable_id(output.FloatOutput),
|
||||||
vol.Required(CONF_WARM_WHITE): cv.use_variable_id(None),
|
vol.Required(CONF_WARM_WHITE): cv.use_variable_id(output.FloatOutput),
|
||||||
vol.Required(CONF_COLD_WHITE_COLOR_TEMPERATURE): validate_color_temperature,
|
vol.Required(CONF_COLD_WHITE_COLOR_TEMPERATURE): validate_color_temperature,
|
||||||
vol.Required(CONF_WARM_WHITE_COLOR_TEMPERATURE): validate_color_temperature,
|
vol.Required(CONF_WARM_WHITE_COLOR_TEMPERATURE): validate_color_temperature,
|
||||||
|
|
||||||
vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float,
|
vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float,
|
||||||
vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds,
|
vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds,
|
||||||
vol.Optional(CONF_EFFECTS): light.validate_effects(light.RGB_EFFECTS),
|
vol.Optional(CONF_EFFECTS): light.validate_effects(light.RGB_EFFECTS),
|
||||||
}), validate_cold_white_colder)
|
}).extend(cv.COMPONENT_SCHEMA.schema), validate_cold_white_colder)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
@ -60,3 +60,9 @@ def to_code(config):
|
||||||
red, green, blue, cold_white, warm_white)
|
red, green, blue, cold_white, warm_white)
|
||||||
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
light_struct = variable(config[CONF_MAKE_ID], rhs)
|
||||||
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config)
|
light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config)
|
||||||
|
setup_component(light_struct.Pstate, config)
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return light.core_to_hass_config(data, config, brightness=True, rgb=True, color_temp=True,
|
||||||
|
white_value=True)
|
||||||
|
|
|
@ -7,8 +7,8 @@ import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.const import CONF_ARGS, CONF_BAUD_RATE, CONF_FORMAT, CONF_ID, CONF_LEVEL, \
|
from esphomeyaml.const import CONF_ARGS, CONF_BAUD_RATE, CONF_FORMAT, CONF_ID, CONF_LEVEL, \
|
||||||
CONF_LOGS, CONF_TAG, CONF_TX_BUFFER_SIZE
|
CONF_LOGS, CONF_TAG, CONF_TX_BUFFER_SIZE
|
||||||
from esphomeyaml.core import ESPHomeYAMLError, Lambda
|
from esphomeyaml.core import ESPHomeYAMLError, Lambda
|
||||||
from esphomeyaml.helpers import App, Pvariable, TemplateArguments, add, esphomelib_ns, global_ns, \
|
from esphomeyaml.helpers import App, Pvariable, RawExpression, TemplateArguments, add, \
|
||||||
process_lambda, RawExpression, statement
|
esphomelib_ns, global_ns, process_lambda, statement, Component
|
||||||
|
|
||||||
LOG_LEVELS = {
|
LOG_LEVELS = {
|
||||||
'NONE': global_ns.ESPHOMELIB_LOG_LEVEL_NONE,
|
'NONE': global_ns.ESPHOMELIB_LOG_LEVEL_NONE,
|
||||||
|
@ -44,7 +44,7 @@ def validate_local_no_higher_than_global(value):
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
LogComponent = esphomelib_ns.LogComponent
|
LogComponent = esphomelib_ns.class_('LogComponent', Component)
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.All(vol.Schema({
|
CONFIG_SCHEMA = vol.All(vol.Schema({
|
||||||
cv.GenerateID(): cv.declare_variable_id(LogComponent),
|
cv.GenerateID(): cv.declare_variable_id(LogComponent),
|
||||||
|
@ -79,6 +79,7 @@ def maybe_simple_message(schema):
|
||||||
if isinstance(value, dict):
|
if isinstance(value, dict):
|
||||||
return vol.Schema(schema)(value)
|
return vol.Schema(schema)(value)
|
||||||
return vol.Schema(schema)({CONF_FORMAT: value})
|
return vol.Schema(schema)({CONF_FORMAT: value})
|
||||||
|
|
||||||
return validator
|
return validator
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
from collections import OrderedDict
|
||||||
import re
|
import re
|
||||||
|
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
@ -10,10 +11,13 @@ from esphomeyaml.const import CONF_BIRTH_MESSAGE, CONF_BROKER, CONF_CLIENT_ID, C
|
||||||
CONF_DISCOVERY_PREFIX, CONF_DISCOVERY_RETAIN, CONF_ID, CONF_KEEPALIVE, CONF_LEVEL, \
|
CONF_DISCOVERY_PREFIX, CONF_DISCOVERY_RETAIN, CONF_ID, CONF_KEEPALIVE, CONF_LEVEL, \
|
||||||
CONF_LOG_TOPIC, CONF_ON_MESSAGE, CONF_PASSWORD, CONF_PAYLOAD, CONF_PORT, CONF_QOS, \
|
CONF_LOG_TOPIC, CONF_ON_MESSAGE, CONF_PASSWORD, CONF_PAYLOAD, CONF_PORT, CONF_QOS, \
|
||||||
CONF_REBOOT_TIMEOUT, CONF_RETAIN, CONF_SHUTDOWN_MESSAGE, CONF_SSL_FINGERPRINTS, CONF_TOPIC, \
|
CONF_REBOOT_TIMEOUT, CONF_RETAIN, CONF_SHUTDOWN_MESSAGE, CONF_SSL_FINGERPRINTS, CONF_TOPIC, \
|
||||||
CONF_TOPIC_PREFIX, CONF_TRIGGER_ID, CONF_USERNAME, CONF_WILL_MESSAGE, CONF_ON_JSON_MESSAGE
|
CONF_TOPIC_PREFIX, CONF_TRIGGER_ID, CONF_USERNAME, CONF_WILL_MESSAGE, CONF_ON_JSON_MESSAGE, \
|
||||||
|
CONF_STATE_TOPIC, CONF_MQTT, CONF_ESPHOMEYAML, CONF_NAME, CONF_AVAILABILITY, \
|
||||||
|
CONF_PAYLOAD_AVAILABLE, CONF_PAYLOAD_NOT_AVAILABLE, CONF_INTERNAL
|
||||||
|
from esphomeyaml.core import ESPHomeYAMLError
|
||||||
from esphomeyaml.helpers import App, ArrayInitializer, Pvariable, RawExpression, \
|
from esphomeyaml.helpers import App, ArrayInitializer, Pvariable, RawExpression, \
|
||||||
StructInitializer, TemplateArguments, add, esphomelib_ns, optional, std_string, templatable, \
|
StructInitializer, TemplateArguments, add, esphomelib_ns, optional, std_string, templatable, \
|
||||||
uint8, bool_, JsonObjectRef, process_lambda, JsonObjectConstRef
|
uint8, bool_, JsonObjectRef, process_lambda, JsonObjectConstRef, Component, Action, Trigger
|
||||||
|
|
||||||
|
|
||||||
def validate_message_just_topic(value):
|
def validate_message_just_topic(value):
|
||||||
|
@ -34,12 +38,14 @@ MQTT_MESSAGE_SCHEMA = vol.Any(None, MQTT_MESSAGE_BASE.extend({
|
||||||
}))
|
}))
|
||||||
|
|
||||||
mqtt_ns = esphomelib_ns.namespace('mqtt')
|
mqtt_ns = esphomelib_ns.namespace('mqtt')
|
||||||
MQTTMessage = mqtt_ns.MQTTMessage
|
MQTTMessage = mqtt_ns.struct('MQTTMessage')
|
||||||
MQTTClientComponent = mqtt_ns.MQTTClientComponent
|
MQTTClientComponent = mqtt_ns.class_('MQTTClientComponent', Component)
|
||||||
MQTTPublishAction = mqtt_ns.MQTTPublishAction
|
MQTTPublishAction = mqtt_ns.class_('MQTTPublishAction', Action)
|
||||||
MQTTPublishJsonAction = mqtt_ns.MQTTPublishJsonAction
|
MQTTPublishJsonAction = mqtt_ns.class_('MQTTPublishJsonAction', Action)
|
||||||
MQTTMessageTrigger = mqtt_ns.MQTTMessageTrigger
|
MQTTMessageTrigger = mqtt_ns.class_('MQTTMessageTrigger', Trigger.template(std_string))
|
||||||
MQTTJsonMessageTrigger = mqtt_ns.MQTTJsonMessageTrigger
|
MQTTJsonMessageTrigger = mqtt_ns.class_('MQTTJsonMessageTrigger',
|
||||||
|
Trigger.template(JsonObjectConstRef))
|
||||||
|
MQTTComponent = mqtt_ns.class_('MQTTComponent', Component)
|
||||||
|
|
||||||
|
|
||||||
def validate_broker(value):
|
def validate_broker(value):
|
||||||
|
@ -239,3 +245,66 @@ def required_build_flags(config):
|
||||||
if CONF_SSL_FINGERPRINTS in config:
|
if CONF_SSL_FINGERPRINTS in config:
|
||||||
return '-DASYNC_TCP_SSL_ENABLED=1'
|
return '-DASYNC_TCP_SSL_ENABLED=1'
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def get_default_topic_for(data, component_type, name, suffix):
|
||||||
|
whitelist = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_'
|
||||||
|
sanitized_name = ''.join(x for x in name.lower().replace(' ', '_') if x in whitelist)
|
||||||
|
return '{}/{}/{}/{}'.format(data.topic_prefix, component_type,
|
||||||
|
sanitized_name, suffix)
|
||||||
|
|
||||||
|
|
||||||
|
def build_hass_config(data, component_type, config, include_state=True, include_command=True,
|
||||||
|
platform='mqtt'):
|
||||||
|
if config.get(CONF_INTERNAL, False):
|
||||||
|
return None
|
||||||
|
ret = OrderedDict()
|
||||||
|
ret['platform'] = platform
|
||||||
|
ret['name'] = config[CONF_NAME]
|
||||||
|
if include_state:
|
||||||
|
default = get_default_topic_for(data, component_type, config[CONF_NAME], 'state')
|
||||||
|
ret['state_topic'] = config.get(CONF_STATE_TOPIC, default)
|
||||||
|
if include_command:
|
||||||
|
default = get_default_topic_for(data, component_type, config[CONF_NAME], 'command')
|
||||||
|
ret['command_topic'] = config.get(CONF_STATE_TOPIC, default)
|
||||||
|
avail = config.get(CONF_AVAILABILITY, data.availability)
|
||||||
|
if avail:
|
||||||
|
ret['availability_topic'] = avail[CONF_TOPIC]
|
||||||
|
payload_available = avail[CONF_PAYLOAD_AVAILABLE]
|
||||||
|
if payload_available != 'online':
|
||||||
|
ret['payload_available'] = payload_available
|
||||||
|
payload_not_available = avail[CONF_PAYLOAD_NOT_AVAILABLE]
|
||||||
|
if payload_not_available != 'offline':
|
||||||
|
ret['payload_not_available'] = payload_not_available
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
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!")
|
||||||
|
mqtt = config[CONF_MQTT]
|
||||||
|
self.topic_prefix = mqtt.get(CONF_TOPIC_PREFIX, config[CONF_ESPHOMEYAML][CONF_NAME])
|
||||||
|
birth_message = mqtt.get(CONF_BIRTH_MESSAGE)
|
||||||
|
if CONF_BIRTH_MESSAGE not in mqtt:
|
||||||
|
birth_message = {
|
||||||
|
CONF_TOPIC: self.topic_prefix + '/status',
|
||||||
|
CONF_PAYLOAD: 'online',
|
||||||
|
}
|
||||||
|
will_message = mqtt.get(CONF_WILL_MESSAGE)
|
||||||
|
if CONF_WILL_MESSAGE not in mqtt:
|
||||||
|
will_message = {
|
||||||
|
CONF_TOPIC: self.topic_prefix + '/status',
|
||||||
|
CONF_PAYLOAD: 'offline'
|
||||||
|
}
|
||||||
|
if not birth_message or not will_message:
|
||||||
|
self.availability = None
|
||||||
|
elif birth_message[CONF_TOPIC] != will_message[CONF_TOPIC]:
|
||||||
|
self.availability = None
|
||||||
|
else:
|
||||||
|
self.availability = {
|
||||||
|
CONF_TOPIC: birth_message[CONF_TOPIC],
|
||||||
|
CONF_PAYLOAD_AVAILABLE: birth_message[CONF_PAYLOAD],
|
||||||
|
CONF_PAYLOAD_NOT_AVAILABLE: will_message[CONF_PAYLOAD],
|
||||||
|
}
|
||||||
|
|
52
esphomeyaml/components/my9231.py
Normal file
52
esphomeyaml/components/my9231.py
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
import voluptuous as vol
|
||||||
|
|
||||||
|
import esphomeyaml.config_validation as cv
|
||||||
|
from esphomeyaml import pins
|
||||||
|
from esphomeyaml.components import output
|
||||||
|
from esphomeyaml.const import (CONF_DATA_PIN, CONF_CLOCK_PIN, CONF_NUM_CHANNELS,
|
||||||
|
CONF_NUM_CHIPS, CONF_BIT_DEPTH, CONF_ID,
|
||||||
|
CONF_UPDATE_ON_BOOT)
|
||||||
|
from esphomeyaml.helpers import (gpio_output_pin_expression, App, Pvariable,
|
||||||
|
add, setup_component, Component)
|
||||||
|
|
||||||
|
MY9231OutputComponent = output.output_ns.class_('MY9231OutputComponent', Component)
|
||||||
|
|
||||||
|
|
||||||
|
MY9231_SCHEMA = vol.Schema({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(MY9231OutputComponent),
|
||||||
|
vol.Required(CONF_DATA_PIN): pins.gpio_output_pin_schema,
|
||||||
|
vol.Required(CONF_CLOCK_PIN): pins.gpio_output_pin_schema,
|
||||||
|
vol.Optional(CONF_NUM_CHANNELS): vol.All(vol.Coerce(int),
|
||||||
|
vol.Range(3, 1020)),
|
||||||
|
vol.Optional(CONF_NUM_CHIPS): vol.All(vol.Coerce(int),
|
||||||
|
vol.Range(1, 255)),
|
||||||
|
vol.Optional(CONF_BIT_DEPTH): vol.All(vol.Coerce(int),
|
||||||
|
cv.one_of(8, 12, 14, 16)),
|
||||||
|
vol.Optional(CONF_UPDATE_ON_BOOT): vol.Coerce(bool),
|
||||||
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
CONFIG_SCHEMA = vol.All(cv.ensure_list, [MY9231_SCHEMA])
|
||||||
|
|
||||||
|
|
||||||
|
def to_code(config):
|
||||||
|
for conf in config:
|
||||||
|
di = None
|
||||||
|
for di in gpio_output_pin_expression(conf[CONF_DATA_PIN]):
|
||||||
|
yield
|
||||||
|
dcki = None
|
||||||
|
for dcki in gpio_output_pin_expression(conf[CONF_CLOCK_PIN]):
|
||||||
|
yield
|
||||||
|
rhs = App.make_my9231_component(di, dcki)
|
||||||
|
my9231 = Pvariable(conf[CONF_ID], rhs)
|
||||||
|
if CONF_NUM_CHANNELS in conf:
|
||||||
|
add(my9231.set_num_channels(conf[CONF_NUM_CHANNELS]))
|
||||||
|
if CONF_NUM_CHIPS in conf:
|
||||||
|
add(my9231.set_num_chips(conf[CONF_NUM_CHIPS]))
|
||||||
|
if CONF_BIT_DEPTH in conf:
|
||||||
|
add(my9231.set_bit_depth(conf[CONF_BIT_DEPTH]))
|
||||||
|
if CONF_UPDATE_ON_BOOT in conf:
|
||||||
|
add(my9231.set_update(conf[CONF_UPDATE_ON_BOOT]))
|
||||||
|
setup_component(my9231, conf)
|
||||||
|
|
||||||
|
|
||||||
|
BUILD_FLAGS = '-DUSE_MY9231_OUTPUT'
|
|
@ -7,16 +7,15 @@ import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.const import CONF_ID, CONF_OTA, CONF_PASSWORD, CONF_PORT, CONF_SAFE_MODE, \
|
from esphomeyaml.const import CONF_ID, CONF_OTA, CONF_PASSWORD, CONF_PORT, CONF_SAFE_MODE, \
|
||||||
ESP_PLATFORM_ESP32, ESP_PLATFORM_ESP8266
|
ESP_PLATFORM_ESP32, ESP_PLATFORM_ESP8266
|
||||||
from esphomeyaml.core import ESPHomeYAMLError
|
from esphomeyaml.core import ESPHomeYAMLError
|
||||||
from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns
|
from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns, Component
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
OTAComponent = esphomelib_ns.OTAComponent
|
OTAComponent = esphomelib_ns.class_('OTAComponent', Component)
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.Schema({
|
CONFIG_SCHEMA = vol.Schema({
|
||||||
cv.GenerateID(): cv.declare_variable_id(OTAComponent),
|
cv.GenerateID(): cv.declare_variable_id(OTAComponent),
|
||||||
vol.Optional(CONF_SAFE_MODE, default=True): cv.boolean,
|
vol.Optional(CONF_SAFE_MODE, default=True): cv.boolean,
|
||||||
# TODO Num attempts + wait time
|
|
||||||
vol.Optional(CONF_PORT): cv.port,
|
vol.Optional(CONF_PORT): cv.port,
|
||||||
vol.Optional(CONF_PASSWORD): cv.string,
|
vol.Optional(CONF_PASSWORD): cv.string,
|
||||||
})
|
})
|
||||||
|
|
|
@ -5,7 +5,7 @@ import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components.power_supply import PowerSupplyComponent
|
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.const import CONF_INVERTED, CONF_MAX_POWER, CONF_POWER_SUPPLY, CONF_ID, CONF_LEVEL
|
||||||
from esphomeyaml.helpers import add, esphomelib_ns, get_variable, TemplateArguments, Pvariable, \
|
from esphomeyaml.helpers import add, esphomelib_ns, get_variable, TemplateArguments, Pvariable, \
|
||||||
templatable, bool_
|
templatable, float_, add_job, Action
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
|
||||||
|
|
||||||
|
@ -25,9 +25,13 @@ FLOAT_OUTPUT_SCHEMA = BINARY_OUTPUT_SCHEMA.extend({
|
||||||
FLOAT_OUTPUT_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(FLOAT_OUTPUT_SCHEMA.schema)
|
FLOAT_OUTPUT_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(FLOAT_OUTPUT_SCHEMA.schema)
|
||||||
|
|
||||||
output_ns = esphomelib_ns.namespace('output')
|
output_ns = esphomelib_ns.namespace('output')
|
||||||
TurnOffAction = output_ns.TurnOffAction
|
BinaryOutput = output_ns.class_('BinaryOutput')
|
||||||
TurnOnAction = output_ns.TurnOnAction
|
FloatOutput = output_ns.class_('FloatOutput', BinaryOutput)
|
||||||
SetLevelAction = output_ns.SetLevelAction
|
|
||||||
|
# Actions
|
||||||
|
TurnOffAction = output_ns.class_('TurnOffAction', Action)
|
||||||
|
TurnOnAction = output_ns.class_('TurnOnAction', Action)
|
||||||
|
SetLevelAction = output_ns.class_('SetLevelAction', Action)
|
||||||
|
|
||||||
|
|
||||||
def setup_output_platform_(obj, config, skip_power_supply=False):
|
def setup_output_platform_(obj, config, skip_power_supply=False):
|
||||||
|
@ -43,37 +47,20 @@ def setup_output_platform_(obj, config, skip_power_supply=False):
|
||||||
|
|
||||||
|
|
||||||
def setup_output_platform(obj, config, skip_power_supply=False):
|
def setup_output_platform(obj, config, skip_power_supply=False):
|
||||||
for _ in setup_output_platform_(obj, config, skip_power_supply):
|
add_job(setup_output_platform_, obj, config, skip_power_supply)
|
||||||
yield
|
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_OUTPUT'
|
BUILD_FLAGS = '-DUSE_OUTPUT'
|
||||||
|
|
||||||
|
|
||||||
CONF_OUTPUT_TURN_ON = 'output.turn_on'
|
CONF_OUTPUT_TURN_ON = 'output.turn_on'
|
||||||
OUTPUT_TURN_OFF_ACTION = maybe_simple_id({
|
|
||||||
vol.Required(CONF_ID): cv.use_variable_id(None),
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
@ACTION_REGISTRY.register(CONF_OUTPUT_TURN_ON, OUTPUT_TURN_OFF_ACTION)
|
|
||||||
def output_turn_on_to_code(config, action_id, arg_type):
|
|
||||||
template_arg = TemplateArguments(arg_type)
|
|
||||||
for var in get_variable(config[CONF_ID]):
|
|
||||||
yield None
|
|
||||||
rhs = var.make_turn_off_action(template_arg)
|
|
||||||
type = TurnOffAction.template(arg_type)
|
|
||||||
yield Pvariable(action_id, rhs, type=type)
|
|
||||||
|
|
||||||
|
|
||||||
CONF_OUTPUT_TURN_OFF = 'output.turn_off'
|
|
||||||
OUTPUT_TURN_ON_ACTION = maybe_simple_id({
|
OUTPUT_TURN_ON_ACTION = maybe_simple_id({
|
||||||
vol.Required(CONF_ID): cv.use_variable_id(None)
|
vol.Required(CONF_ID): cv.use_variable_id(BinaryOutput),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
@ACTION_REGISTRY.register(CONF_OUTPUT_TURN_OFF, OUTPUT_TURN_ON_ACTION)
|
@ACTION_REGISTRY.register(CONF_OUTPUT_TURN_ON, OUTPUT_TURN_ON_ACTION)
|
||||||
def output_turn_off_to_code(config, action_id, arg_type):
|
def output_turn_on_to_code(config, action_id, arg_type):
|
||||||
template_arg = TemplateArguments(arg_type)
|
template_arg = TemplateArguments(arg_type)
|
||||||
for var in get_variable(config[CONF_ID]):
|
for var in get_variable(config[CONF_ID]):
|
||||||
yield None
|
yield None
|
||||||
|
@ -82,10 +69,26 @@ def output_turn_off_to_code(config, action_id, arg_type):
|
||||||
yield Pvariable(action_id, rhs, type=type)
|
yield Pvariable(action_id, rhs, type=type)
|
||||||
|
|
||||||
|
|
||||||
|
CONF_OUTPUT_TURN_OFF = 'output.turn_off'
|
||||||
|
OUTPUT_TURN_OFF_ACTION = maybe_simple_id({
|
||||||
|
vol.Required(CONF_ID): cv.use_variable_id(BinaryOutput)
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@ACTION_REGISTRY.register(CONF_OUTPUT_TURN_OFF, OUTPUT_TURN_OFF_ACTION)
|
||||||
|
def output_turn_off_to_code(config, action_id, arg_type):
|
||||||
|
template_arg = TemplateArguments(arg_type)
|
||||||
|
for var in get_variable(config[CONF_ID]):
|
||||||
|
yield None
|
||||||
|
rhs = var.make_turn_off_action(template_arg)
|
||||||
|
type = TurnOffAction.template(arg_type)
|
||||||
|
yield Pvariable(action_id, rhs, type=type)
|
||||||
|
|
||||||
|
|
||||||
CONF_OUTPUT_SET_LEVEL = 'output.set_level'
|
CONF_OUTPUT_SET_LEVEL = 'output.set_level'
|
||||||
OUTPUT_SET_LEVEL_ACTION = vol.Schema({
|
OUTPUT_SET_LEVEL_ACTION = vol.Schema({
|
||||||
vol.Required(CONF_ID): cv.use_variable_id(None),
|
vol.Required(CONF_ID): cv.use_variable_id(FloatOutput),
|
||||||
vol.Required(CONF_LEVEL): cv.percentage,
|
vol.Required(CONF_LEVEL): cv.templatable(cv.percentage),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@ -97,7 +100,7 @@ def output_set_level_to_code(config, action_id, arg_type):
|
||||||
rhs = var.make_set_level_action(template_arg)
|
rhs = var.make_set_level_action(template_arg)
|
||||||
type = SetLevelAction.template(arg_type)
|
type = SetLevelAction.template(arg_type)
|
||||||
action = Pvariable(action_id, rhs, type=type)
|
action = Pvariable(action_id, rhs, type=type)
|
||||||
for template_ in templatable(config[CONF_LEVEL], arg_type, bool_):
|
for template_ in templatable(config[CONF_LEVEL], arg_type, float_):
|
||||||
yield None
|
yield None
|
||||||
add(action.set_level(template_))
|
add(action.set_level(template_))
|
||||||
yield action
|
yield action
|
||||||
|
|
|
@ -1,36 +1,41 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from esphomeyaml import pins
|
from esphomeyaml import pins
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml.components import output
|
from esphomeyaml.components import output
|
||||||
from esphomeyaml.const import CONF_ID, CONF_NUMBER, CONF_PIN, ESP_PLATFORM_ESP8266
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.core import ESPHomeYAMLError
|
from esphomeyaml.const import CONF_ID, CONF_NUMBER, CONF_PIN, ESP_PLATFORM_ESP8266, CONF_FREQUENCY
|
||||||
from esphomeyaml.helpers import App, Pvariable, gpio_output_pin_expression
|
from esphomeyaml.helpers import App, Component, Pvariable, gpio_output_pin_expression, \
|
||||||
|
setup_component, add
|
||||||
|
|
||||||
ESP_PLATFORMS = [ESP_PLATFORM_ESP8266]
|
ESP_PLATFORMS = [ESP_PLATFORM_ESP8266]
|
||||||
|
|
||||||
|
|
||||||
def valid_pwm_pin(value):
|
def valid_pwm_pin(value):
|
||||||
if value[CONF_NUMBER] > 16:
|
num = value[CONF_NUMBER]
|
||||||
raise ESPHomeYAMLError(u"ESP8266: Only pins 0-16 support PWM.")
|
cv.one_of(0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16)(num)
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
ESP8266PWMOutput = output.output_ns.ESP8266PWMOutput
|
ESP8266PWMOutput = output.output_ns.class_('ESP8266PWMOutput', output.FloatOutput, Component)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = output.FLOAT_OUTPUT_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = output.FLOAT_OUTPUT_PLATFORM_SCHEMA.extend({
|
||||||
vol.Required(CONF_ID): cv.declare_variable_id(ESP8266PWMOutput),
|
vol.Required(CONF_ID): cv.declare_variable_id(ESP8266PWMOutput),
|
||||||
vol.Required(CONF_PIN): vol.All(pins.internal_gpio_output_pin_schema, valid_pwm_pin),
|
vol.Required(CONF_PIN): vol.All(pins.internal_gpio_output_pin_schema, valid_pwm_pin),
|
||||||
})
|
vol.Optional(CONF_FREQUENCY): vol.All(cv.frequency, vol.Range(min=1.0e-6)),
|
||||||
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
pin = None
|
|
||||||
for pin in gpio_output_pin_expression(config[CONF_PIN]):
|
for pin in gpio_output_pin_expression(config[CONF_PIN]):
|
||||||
yield
|
yield
|
||||||
rhs = App.make_esp8266_pwm_output(pin)
|
rhs = App.make_esp8266_pwm_output(pin)
|
||||||
gpio = Pvariable(config[CONF_ID], rhs)
|
gpio = Pvariable(config[CONF_ID], rhs)
|
||||||
|
|
||||||
|
if CONF_FREQUENCY in config:
|
||||||
|
add(gpio.set_frequency(config[CONF_FREQUENCY]))
|
||||||
|
|
||||||
output.setup_output_platform(gpio, config)
|
output.setup_output_platform(gpio, config)
|
||||||
|
setup_component(gpio, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_ESP8266_PWM_OUTPUT'
|
BUILD_FLAGS = '-DUSE_ESP8266_PWM_OUTPUT'
|
||||||
|
|
|
@ -4,23 +4,25 @@ from esphomeyaml import pins
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import output
|
from esphomeyaml.components import output
|
||||||
from esphomeyaml.const import CONF_ID, CONF_PIN
|
from esphomeyaml.const import CONF_ID, CONF_PIN
|
||||||
from esphomeyaml.helpers import App, Pvariable, gpio_output_pin_expression
|
from esphomeyaml.helpers import App, Pvariable, gpio_output_pin_expression, setup_component, \
|
||||||
|
Component
|
||||||
|
|
||||||
GPIOBinaryOutputComponent = output.output_ns.GPIOBinaryOutputComponent
|
GPIOBinaryOutputComponent = output.output_ns.class_('GPIOBinaryOutputComponent',
|
||||||
|
output.BinaryOutput, Component)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = output.BINARY_OUTPUT_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = output.BINARY_OUTPUT_PLATFORM_SCHEMA.extend({
|
||||||
vol.Required(CONF_ID): cv.declare_variable_id(GPIOBinaryOutputComponent),
|
vol.Required(CONF_ID): cv.declare_variable_id(GPIOBinaryOutputComponent),
|
||||||
vol.Required(CONF_PIN): pins.gpio_output_pin_schema,
|
vol.Required(CONF_PIN): pins.gpio_output_pin_schema,
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
pin = None
|
|
||||||
for pin in gpio_output_pin_expression(config[CONF_PIN]):
|
for pin in gpio_output_pin_expression(config[CONF_PIN]):
|
||||||
yield
|
yield
|
||||||
rhs = App.make_gpio_output(pin)
|
rhs = App.make_gpio_output(pin)
|
||||||
gpio = Pvariable(config[CONF_ID], rhs)
|
gpio = Pvariable(config[CONF_ID], rhs)
|
||||||
output.setup_output_platform(gpio, config)
|
output.setup_output_platform(gpio, config)
|
||||||
|
setup_component(gpio, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_GPIO_OUTPUT'
|
BUILD_FLAGS = '-DUSE_GPIO_OUTPUT'
|
||||||
|
|
|
@ -5,7 +5,7 @@ from esphomeyaml import pins
|
||||||
from esphomeyaml.components import output
|
from esphomeyaml.components import output
|
||||||
from esphomeyaml.const import APB_CLOCK_FREQ, CONF_BIT_DEPTH, CONF_CHANNEL, CONF_FREQUENCY, \
|
from esphomeyaml.const import APB_CLOCK_FREQ, CONF_BIT_DEPTH, CONF_CHANNEL, CONF_FREQUENCY, \
|
||||||
CONF_ID, CONF_PIN, ESP_PLATFORM_ESP32
|
CONF_ID, CONF_PIN, ESP_PLATFORM_ESP32
|
||||||
from esphomeyaml.helpers import App, Pvariable, add
|
from esphomeyaml.helpers import App, Pvariable, add, setup_component, Component
|
||||||
|
|
||||||
ESP_PLATFORMS = [ESP_PLATFORM_ESP32]
|
ESP_PLATFORMS = [ESP_PLATFORM_ESP32]
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ def validate_frequency_bit_depth(obj):
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
|
||||||
LEDCOutputComponent = output.output_ns.LEDCOutputComponent
|
LEDCOutputComponent = output.output_ns.class_('LEDCOutputComponent', output.FloatOutput, Component)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = vol.All(output.FLOAT_OUTPUT_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = vol.All(output.FLOAT_OUTPUT_PLATFORM_SCHEMA.extend({
|
||||||
vol.Required(CONF_ID): cv.declare_variable_id(LEDCOutputComponent),
|
vol.Required(CONF_ID): cv.declare_variable_id(LEDCOutputComponent),
|
||||||
|
@ -27,7 +27,7 @@ PLATFORM_SCHEMA = vol.All(output.FLOAT_OUTPUT_PLATFORM_SCHEMA.extend({
|
||||||
vol.Optional(CONF_FREQUENCY): cv.frequency,
|
vol.Optional(CONF_FREQUENCY): cv.frequency,
|
||||||
vol.Optional(CONF_BIT_DEPTH): vol.All(vol.Coerce(int), vol.Range(min=1, max=15)),
|
vol.Optional(CONF_BIT_DEPTH): vol.All(vol.Coerce(int), vol.Range(min=1, max=15)),
|
||||||
vol.Optional(CONF_CHANNEL): vol.All(vol.Coerce(int), vol.Range(min=0, max=15))
|
vol.Optional(CONF_CHANNEL): vol.All(vol.Coerce(int), vol.Range(min=0, max=15))
|
||||||
}), validate_frequency_bit_depth)
|
}).extend(cv.COMPONENT_SCHEMA.schema), validate_frequency_bit_depth)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
@ -39,6 +39,7 @@ def to_code(config):
|
||||||
if CONF_CHANNEL in config:
|
if CONF_CHANNEL in config:
|
||||||
add(ledc.set_channel(config[CONF_CHANNEL]))
|
add(ledc.set_channel(config[CONF_CHANNEL]))
|
||||||
output.setup_output_platform(ledc, config)
|
output.setup_output_platform(ledc, config)
|
||||||
|
setup_component(ledc, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_LEDC_OUTPUT'
|
BUILD_FLAGS = '-DUSE_LEDC_OUTPUT'
|
||||||
|
|
35
esphomeyaml/components/output/my9231.py
Normal file
35
esphomeyaml/components/output/my9231.py
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
import voluptuous as vol
|
||||||
|
|
||||||
|
import esphomeyaml.config_validation as cv
|
||||||
|
from esphomeyaml.components import output
|
||||||
|
from esphomeyaml.components.my9231 import MY9231OutputComponent
|
||||||
|
from esphomeyaml.const import CONF_CHANNEL, CONF_ID, CONF_MY9231_ID, CONF_POWER_SUPPLY
|
||||||
|
from esphomeyaml.helpers import Pvariable, get_variable, setup_component
|
||||||
|
|
||||||
|
DEPENDENCIES = ['my9231']
|
||||||
|
|
||||||
|
Channel = MY9231OutputComponent.class_('Channel', output.FloatOutput)
|
||||||
|
|
||||||
|
PLATFORM_SCHEMA = output.FLOAT_OUTPUT_PLATFORM_SCHEMA.extend({
|
||||||
|
vol.Required(CONF_ID): cv.declare_variable_id(Channel),
|
||||||
|
vol.Required(CONF_CHANNEL): vol.All(vol.Coerce(int),
|
||||||
|
vol.Range(min=0, max=65535)),
|
||||||
|
cv.GenerateID(CONF_MY9231_ID): cv.use_variable_id(MY9231OutputComponent),
|
||||||
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
|
def to_code(config):
|
||||||
|
power_supply = None
|
||||||
|
if CONF_POWER_SUPPLY in config:
|
||||||
|
for power_supply in get_variable(config[CONF_POWER_SUPPLY]):
|
||||||
|
yield
|
||||||
|
my9231 = None
|
||||||
|
for my9231 in get_variable(config[CONF_MY9231_ID]):
|
||||||
|
yield
|
||||||
|
rhs = my9231.create_channel(config[CONF_CHANNEL], power_supply)
|
||||||
|
out = Pvariable(config[CONF_ID], rhs)
|
||||||
|
output.setup_output_platform(out, config, skip_power_supply=True)
|
||||||
|
setup_component(out, config)
|
||||||
|
|
||||||
|
|
||||||
|
BUILD_FLAGS = '-DUSE_MY9231_OUTPUT'
|
|
@ -8,7 +8,7 @@ from esphomeyaml.helpers import Pvariable, get_variable
|
||||||
|
|
||||||
DEPENDENCIES = ['pca9685']
|
DEPENDENCIES = ['pca9685']
|
||||||
|
|
||||||
Channel = PCA9685OutputComponent.Channel
|
Channel = PCA9685OutputComponent.class_('Channel', output.FloatOutput)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = output.FLOAT_OUTPUT_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = output.FLOAT_OUTPUT_PLATFORM_SCHEMA.extend({
|
||||||
vol.Required(CONF_ID): cv.declare_variable_id(Channel),
|
vol.Required(CONF_ID): cv.declare_variable_id(Channel),
|
||||||
|
@ -23,7 +23,6 @@ def to_code(config):
|
||||||
if CONF_POWER_SUPPLY in config:
|
if CONF_POWER_SUPPLY in config:
|
||||||
for power_supply in get_variable(config[CONF_POWER_SUPPLY]):
|
for power_supply in get_variable(config[CONF_POWER_SUPPLY]):
|
||||||
yield
|
yield
|
||||||
pca9685 = None
|
|
||||||
for pca9685 in get_variable(config[CONF_PCA9685_ID]):
|
for pca9685 in get_variable(config[CONF_PCA9685_ID]):
|
||||||
yield
|
yield
|
||||||
rhs = pca9685.create_channel(config[CONF_CHANNEL], power_supply)
|
rhs = pca9685.create_channel(config[CONF_CHANNEL], power_supply)
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import output
|
from esphomeyaml.components import output, i2c
|
||||||
from esphomeyaml.const import CONF_ADDRESS, CONF_FREQUENCY, CONF_ID, CONF_PHASE_BALANCER
|
from esphomeyaml.const import CONF_ADDRESS, CONF_FREQUENCY, CONF_ID, CONF_PHASE_BALANCER
|
||||||
from esphomeyaml.helpers import App, HexIntLiteral, Pvariable, add
|
from esphomeyaml.helpers import App, HexIntLiteral, Pvariable, add, setup_component, Component
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ['i2c']
|
||||||
|
|
||||||
PCA9685OutputComponent = output.output_ns.namespace('PCA9685OutputComponent')
|
PCA9685OutputComponent = output.output_ns.class_('PCA9685OutputComponent',
|
||||||
|
Component, i2c.I2CDevice)
|
||||||
|
|
||||||
PHASE_BALANCER_MESSAGE = ("The phase_balancer option has been removed in version 1.5.0. "
|
PHASE_BALANCER_MESSAGE = ("The phase_balancer option has been removed in version 1.5.0. "
|
||||||
"esphomelib will now automatically choose a suitable phase balancer.")
|
"esphomelib will now automatically choose a suitable phase balancer.")
|
||||||
|
@ -19,7 +20,7 @@ PCA9685_SCHEMA = vol.Schema({
|
||||||
vol.Optional(CONF_ADDRESS): cv.i2c_address,
|
vol.Optional(CONF_ADDRESS): cv.i2c_address,
|
||||||
|
|
||||||
vol.Optional(CONF_PHASE_BALANCER): cv.invalid(PHASE_BALANCER_MESSAGE),
|
vol.Optional(CONF_PHASE_BALANCER): cv.invalid(PHASE_BALANCER_MESSAGE),
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.All(cv.ensure_list, [PCA9685_SCHEMA])
|
CONFIG_SCHEMA = vol.All(cv.ensure_list, [PCA9685_SCHEMA])
|
||||||
|
|
||||||
|
@ -30,6 +31,7 @@ def to_code(config):
|
||||||
pca9685 = Pvariable(conf[CONF_ID], rhs)
|
pca9685 = Pvariable(conf[CONF_ID], rhs)
|
||||||
if CONF_ADDRESS in conf:
|
if CONF_ADDRESS in conf:
|
||||||
add(pca9685.set_address(HexIntLiteral(conf[CONF_ADDRESS])))
|
add(pca9685.set_address(HexIntLiteral(conf[CONF_ADDRESS])))
|
||||||
|
setup_component(pca9685, conf)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_PCA9685_OUTPUT'
|
BUILD_FLAGS = '-DUSE_PCA9685_OUTPUT'
|
||||||
|
|
|
@ -1,19 +1,27 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
|
from esphomeyaml import pins
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.const import CONF_ADDRESS, CONF_ID, CONF_PCF8575
|
from esphomeyaml.const import CONF_ADDRESS, CONF_ID, CONF_PCF8575
|
||||||
from esphomeyaml.helpers import App, Pvariable, esphomelib_ns
|
from esphomeyaml.helpers import App, GPIOInputPin, GPIOOutputPin, Pvariable, io_ns, setup_component
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ['i2c']
|
||||||
|
|
||||||
io_ns = esphomelib_ns.namespace('io')
|
PCF8574GPIOMode = io_ns.enum('PCF8574GPIOMode')
|
||||||
PCF8574Component = io_ns.PCF8574Component
|
PCF8675_GPIO_MODES = {
|
||||||
|
'INPUT': PCF8574GPIOMode.PCF8574_INPUT,
|
||||||
|
'INPUT_PULLUP': PCF8574GPIOMode.PCF8574_INPUT_PULLUP,
|
||||||
|
'OUTPUT': PCF8574GPIOMode.PCF8574_OUTPUT,
|
||||||
|
}
|
||||||
|
|
||||||
|
PCF8574GPIOInputPin = io_ns.class_('PCF8574GPIOInputPin', GPIOInputPin)
|
||||||
|
PCF8574GPIOOutputPin = io_ns.class_('PCF8574GPIOOutputPin', GPIOOutputPin)
|
||||||
|
|
||||||
PCF8574_SCHEMA = vol.Schema({
|
PCF8574_SCHEMA = vol.Schema({
|
||||||
vol.Required(CONF_ID): cv.declare_variable_id(PCF8574Component),
|
vol.Required(CONF_ID): cv.declare_variable_id(pins.PCF8574Component),
|
||||||
vol.Optional(CONF_ADDRESS, default=0x21): cv.i2c_address,
|
vol.Optional(CONF_ADDRESS, default=0x21): cv.i2c_address,
|
||||||
vol.Optional(CONF_PCF8575, default=False): cv.boolean,
|
vol.Optional(CONF_PCF8575, default=False): cv.boolean,
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.All(cv.ensure_list, [PCF8574_SCHEMA])
|
CONFIG_SCHEMA = vol.All(cv.ensure_list, [PCF8574_SCHEMA])
|
||||||
|
|
||||||
|
@ -21,7 +29,8 @@ CONFIG_SCHEMA = vol.All(cv.ensure_list, [PCF8574_SCHEMA])
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
for conf in config:
|
for conf in config:
|
||||||
rhs = App.make_pcf8574_component(conf[CONF_ADDRESS], conf[CONF_PCF8575])
|
rhs = App.make_pcf8574_component(conf[CONF_ADDRESS], conf[CONF_PCF8575])
|
||||||
Pvariable(conf[CONF_ID], rhs)
|
var = Pvariable(conf[CONF_ID], rhs)
|
||||||
|
setup_component(var, conf)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_PCF8574'
|
BUILD_FLAGS = '-DUSE_PCF8574'
|
||||||
|
|
|
@ -2,16 +2,18 @@ import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml import pins, automation
|
from esphomeyaml import pins, automation
|
||||||
from esphomeyaml.components import binary_sensor
|
from esphomeyaml.components import binary_sensor, spi
|
||||||
from esphomeyaml.components.spi import SPIComponent
|
from esphomeyaml.components.spi import SPIComponent
|
||||||
from esphomeyaml.const import CONF_CS_PIN, CONF_ID, CONF_SPI_ID, CONF_UPDATE_INTERVAL, \
|
from esphomeyaml.const import CONF_CS_PIN, CONF_ID, CONF_SPI_ID, CONF_UPDATE_INTERVAL, \
|
||||||
CONF_ON_TAG, CONF_TRIGGER_ID
|
CONF_ON_TAG, CONF_TRIGGER_ID
|
||||||
from esphomeyaml.helpers import App, Pvariable, get_variable, gpio_output_pin_expression, std_string
|
from esphomeyaml.helpers import App, Pvariable, get_variable, gpio_output_pin_expression, \
|
||||||
|
std_string, setup_component, PollingComponent, Trigger
|
||||||
|
|
||||||
DEPENDENCIES = ['spi']
|
DEPENDENCIES = ['spi']
|
||||||
|
|
||||||
PN532Component = binary_sensor.binary_sensor_ns.PN532Component
|
PN532Component = binary_sensor.binary_sensor_ns.class_('PN532Component', PollingComponent,
|
||||||
PN532Trigger = binary_sensor.binary_sensor_ns.PN532Trigger
|
spi.SPIDevice)
|
||||||
|
PN532Trigger = binary_sensor.binary_sensor_ns.class_('PN532Trigger', Trigger.template(std_string))
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.All(cv.ensure_list, [vol.Schema({
|
CONFIG_SCHEMA = vol.All(cv.ensure_list, [vol.Schema({
|
||||||
cv.GenerateID(): cv.declare_variable_id(PN532Component),
|
cv.GenerateID(): cv.declare_variable_id(PN532Component),
|
||||||
|
@ -21,23 +23,23 @@ CONFIG_SCHEMA = vol.All(cv.ensure_list, [vol.Schema({
|
||||||
vol.Optional(CONF_ON_TAG): automation.validate_automation({
|
vol.Optional(CONF_ON_TAG): automation.validate_automation({
|
||||||
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_variable_id(PN532Trigger),
|
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_variable_id(PN532Trigger),
|
||||||
}),
|
}),
|
||||||
})])
|
}).extend(cv.COMPONENT_SCHEMA.schema)])
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
for conf in config:
|
for conf in config:
|
||||||
spi = None
|
for spi_ in get_variable(conf[CONF_SPI_ID]):
|
||||||
for spi in get_variable(conf[CONF_SPI_ID]):
|
|
||||||
yield
|
yield
|
||||||
cs = None
|
|
||||||
for cs in gpio_output_pin_expression(conf[CONF_CS_PIN]):
|
for cs in gpio_output_pin_expression(conf[CONF_CS_PIN]):
|
||||||
yield
|
yield
|
||||||
rhs = App.make_pn532_component(spi, cs, conf.get(CONF_UPDATE_INTERVAL))
|
rhs = App.make_pn532_component(spi_, cs, conf.get(CONF_UPDATE_INTERVAL))
|
||||||
pn532 = Pvariable(conf[CONF_ID], rhs)
|
pn532 = Pvariable(conf[CONF_ID], rhs)
|
||||||
|
|
||||||
for conf_ in conf.get(CONF_ON_TAG, []):
|
for conf_ in conf.get(CONF_ON_TAG, []):
|
||||||
trigger = Pvariable(conf_[CONF_TRIGGER_ID], pn532.make_trigger())
|
trigger = Pvariable(conf_[CONF_TRIGGER_ID], pn532.make_trigger())
|
||||||
automation.build_automation(trigger, std_string, conf_)
|
automation.build_automation(trigger, std_string, conf_)
|
||||||
|
|
||||||
|
setup_component(pn532, conf)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_PN532'
|
BUILD_FLAGS = '-DUSE_PN532'
|
||||||
|
|
|
@ -3,25 +3,26 @@ import voluptuous as vol
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml import pins
|
from esphomeyaml import pins
|
||||||
from esphomeyaml.const import CONF_ENABLE_TIME, CONF_ID, CONF_KEEP_ON_TIME, CONF_PIN
|
from esphomeyaml.const import CONF_ENABLE_TIME, CONF_ID, CONF_KEEP_ON_TIME, CONF_PIN
|
||||||
from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns, gpio_output_pin_expression
|
from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns, gpio_output_pin_expression, \
|
||||||
|
setup_component, Component
|
||||||
|
|
||||||
PowerSupplyComponent = esphomelib_ns.PowerSupplyComponent
|
PowerSupplyComponent = esphomelib_ns.class_('PowerSupplyComponent', Component)
|
||||||
|
|
||||||
POWER_SUPPLY_SCHEMA = vol.Schema({
|
POWER_SUPPLY_SCHEMA = vol.Schema({
|
||||||
vol.Required(CONF_ID): cv.declare_variable_id(PowerSupplyComponent),
|
vol.Required(CONF_ID): cv.declare_variable_id(PowerSupplyComponent),
|
||||||
vol.Required(CONF_PIN): pins.gpio_output_pin_schema,
|
vol.Required(CONF_PIN): pins.gpio_output_pin_schema,
|
||||||
vol.Optional(CONF_ENABLE_TIME): cv.positive_time_period_milliseconds,
|
vol.Optional(CONF_ENABLE_TIME): cv.positive_time_period_milliseconds,
|
||||||
vol.Optional(CONF_KEEP_ON_TIME): cv.positive_time_period_milliseconds,
|
vol.Optional(CONF_KEEP_ON_TIME): cv.positive_time_period_milliseconds,
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.All(cv.ensure_list, [POWER_SUPPLY_SCHEMA])
|
CONFIG_SCHEMA = vol.All(cv.ensure_list, [POWER_SUPPLY_SCHEMA])
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
for conf in config:
|
for conf in config:
|
||||||
pin = None
|
|
||||||
for pin in gpio_output_pin_expression(conf[CONF_PIN]):
|
for pin in gpio_output_pin_expression(conf[CONF_PIN]):
|
||||||
yield
|
yield
|
||||||
|
|
||||||
rhs = App.make_power_supply(pin)
|
rhs = App.make_power_supply(pin)
|
||||||
psu = Pvariable(conf[CONF_ID], rhs)
|
psu = Pvariable(conf[CONF_ID], rhs)
|
||||||
if CONF_ENABLE_TIME in conf:
|
if CONF_ENABLE_TIME in conf:
|
||||||
|
@ -29,5 +30,7 @@ def to_code(config):
|
||||||
if CONF_KEEP_ON_TIME in conf:
|
if CONF_KEEP_ON_TIME in conf:
|
||||||
add(psu.set_keep_on_time(conf[CONF_KEEP_ON_TIME]))
|
add(psu.set_keep_on_time(conf[CONF_KEEP_ON_TIME]))
|
||||||
|
|
||||||
|
setup_component(psu, conf)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_OUTPUT'
|
BUILD_FLAGS = '-DUSE_OUTPUT'
|
||||||
|
|
|
@ -1,28 +1,28 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import binary_sensor
|
from esphomeyaml.components import binary_sensor, uart
|
||||||
from esphomeyaml.components.uart import UARTComponent
|
|
||||||
from esphomeyaml.const import CONF_ID, CONF_UART_ID
|
from esphomeyaml.const import CONF_ID, CONF_UART_ID
|
||||||
from esphomeyaml.helpers import App, Pvariable, get_variable
|
from esphomeyaml.helpers import App, Pvariable, get_variable, setup_component, Component
|
||||||
|
|
||||||
DEPENDENCIES = ['uart']
|
DEPENDENCIES = ['uart']
|
||||||
|
|
||||||
RDM6300Component = binary_sensor.binary_sensor_ns.RDM6300Component
|
RDM6300Component = binary_sensor.binary_sensor_ns.class_('RDM6300Component', Component,
|
||||||
|
uart.UARTDevice)
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.All(cv.ensure_list_not_empty, [vol.Schema({
|
CONFIG_SCHEMA = vol.All(cv.ensure_list_not_empty, [vol.Schema({
|
||||||
cv.GenerateID(): cv.declare_variable_id(RDM6300Component),
|
cv.GenerateID(): cv.declare_variable_id(RDM6300Component),
|
||||||
cv.GenerateID(CONF_UART_ID): cv.use_variable_id(UARTComponent),
|
cv.GenerateID(CONF_UART_ID): cv.use_variable_id(uart.UARTComponent),
|
||||||
})])
|
}).extend(cv.COMPONENT_SCHEMA.schema)])
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
for conf in config:
|
for conf in config:
|
||||||
uart = None
|
for uart_ in get_variable(conf[CONF_UART_ID]):
|
||||||
for uart in get_variable(conf[CONF_UART_ID]):
|
|
||||||
yield
|
yield
|
||||||
rhs = App.make_rdm6300_component(uart)
|
rhs = App.make_rdm6300_component(uart_)
|
||||||
Pvariable(conf[CONF_ID], rhs)
|
var = Pvariable(conf[CONF_ID], rhs)
|
||||||
|
setup_component(var, conf)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_RDM6300'
|
BUILD_FLAGS = '-DUSE_RDM6300'
|
||||||
|
|
|
@ -4,20 +4,26 @@ import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml import pins
|
from esphomeyaml import pins
|
||||||
from esphomeyaml.const import CONF_BUFFER_SIZE, CONF_DUMP, CONF_FILTER, CONF_ID, CONF_IDLE, \
|
from esphomeyaml.const import CONF_BUFFER_SIZE, CONF_DUMP, CONF_FILTER, CONF_ID, CONF_IDLE, \
|
||||||
CONF_PIN, CONF_TOLERANCE
|
CONF_PIN, CONF_TOLERANCE
|
||||||
from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns, gpio_input_pin_expression
|
from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns, gpio_input_pin_expression, \
|
||||||
|
setup_component, Component
|
||||||
|
|
||||||
remote_ns = esphomelib_ns.namespace('remote')
|
remote_ns = esphomelib_ns.namespace('remote')
|
||||||
|
|
||||||
RemoteReceiverComponent = remote_ns.RemoteReceiverComponent
|
RemoteControlComponentBase = remote_ns.class_('RemoteControlComponentBase')
|
||||||
|
RemoteReceiverComponent = remote_ns.class_('RemoteReceiverComponent',
|
||||||
|
RemoteControlComponentBase,
|
||||||
|
Component)
|
||||||
|
|
||||||
|
RemoteReceiveDumper = remote_ns.class_('RemoteReceiveDumper')
|
||||||
|
|
||||||
DUMPERS = {
|
DUMPERS = {
|
||||||
'lg': remote_ns.LGDumper,
|
'lg': remote_ns.class_('LGDumper', RemoteReceiveDumper),
|
||||||
'nec': remote_ns.NECDumper,
|
'nec': remote_ns.class_('NECDumper', RemoteReceiveDumper),
|
||||||
'panasonic': remote_ns.PanasonicDumper,
|
'panasonic': remote_ns.class_('PanasonicDumper', RemoteReceiveDumper),
|
||||||
'raw': remote_ns.RawDumper,
|
'raw': remote_ns.class_('RawDumper', RemoteReceiveDumper),
|
||||||
'samsung': remote_ns.SamsungDumper,
|
'samsung': remote_ns.class_('SamsungDumper', RemoteReceiveDumper),
|
||||||
'sony': remote_ns.SonyDumper,
|
'sony': remote_ns.class_('SonyDumper', RemoteReceiveDumper),
|
||||||
'rc_switch': remote_ns.RCSwitchDumper,
|
'rc_switch': remote_ns.class_('RCSwitchDumper', RemoteReceiveDumper),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -39,16 +45,16 @@ CONFIG_SCHEMA = vol.All(cv.ensure_list, [vol.Schema({
|
||||||
vol.Optional(CONF_BUFFER_SIZE): cv.validate_bytes,
|
vol.Optional(CONF_BUFFER_SIZE): cv.validate_bytes,
|
||||||
vol.Optional(CONF_FILTER): cv.positive_time_period_microseconds,
|
vol.Optional(CONF_FILTER): cv.positive_time_period_microseconds,
|
||||||
vol.Optional(CONF_IDLE): cv.positive_time_period_microseconds,
|
vol.Optional(CONF_IDLE): cv.positive_time_period_microseconds,
|
||||||
})])
|
}).extend(cv.COMPONENT_SCHEMA.schema)])
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
for conf in config:
|
for conf in config:
|
||||||
pin = None
|
|
||||||
for pin in gpio_input_pin_expression(conf[CONF_PIN]):
|
for pin in gpio_input_pin_expression(conf[CONF_PIN]):
|
||||||
yield
|
yield
|
||||||
rhs = App.make_remote_receiver_component(pin)
|
rhs = App.make_remote_receiver_component(pin)
|
||||||
receiver = Pvariable(conf[CONF_ID], rhs)
|
receiver = Pvariable(conf[CONF_ID], rhs)
|
||||||
|
|
||||||
for dumper in conf[CONF_DUMP]:
|
for dumper in conf[CONF_DUMP]:
|
||||||
add(receiver.add_dumper(DUMPERS[dumper].new()))
|
add(receiver.add_dumper(DUMPERS[dumper].new()))
|
||||||
if CONF_TOLERANCE in conf:
|
if CONF_TOLERANCE in conf:
|
||||||
|
@ -60,5 +66,7 @@ def to_code(config):
|
||||||
if CONF_IDLE in conf:
|
if CONF_IDLE in conf:
|
||||||
add(receiver.set_idle_us(conf[CONF_IDLE]))
|
add(receiver.set_idle_us(conf[CONF_IDLE]))
|
||||||
|
|
||||||
|
setup_component(receiver, conf)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_REMOTE_RECEIVER'
|
BUILD_FLAGS = '-DUSE_REMOTE_RECEIVER'
|
||||||
|
|
|
@ -1,17 +1,18 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml import pins
|
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 esphomeyaml.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_DEVICE, CONF_FAMILY, CONF_GROUP, CONF_ID, CONF_INVERTED, CONF_ONE, CONF_PIN, \
|
||||||
CONF_PROTOCOL, CONF_PULSE_LENGTH, CONF_STATE, CONF_SYNC, CONF_ZERO
|
CONF_PROTOCOL, CONF_PULSE_LENGTH, CONF_STATE, CONF_SYNC, CONF_ZERO
|
||||||
from esphomeyaml.core import HexInt
|
from esphomeyaml.core import HexInt
|
||||||
from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns, gpio_output_pin_expression
|
from esphomeyaml.helpers import App, Component, Pvariable, add, gpio_output_pin_expression, \
|
||||||
|
setup_component
|
||||||
|
|
||||||
remote_ns = esphomelib_ns.namespace('remote')
|
RemoteTransmitterComponent = remote_ns.class_('RemoteTransmitterComponent',
|
||||||
|
RemoteControlComponentBase, Component)
|
||||||
RemoteTransmitterComponent = remote_ns.RemoteTransmitterComponent
|
RCSwitchProtocol = remote_ns.class_('RCSwitchProtocol')
|
||||||
RCSwitchProtocol = remote_ns.RCSwitchProtocol
|
|
||||||
rc_switch_protocols = remote_ns.rc_switch_protocols
|
rc_switch_protocols = remote_ns.rc_switch_protocols
|
||||||
|
|
||||||
|
|
||||||
|
@ -81,7 +82,7 @@ CONFIG_SCHEMA = vol.All(cv.ensure_list, [vol.Schema({
|
||||||
vol.Required(CONF_PIN): pins.gpio_output_pin_schema,
|
vol.Required(CONF_PIN): pins.gpio_output_pin_schema,
|
||||||
vol.Optional(CONF_CARRIER_DUTY_PERCENT): vol.All(cv.percentage_int,
|
vol.Optional(CONF_CARRIER_DUTY_PERCENT): vol.All(cv.percentage_int,
|
||||||
vol.Range(min=1, max=100)),
|
vol.Range(min=1, max=100)),
|
||||||
})])
|
}).extend(cv.COMPONENT_SCHEMA.schema)])
|
||||||
|
|
||||||
|
|
||||||
def build_rc_switch_protocol(config):
|
def build_rc_switch_protocol(config):
|
||||||
|
@ -104,13 +105,15 @@ def binary_code(value):
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
for conf in config:
|
for conf in config:
|
||||||
pin = None
|
|
||||||
for pin in gpio_output_pin_expression(conf[CONF_PIN]):
|
for pin in gpio_output_pin_expression(conf[CONF_PIN]):
|
||||||
yield
|
yield
|
||||||
rhs = App.make_remote_transmitter_component(pin)
|
rhs = App.make_remote_transmitter_component(pin)
|
||||||
transmitter = Pvariable(conf[CONF_ID], rhs)
|
transmitter = Pvariable(conf[CONF_ID], rhs)
|
||||||
|
|
||||||
if CONF_CARRIER_DUTY_PERCENT in conf:
|
if CONF_CARRIER_DUTY_PERCENT in conf:
|
||||||
add(transmitter.set_carrier_duty_percent(conf[CONF_CARRIER_DUTY_PERCENT]))
|
add(transmitter.set_carrier_duty_percent(conf[CONF_CARRIER_DUTY_PERCENT]))
|
||||||
|
|
||||||
|
setup_component(transmitter, conf)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_REMOTE_TRANSMITTER'
|
BUILD_FLAGS = '-DUSE_REMOTE_TRANSMITTER'
|
||||||
|
|
|
@ -4,10 +4,11 @@ from esphomeyaml import automation
|
||||||
from esphomeyaml.automation import ACTION_REGISTRY, maybe_simple_id
|
from esphomeyaml.automation import ACTION_REGISTRY, maybe_simple_id
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.const import CONF_ID
|
from esphomeyaml.const import CONF_ID
|
||||||
from esphomeyaml.helpers import NoArg, Pvariable, TemplateArguments, esphomelib_ns, get_variable
|
from esphomeyaml.helpers import NoArg, Pvariable, TemplateArguments, esphomelib_ns, get_variable, \
|
||||||
|
Trigger, Action
|
||||||
|
|
||||||
Script = esphomelib_ns.Script
|
Script = esphomelib_ns.class_('Script', Trigger.template(NoArg))
|
||||||
ScriptExecuteAction = esphomelib_ns.ScriptExecuteAction
|
ScriptExecuteAction = esphomelib_ns.class_('ScriptExecuteAction', Action)
|
||||||
|
|
||||||
CONFIG_SCHEMA = automation.validate_automation({
|
CONFIG_SCHEMA = automation.validate_automation({
|
||||||
vol.Required(CONF_ID): cv.declare_variable_id(Script),
|
vol.Required(CONF_ID): cv.declare_variable_id(Script),
|
||||||
|
|
|
@ -1,15 +1,18 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml import automation
|
from esphomeyaml import automation
|
||||||
|
from esphomeyaml.components import mqtt
|
||||||
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.const import CONF_ABOVE, CONF_ACCURACY_DECIMALS, CONF_ALPHA, CONF_BELOW, \
|
from esphomeyaml.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_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_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_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_SLIDING_WINDOW_MOVING_AVERAGE, \
|
CONF_ON_VALUE_RANGE, CONF_OR, CONF_SEND_EVERY, CONF_SEND_FIRST_AT, \
|
||||||
CONF_THROTTLE, CONF_TRIGGER_ID, CONF_UNIQUE, CONF_UNIT_OF_MEASUREMENT, CONF_WINDOW_SIZE
|
CONF_SLIDING_WINDOW_MOVING_AVERAGE, CONF_THROTTLE, CONF_TRIGGER_ID, CONF_UNIQUE, \
|
||||||
from esphomeyaml.helpers import App, ArrayInitializer, Pvariable, add, add_job, esphomelib_ns, \
|
CONF_UNIT_OF_MEASUREMENT, CONF_WINDOW_SIZE
|
||||||
float_, process_lambda, setup_mqtt_component, templatable
|
from esphomeyaml.helpers import App, ArrayInitializer, Component, Nameable, PollingComponent, \
|
||||||
|
Pvariable, Trigger, add, add_job, esphomelib_ns, float_, process_lambda, setup_mqtt_component, \
|
||||||
|
templatable
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
|
||||||
|
|
||||||
|
@ -20,6 +23,15 @@ def validate_recursive_filter(value):
|
||||||
return FILTERS_SCHEMA(value)
|
return FILTERS_SCHEMA(value)
|
||||||
|
|
||||||
|
|
||||||
|
def validate_send_first_at(value):
|
||||||
|
send_first_at = value.get(CONF_SEND_FIRST_AT)
|
||||||
|
send_every = value[CONF_SEND_EVERY]
|
||||||
|
if send_first_at is not None and send_first_at > send_every:
|
||||||
|
raise vol.Invalid("send_first_at must be smaller than or equal to send_every! {} <= {}"
|
||||||
|
"".format(send_first_at, send_every))
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
FILTER_KEYS = [CONF_OFFSET, CONF_MULTIPLY, CONF_FILTER_OUT, CONF_FILTER_NAN,
|
FILTER_KEYS = [CONF_OFFSET, CONF_MULTIPLY, CONF_FILTER_OUT, CONF_FILTER_NAN,
|
||||||
CONF_SLIDING_WINDOW_MOVING_AVERAGE, CONF_EXPONENTIAL_MOVING_AVERAGE, CONF_LAMBDA,
|
CONF_SLIDING_WINDOW_MOVING_AVERAGE, CONF_EXPONENTIAL_MOVING_AVERAGE, CONF_LAMBDA,
|
||||||
CONF_THROTTLE, CONF_DELTA, CONF_UNIQUE, CONF_HEARTBEAT, CONF_DEBOUNCE, CONF_OR]
|
CONF_THROTTLE, CONF_DELTA, CONF_UNIQUE, CONF_HEARTBEAT, CONF_DEBOUNCE, CONF_OR]
|
||||||
|
@ -29,10 +41,11 @@ FILTERS_SCHEMA = vol.All(cv.ensure_list, [vol.All({
|
||||||
vol.Optional(CONF_MULTIPLY): vol.Coerce(float),
|
vol.Optional(CONF_MULTIPLY): vol.Coerce(float),
|
||||||
vol.Optional(CONF_FILTER_OUT): vol.Coerce(float),
|
vol.Optional(CONF_FILTER_OUT): vol.Coerce(float),
|
||||||
vol.Optional(CONF_FILTER_NAN): None,
|
vol.Optional(CONF_FILTER_NAN): None,
|
||||||
vol.Optional(CONF_SLIDING_WINDOW_MOVING_AVERAGE): vol.Schema({
|
vol.Optional(CONF_SLIDING_WINDOW_MOVING_AVERAGE): vol.All(vol.Schema({
|
||||||
vol.Required(CONF_WINDOW_SIZE): cv.positive_not_null_int,
|
vol.Required(CONF_WINDOW_SIZE): cv.positive_not_null_int,
|
||||||
vol.Required(CONF_SEND_EVERY): cv.positive_not_null_int,
|
vol.Required(CONF_SEND_EVERY): cv.positive_not_null_int,
|
||||||
}),
|
vol.Optional(CONF_SEND_FIRST_AT): cv.positive_not_null_int,
|
||||||
|
}), validate_send_first_at),
|
||||||
vol.Optional(CONF_EXPONENTIAL_MOVING_AVERAGE): vol.Schema({
|
vol.Optional(CONF_EXPONENTIAL_MOVING_AVERAGE): vol.Schema({
|
||||||
vol.Required(CONF_ALPHA): cv.positive_float,
|
vol.Required(CONF_ALPHA): cv.positive_float,
|
||||||
vol.Required(CONF_SEND_EVERY): cv.positive_not_null_int,
|
vol.Required(CONF_SEND_EVERY): cv.positive_not_null_int,
|
||||||
|
@ -46,31 +59,38 @@ FILTERS_SCHEMA = vol.All(cv.ensure_list, [vol.All({
|
||||||
vol.Optional(CONF_OR): validate_recursive_filter,
|
vol.Optional(CONF_OR): validate_recursive_filter,
|
||||||
}, cv.has_exactly_one_key(*FILTER_KEYS))])
|
}, cv.has_exactly_one_key(*FILTER_KEYS))])
|
||||||
|
|
||||||
# pylint: disable=invalid-name
|
# Base
|
||||||
sensor_ns = esphomelib_ns.namespace('sensor')
|
sensor_ns = esphomelib_ns.namespace('sensor')
|
||||||
Sensor = sensor_ns.Sensor
|
Sensor = sensor_ns.class_('Sensor', Nameable)
|
||||||
MQTTSensorComponent = sensor_ns.MQTTSensorComponent
|
MQTTSensorComponent = sensor_ns.class_('MQTTSensorComponent', mqtt.MQTTComponent)
|
||||||
OffsetFilter = sensor_ns.OffsetFilter
|
|
||||||
MultiplyFilter = sensor_ns.MultiplyFilter
|
|
||||||
FilterOutValueFilter = sensor_ns.FilterOutValueFilter
|
|
||||||
FilterOutNANFilter = sensor_ns.FilterOutNANFilter
|
|
||||||
SlidingWindowMovingAverageFilter = sensor_ns.SlidingWindowMovingAverageFilter
|
|
||||||
ExponentialMovingAverageFilter = sensor_ns.ExponentialMovingAverageFilter
|
|
||||||
LambdaFilter = sensor_ns.LambdaFilter
|
|
||||||
ThrottleFilter = sensor_ns.ThrottleFilter
|
|
||||||
DeltaFilter = sensor_ns.DeltaFilter
|
|
||||||
OrFilter = sensor_ns.OrFilter
|
|
||||||
HeartbeatFilter = sensor_ns.HeartbeatFilter
|
|
||||||
DebounceFilter = sensor_ns.DebounceFilter
|
|
||||||
UniqueFilter = sensor_ns.UniqueFilter
|
|
||||||
|
|
||||||
SensorStateTrigger = sensor_ns.SensorStateTrigger
|
PollingSensorComponent = sensor_ns.class_('PollingSensorComponent', PollingComponent, Sensor)
|
||||||
SensorRawStateTrigger = sensor_ns.SensorRawStateTrigger
|
EmptySensor = sensor_ns.class_('EmptySensor', Sensor)
|
||||||
ValueRangeTrigger = sensor_ns.ValueRangeTrigger
|
EmptyPollingParentSensor = sensor_ns.class_('EmptyPollingParentSensor', EmptySensor)
|
||||||
|
|
||||||
|
# Triggers
|
||||||
|
SensorStateTrigger = sensor_ns.class_('SensorStateTrigger', Trigger.template(float_))
|
||||||
|
SensorRawStateTrigger = sensor_ns.class_('SensorRawStateTrigger', Trigger.template(float_))
|
||||||
|
ValueRangeTrigger = sensor_ns.class_('ValueRangeTrigger', Trigger.template(float_))
|
||||||
|
|
||||||
|
# Filters
|
||||||
|
Filter = sensor_ns.class_('Filter')
|
||||||
|
SlidingWindowMovingAverageFilter = sensor_ns.class_('SlidingWindowMovingAverageFilter', Filter)
|
||||||
|
ExponentialMovingAverageFilter = sensor_ns.class_('ExponentialMovingAverageFilter', Filter)
|
||||||
|
LambdaFilter = sensor_ns.class_('LambdaFilter', Filter)
|
||||||
|
OffsetFilter = sensor_ns.class_('OffsetFilter', Filter)
|
||||||
|
MultiplyFilter = sensor_ns.class_('MultiplyFilter', Filter)
|
||||||
|
FilterOutValueFilter = sensor_ns.class_('FilterOutValueFilter', Filter)
|
||||||
|
FilterOutNANFilter = sensor_ns.class_('FilterOutNANFilter', Filter)
|
||||||
|
ThrottleFilter = sensor_ns.class_('ThrottleFilter', Filter)
|
||||||
|
DebounceFilter = sensor_ns.class_('DebounceFilter', Filter, Component)
|
||||||
|
HeartbeatFilter = sensor_ns.class_('HeartbeatFilter', Filter, Component)
|
||||||
|
DeltaFilter = sensor_ns.class_('DeltaFilter', Filter)
|
||||||
|
OrFilter = sensor_ns.class_('OrFilter', Filter)
|
||||||
|
UniqueFilter = sensor_ns.class_('UniqueFilter', Filter)
|
||||||
|
|
||||||
SENSOR_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend({
|
SENSOR_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend({
|
||||||
cv.GenerateID(CONF_MQTT_ID): cv.declare_variable_id(MQTTSensorComponent),
|
cv.GenerateID(CONF_MQTT_ID): cv.declare_variable_id(MQTTSensorComponent),
|
||||||
cv.GenerateID(): cv.declare_variable_id(Sensor),
|
|
||||||
vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string_strict,
|
vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string_strict,
|
||||||
vol.Optional(CONF_ICON): cv.icon,
|
vol.Optional(CONF_ICON): cv.icon,
|
||||||
vol.Optional(CONF_ACCURACY_DECIMALS): vol.Coerce(int),
|
vol.Optional(CONF_ACCURACY_DECIMALS): vol.Coerce(int),
|
||||||
|
@ -103,7 +123,8 @@ def setup_filter(config):
|
||||||
yield FilterOutNANFilter.new()
|
yield FilterOutNANFilter.new()
|
||||||
elif CONF_SLIDING_WINDOW_MOVING_AVERAGE in config:
|
elif CONF_SLIDING_WINDOW_MOVING_AVERAGE in config:
|
||||||
conf = config[CONF_SLIDING_WINDOW_MOVING_AVERAGE]
|
conf = config[CONF_SLIDING_WINDOW_MOVING_AVERAGE]
|
||||||
yield SlidingWindowMovingAverageFilter.new(conf[CONF_WINDOW_SIZE], conf[CONF_SEND_EVERY])
|
yield SlidingWindowMovingAverageFilter.new(conf[CONF_WINDOW_SIZE], conf[CONF_SEND_EVERY],
|
||||||
|
conf.get(CONF_SEND_FIRST_AT))
|
||||||
elif CONF_EXPONENTIAL_MOVING_AVERAGE in config:
|
elif CONF_EXPONENTIAL_MOVING_AVERAGE in config:
|
||||||
conf = config[CONF_EXPONENTIAL_MOVING_AVERAGE]
|
conf = config[CONF_EXPONENTIAL_MOVING_AVERAGE]
|
||||||
yield ExponentialMovingAverageFilter.new(conf[CONF_ALPHA], conf[CONF_SEND_EVERY])
|
yield ExponentialMovingAverageFilter.new(conf[CONF_ALPHA], conf[CONF_SEND_EVERY])
|
||||||
|
@ -199,3 +220,18 @@ def register_sensor(var, config):
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_SENSOR'
|
BUILD_FLAGS = '-DUSE_SENSOR'
|
||||||
|
|
||||||
|
|
||||||
|
def core_to_hass_config(data, config):
|
||||||
|
ret = mqtt.build_hass_config(data, 'sensor', config, include_state=True, include_command=False)
|
||||||
|
if ret is None:
|
||||||
|
return None
|
||||||
|
if CONF_UNIT_OF_MEASUREMENT in config:
|
||||||
|
ret['unit_of_measurement'] = config[CONF_UNIT_OF_MEASUREMENT]
|
||||||
|
if CONF_EXPIRE_AFTER in config:
|
||||||
|
expire = config[CONF_EXPIRE_AFTER]
|
||||||
|
if expire is not None:
|
||||||
|
ret['expire_after'] = expire.total_seconds
|
||||||
|
if CONF_ICON in config:
|
||||||
|
ret['icon'] = config[CONF_ICON]
|
||||||
|
return ret
|
||||||
|
|
|
@ -5,7 +5,7 @@ from esphomeyaml import pins
|
||||||
from esphomeyaml.components import sensor
|
from esphomeyaml.components import sensor
|
||||||
from esphomeyaml.const import CONF_ATTENUATION, CONF_MAKE_ID, CONF_NAME, CONF_PIN, \
|
from esphomeyaml.const import CONF_ATTENUATION, CONF_MAKE_ID, CONF_NAME, CONF_PIN, \
|
||||||
CONF_UPDATE_INTERVAL
|
CONF_UPDATE_INTERVAL
|
||||||
from esphomeyaml.helpers import App, Application, add, global_ns, variable
|
from esphomeyaml.helpers import App, Application, add, global_ns, variable, setup_component
|
||||||
|
|
||||||
ATTENUATION_MODES = {
|
ATTENUATION_MODES = {
|
||||||
'0db': global_ns.ADC_0db,
|
'0db': global_ns.ADC_0db,
|
||||||
|
@ -22,14 +22,16 @@ def validate_adc_pin(value):
|
||||||
return pins.analog_pin(value)
|
return pins.analog_pin(value)
|
||||||
|
|
||||||
|
|
||||||
MakeADCSensor = Application.MakeADCSensor
|
MakeADCSensor = Application.struct('MakeADCSensor')
|
||||||
|
ADCSensorComponent = sensor.sensor_ns.class_('ADCSensorComponent', sensor.PollingSensorComponent)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
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),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeADCSensor),
|
||||||
vol.Required(CONF_PIN): validate_adc_pin,
|
vol.Required(CONF_PIN): validate_adc_pin,
|
||||||
vol.Optional(CONF_ATTENUATION): vol.All(cv.only_on_esp32, cv.one_of(*ATTENUATION_MODES)),
|
vol.Optional(CONF_ATTENUATION): vol.All(cv.only_on_esp32, cv.one_of(*ATTENUATION_MODES)),
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
||||||
}))
|
}).extend(cv.COMPONENT_SCHEMA.schema))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
@ -42,7 +44,8 @@ def to_code(config):
|
||||||
adc = make.Padc
|
adc = make.Padc
|
||||||
if CONF_ATTENUATION in config:
|
if CONF_ATTENUATION in config:
|
||||||
add(adc.set_attenuation(ATTENUATION_MODES[config[CONF_ATTENUATION]]))
|
add(adc.set_attenuation(ATTENUATION_MODES[config[CONF_ATTENUATION]]))
|
||||||
sensor.setup_sensor(make.Padc, make.Pmqtt, config)
|
sensor.setup_sensor(adc, make.Pmqtt, config)
|
||||||
|
setup_component(adc, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_ADC_SENSOR'
|
BUILD_FLAGS = '-DUSE_ADC_SENSOR'
|
||||||
|
@ -52,3 +55,7 @@ def required_build_flags(config):
|
||||||
if config[CONF_PIN] == 'VCC':
|
if config[CONF_PIN] == 'VCC':
|
||||||
return '-DUSE_ADC_SENSOR_VCC'
|
return '-DUSE_ADC_SENSOR_VCC'
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return sensor.core_to_hass_config(data, config)
|
||||||
|
|
|
@ -9,24 +9,26 @@ from esphomeyaml.helpers import get_variable
|
||||||
|
|
||||||
DEPENDENCIES = ['ads1115']
|
DEPENDENCIES = ['ads1115']
|
||||||
|
|
||||||
|
ADS1115Multiplexer = sensor.sensor_ns.enum('ADS1115Multiplexer')
|
||||||
MUX = {
|
MUX = {
|
||||||
'A0_A1': sensor.sensor_ns.ADS1115_MULTIPLEXER_P0_N1,
|
'A0_A1': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P0_N1,
|
||||||
'A0_A3': sensor.sensor_ns.ADS1115_MULTIPLEXER_P0_N3,
|
'A0_A3': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P0_N3,
|
||||||
'A1_A3': sensor.sensor_ns.ADS1115_MULTIPLEXER_P1_N3,
|
'A1_A3': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P1_N3,
|
||||||
'A2_A3': sensor.sensor_ns.ADS1115_MULTIPLEXER_P2_N3,
|
'A2_A3': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P2_N3,
|
||||||
'A0_GND': sensor.sensor_ns.ADS1115_MULTIPLEXER_P0_NG,
|
'A0_GND': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P0_NG,
|
||||||
'A1_GND': sensor.sensor_ns.ADS1115_MULTIPLEXER_P1_NG,
|
'A1_GND': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P1_NG,
|
||||||
'A2_GND': sensor.sensor_ns.ADS1115_MULTIPLEXER_P2_NG,
|
'A2_GND': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P2_NG,
|
||||||
'A3_GND': sensor.sensor_ns.ADS1115_MULTIPLEXER_P3_NG,
|
'A3_GND': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P3_NG,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ADS1115Gain = sensor.sensor_ns.enum('ADS1115Gain')
|
||||||
GAIN = {
|
GAIN = {
|
||||||
'6.144': sensor.sensor_ns.ADS1115_GAIN_6P144,
|
'6.144': ADS1115Gain.ADS1115_GAIN_6P144,
|
||||||
'4.096': sensor.sensor_ns.ADS1115_GAIN_6P096,
|
'4.096': ADS1115Gain.ADS1115_GAIN_6P096,
|
||||||
'2.048': sensor.sensor_ns.ADS1115_GAIN_2P048,
|
'2.048': ADS1115Gain.ADS1115_GAIN_2P048,
|
||||||
'1.024': sensor.sensor_ns.ADS1115_GAIN_1P024,
|
'1.024': ADS1115Gain.ADS1115_GAIN_1P024,
|
||||||
'0.512': sensor.sensor_ns.ADS1115_GAIN_0P512,
|
'0.512': ADS1115Gain.ADS1115_GAIN_0P512,
|
||||||
'0.256': sensor.sensor_ns.ADS1115_GAIN_0P256,
|
'0.256': ADS1115Gain.ADS1115_GAIN_0P256,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -45,7 +47,10 @@ def validate_mux(value):
|
||||||
return cv.one_of(*MUX)(value)
|
return cv.one_of(*MUX)(value)
|
||||||
|
|
||||||
|
|
||||||
|
ADS1115Sensor = sensor.sensor_ns.class_('ADS1115Sensor', sensor.EmptySensor)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(ADS1115Sensor),
|
||||||
vol.Required(CONF_MULTIPLEXER): validate_mux,
|
vol.Required(CONF_MULTIPLEXER): validate_mux,
|
||||||
vol.Required(CONF_GAIN): validate_gain,
|
vol.Required(CONF_GAIN): validate_gain,
|
||||||
cv.GenerateID(CONF_ADS1115_ID): cv.use_variable_id(ADS1115Component),
|
cv.GenerateID(CONF_ADS1115_ID): cv.use_variable_id(ADS1115Component),
|
||||||
|
@ -65,3 +70,7 @@ def to_code(config):
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_ADS1115_SENSOR'
|
BUILD_FLAGS = '-DUSE_ADS1115_SENSOR'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return sensor.core_to_hass_config(data, config)
|
||||||
|
|
|
@ -1,27 +1,31 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import sensor
|
from esphomeyaml.components import sensor, i2c
|
||||||
from esphomeyaml.const import CONF_ADDRESS, CONF_MAKE_ID, CONF_NAME, CONF_RESOLUTION, \
|
from esphomeyaml.const import CONF_ADDRESS, CONF_MAKE_ID, CONF_NAME, CONF_RESOLUTION, \
|
||||||
CONF_UPDATE_INTERVAL
|
CONF_UPDATE_INTERVAL
|
||||||
from esphomeyaml.helpers import App, Application, add, variable
|
from esphomeyaml.helpers import App, Application, add, variable, setup_component
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ['i2c']
|
||||||
|
|
||||||
|
BH1750Resolution = sensor.sensor_ns.enum('BH1750Resolution')
|
||||||
BH1750_RESOLUTIONS = {
|
BH1750_RESOLUTIONS = {
|
||||||
4.0: sensor.sensor_ns.BH1750_RESOLUTION_4P0_LX,
|
4.0: BH1750Resolution.BH1750_RESOLUTION_4P0_LX,
|
||||||
1.0: sensor.sensor_ns.BH1750_RESOLUTION_1P0_LX,
|
1.0: BH1750Resolution.BH1750_RESOLUTION_1P0_LX,
|
||||||
0.5: sensor.sensor_ns.BH1750_RESOLUTION_0P5_LX,
|
0.5: BH1750Resolution.BH1750_RESOLUTION_0P5_LX,
|
||||||
}
|
}
|
||||||
|
|
||||||
MakeBH1750Sensor = Application.MakeBH1750Sensor
|
MakeBH1750Sensor = Application.struct('MakeBH1750Sensor')
|
||||||
|
BH1750Sensor = sensor.sensor_ns.class_('BH1750Sensor', sensor.PollingSensorComponent,
|
||||||
|
i2c.I2CDevice)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
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),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBH1750Sensor),
|
||||||
vol.Optional(CONF_ADDRESS, default=0x23): cv.i2c_address,
|
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_RESOLUTION): vol.All(cv.positive_float, cv.one_of(*BH1750_RESOLUTIONS)),
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
||||||
}))
|
}).extend(cv.COMPONENT_SCHEMA.schema))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
@ -32,6 +36,11 @@ def to_code(config):
|
||||||
if CONF_RESOLUTION in config:
|
if CONF_RESOLUTION in config:
|
||||||
add(bh1750.set_resolution(BH1750_RESOLUTIONS[config[CONF_RESOLUTION]]))
|
add(bh1750.set_resolution(BH1750_RESOLUTIONS[config[CONF_RESOLUTION]]))
|
||||||
sensor.setup_sensor(bh1750, make_bh1750.Pmqtt, config)
|
sensor.setup_sensor(bh1750, make_bh1750.Pmqtt, config)
|
||||||
|
setup_component(bh1750, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_BH1750'
|
BUILD_FLAGS = '-DUSE_BH1750'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return sensor.core_to_hass_config(data, config)
|
||||||
|
|
|
@ -5,19 +5,25 @@ from esphomeyaml.components import sensor
|
||||||
from esphomeyaml.components.esp32_ble_tracker import CONF_ESP32_BLE_ID, ESP32BLETracker, \
|
from esphomeyaml.components.esp32_ble_tracker import CONF_ESP32_BLE_ID, ESP32BLETracker, \
|
||||||
make_address_array
|
make_address_array
|
||||||
from esphomeyaml.const import CONF_MAC_ADDRESS, CONF_NAME
|
from esphomeyaml.const import CONF_MAC_ADDRESS, CONF_NAME
|
||||||
from esphomeyaml.helpers import get_variable
|
from esphomeyaml.helpers import get_variable, esphomelib_ns
|
||||||
|
|
||||||
DEPENDENCIES = ['esp32_ble_tracker']
|
DEPENDENCIES = ['esp32_ble_tracker']
|
||||||
|
|
||||||
|
ESP32BLERSSISensor = esphomelib_ns.class_('ESP32BLERSSISensor', sensor.Sensor)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(ESP32BLERSSISensor),
|
||||||
vol.Required(CONF_MAC_ADDRESS): cv.mac_address,
|
vol.Required(CONF_MAC_ADDRESS): cv.mac_address,
|
||||||
cv.GenerateID(CONF_ESP32_BLE_ID): cv.use_variable_id(ESP32BLETracker)
|
cv.GenerateID(CONF_ESP32_BLE_ID): cv.use_variable_id(ESP32BLETracker)
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
hub = None
|
|
||||||
for hub in get_variable(config[CONF_ESP32_BLE_ID]):
|
for hub in get_variable(config[CONF_ESP32_BLE_ID]):
|
||||||
yield
|
yield
|
||||||
rhs = hub.make_rssi_sensor(config[CONF_NAME], make_address_array(config[CONF_MAC_ADDRESS]))
|
rhs = hub.make_rssi_sensor(config[CONF_NAME], make_address_array(config[CONF_MAC_ADDRESS]))
|
||||||
sensor.register_sensor(rhs, config)
|
sensor.register_sensor(rhs, config)
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return sensor.core_to_hass_config(data, config)
|
||||||
|
|
|
@ -4,42 +4,56 @@ import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import sensor
|
from esphomeyaml.components import sensor
|
||||||
from esphomeyaml.const import CONF_ADDRESS, CONF_HUMIDITY, CONF_IIR_FILTER, CONF_MAKE_ID, \
|
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
|
CONF_NAME, CONF_OVERSAMPLING, CONF_PRESSURE, CONF_TEMPERATURE, CONF_UPDATE_INTERVAL
|
||||||
from esphomeyaml.helpers import App, Application, add, variable
|
from esphomeyaml.helpers import App, Application, add, variable, setup_component
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ['i2c']
|
||||||
|
|
||||||
|
BME280Oversampling = sensor.sensor_ns.enum('BME280Oversampling')
|
||||||
OVERSAMPLING_OPTIONS = {
|
OVERSAMPLING_OPTIONS = {
|
||||||
'NONE': sensor.sensor_ns.BME280_OVERSAMPLING_NONE,
|
'NONE': BME280Oversampling.BME280_OVERSAMPLING_NONE,
|
||||||
'1X': sensor.sensor_ns.BME280_OVERSAMPLING_1X,
|
'1X': BME280Oversampling.BME280_OVERSAMPLING_1X,
|
||||||
'2X': sensor.sensor_ns.BME280_OVERSAMPLING_2X,
|
'2X': BME280Oversampling.BME280_OVERSAMPLING_2X,
|
||||||
'4X': sensor.sensor_ns.BME280_OVERSAMPLING_4X,
|
'4X': BME280Oversampling.BME280_OVERSAMPLING_4X,
|
||||||
'8X': sensor.sensor_ns.BME280_OVERSAMPLING_8X,
|
'8X': BME280Oversampling.BME280_OVERSAMPLING_8X,
|
||||||
'16X': sensor.sensor_ns.BME280_OVERSAMPLING_16X,
|
'16X': BME280Oversampling.BME280_OVERSAMPLING_16X,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BME280IIRFilter = sensor.sensor_ns.enum('BME280IIRFilter')
|
||||||
IIR_FILTER_OPTIONS = {
|
IIR_FILTER_OPTIONS = {
|
||||||
'OFF': sensor.sensor_ns.BME280_IIR_FILTER_OFF,
|
'OFF': BME280IIRFilter.BME280_IIR_FILTER_OFF,
|
||||||
'2X': sensor.sensor_ns.BME280_IIR_FILTER_2X,
|
'2X': BME280IIRFilter.BME280_IIR_FILTER_2X,
|
||||||
'4X': sensor.sensor_ns.BME280_IIR_FILTER_4X,
|
'4X': BME280IIRFilter.BME280_IIR_FILTER_4X,
|
||||||
'8X': sensor.sensor_ns.BME280_IIR_FILTER_8X,
|
'8X': BME280IIRFilter.BME280_IIR_FILTER_8X,
|
||||||
'16X': sensor.sensor_ns.BME280_IIR_FILTER_16X,
|
'16X': BME280IIRFilter.BME280_IIR_FILTER_16X,
|
||||||
}
|
}
|
||||||
|
|
||||||
BME280_OVERSAMPLING_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({
|
BME280_OVERSAMPLING_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({
|
||||||
vol.Optional(CONF_OVERSAMPLING): vol.All(vol.Upper, cv.one_of(*OVERSAMPLING_OPTIONS)),
|
vol.Optional(CONF_OVERSAMPLING): vol.All(vol.Upper, cv.one_of(*OVERSAMPLING_OPTIONS)),
|
||||||
})
|
})
|
||||||
|
|
||||||
MakeBME280Sensor = Application.MakeBME280Sensor
|
MakeBME280Sensor = Application.struct('MakeBME280Sensor')
|
||||||
|
BME280TemperatureSensor = sensor.sensor_ns.class_('BME280TemperatureSensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
BME280PressureSensor = sensor.sensor_ns.class_('BME280PressureSensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
BME280HumiditySensor = sensor.sensor_ns.class_('BME280HumiditySensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBME280Sensor),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBME280Sensor),
|
||||||
vol.Optional(CONF_ADDRESS, default=0x77): cv.i2c_address,
|
vol.Optional(CONF_ADDRESS, default=0x77): cv.i2c_address,
|
||||||
vol.Required(CONF_TEMPERATURE): cv.nameable(BME280_OVERSAMPLING_SENSOR_SCHEMA),
|
vol.Required(CONF_TEMPERATURE): cv.nameable(BME280_OVERSAMPLING_SENSOR_SCHEMA.extend({
|
||||||
vol.Required(CONF_PRESSURE): cv.nameable(BME280_OVERSAMPLING_SENSOR_SCHEMA),
|
cv.GenerateID(): cv.declare_variable_id(BME280TemperatureSensor),
|
||||||
vol.Required(CONF_HUMIDITY): cv.nameable(BME280_OVERSAMPLING_SENSOR_SCHEMA),
|
})),
|
||||||
|
vol.Required(CONF_PRESSURE): cv.nameable(BME280_OVERSAMPLING_SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(BME280PressureSensor),
|
||||||
|
})),
|
||||||
|
vol.Required(CONF_HUMIDITY): cv.nameable(BME280_OVERSAMPLING_SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(BME280HumiditySensor),
|
||||||
|
})),
|
||||||
vol.Optional(CONF_IIR_FILTER): vol.All(vol.Upper, cv.one_of(*IIR_FILTER_OPTIONS)),
|
vol.Optional(CONF_IIR_FILTER): vol.All(vol.Upper, cv.one_of(*IIR_FILTER_OPTIONS)),
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
@ -69,6 +83,13 @@ def to_code(config):
|
||||||
config[CONF_PRESSURE])
|
config[CONF_PRESSURE])
|
||||||
sensor.setup_sensor(bme280.Pget_humidity_sensor(), make.Pmqtt_humidity,
|
sensor.setup_sensor(bme280.Pget_humidity_sensor(), make.Pmqtt_humidity,
|
||||||
config[CONF_HUMIDITY])
|
config[CONF_HUMIDITY])
|
||||||
|
setup_component(bme280, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_BME280'
|
BUILD_FLAGS = '-DUSE_BME280'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return [sensor.core_to_hass_config(data, config[CONF_TEMPERATURE]),
|
||||||
|
sensor.core_to_hass_config(data, config[CONF_PRESSURE]),
|
||||||
|
sensor.core_to_hass_config(data, config[CONF_HUMIDITY])]
|
||||||
|
|
|
@ -6,43 +6,61 @@ from esphomeyaml.components import sensor
|
||||||
from esphomeyaml.const import CONF_ADDRESS, CONF_GAS_RESISTANCE, CONF_HUMIDITY, CONF_IIR_FILTER, \
|
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_MAKE_ID, CONF_NAME, CONF_OVERSAMPLING, CONF_PRESSURE, CONF_TEMPERATURE, \
|
||||||
CONF_UPDATE_INTERVAL, CONF_HEATER, CONF_DURATION
|
CONF_UPDATE_INTERVAL, CONF_HEATER, CONF_DURATION
|
||||||
from esphomeyaml.helpers import App, Application, add, variable
|
from esphomeyaml.helpers import App, Application, add, variable, setup_component
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ['i2c']
|
||||||
|
|
||||||
|
BME680Oversampling = sensor.sensor_ns.enum('BME680Oversampling')
|
||||||
OVERSAMPLING_OPTIONS = {
|
OVERSAMPLING_OPTIONS = {
|
||||||
'NONE': sensor.sensor_ns.BME680_OVERSAMPLING_NONE,
|
'NONE': BME680Oversampling.BME680_OVERSAMPLING_NONE,
|
||||||
'1X': sensor.sensor_ns.BME680_OVERSAMPLING_1X,
|
'1X': BME680Oversampling.BME680_OVERSAMPLING_1X,
|
||||||
'2X': sensor.sensor_ns.BME680_OVERSAMPLING_2X,
|
'2X': BME680Oversampling.BME680_OVERSAMPLING_2X,
|
||||||
'4X': sensor.sensor_ns.BME680_OVERSAMPLING_4X,
|
'4X': BME680Oversampling.BME680_OVERSAMPLING_4X,
|
||||||
'8X': sensor.sensor_ns.BME680_OVERSAMPLING_8X,
|
'8X': BME680Oversampling.BME680_OVERSAMPLING_8X,
|
||||||
'16X': sensor.sensor_ns.BME680_OVERSAMPLING_16X,
|
'16X': BME680Oversampling.BME680_OVERSAMPLING_16X,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BME680IIRFilter = sensor.sensor_ns.enum('BME680IIRFilter')
|
||||||
IIR_FILTER_OPTIONS = {
|
IIR_FILTER_OPTIONS = {
|
||||||
'OFF': sensor.sensor_ns.BME680_IIR_FILTER_OFF,
|
'OFF': BME680IIRFilter.BME680_IIR_FILTER_OFF,
|
||||||
'1X': sensor.sensor_ns.BME680_IIR_FILTER_1X,
|
'1X': BME680IIRFilter.BME680_IIR_FILTER_1X,
|
||||||
'3X': sensor.sensor_ns.BME680_IIR_FILTER_3X,
|
'3X': BME680IIRFilter.BME680_IIR_FILTER_3X,
|
||||||
'7X': sensor.sensor_ns.BME680_IIR_FILTER_7X,
|
'7X': BME680IIRFilter.BME680_IIR_FILTER_7X,
|
||||||
'15X': sensor.sensor_ns.BME680_IIR_FILTER_15X,
|
'15X': BME680IIRFilter.BME680_IIR_FILTER_15X,
|
||||||
'31X': sensor.sensor_ns.BME680_IIR_FILTER_31X,
|
'31X': BME680IIRFilter.BME680_IIR_FILTER_31X,
|
||||||
'63X': sensor.sensor_ns.BME680_IIR_FILTER_63X,
|
'63X': BME680IIRFilter.BME680_IIR_FILTER_63X,
|
||||||
'127X': sensor.sensor_ns.BME680_IIR_FILTER_127X,
|
'127X': BME680IIRFilter.BME680_IIR_FILTER_127X,
|
||||||
}
|
}
|
||||||
|
|
||||||
BME680_OVERSAMPLING_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({
|
BME680_OVERSAMPLING_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({
|
||||||
vol.Optional(CONF_OVERSAMPLING): vol.All(vol.Upper, cv.one_of(*OVERSAMPLING_OPTIONS)),
|
vol.Optional(CONF_OVERSAMPLING): vol.All(vol.Upper, cv.one_of(*OVERSAMPLING_OPTIONS)),
|
||||||
})
|
})
|
||||||
|
|
||||||
MakeBME680Sensor = Application.MakeBME680Sensor
|
MakeBME680Sensor = Application.struct('MakeBME680Sensor')
|
||||||
|
BME680TemperatureSensor = sensor.sensor_ns.class_('BME680TemperatureSensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
BME680PressureSensor = sensor.sensor_ns.class_('BME680PressureSensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
BME680HumiditySensor = sensor.sensor_ns.class_('BME680HumiditySensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
BME680GasResistanceSensor = sensor.sensor_ns.class_('BME680GasResistanceSensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBME680Sensor),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBME680Sensor),
|
||||||
vol.Optional(CONF_ADDRESS, default=0x76): cv.i2c_address,
|
vol.Optional(CONF_ADDRESS, default=0x76): cv.i2c_address,
|
||||||
vol.Required(CONF_TEMPERATURE): cv.nameable(BME680_OVERSAMPLING_SENSOR_SCHEMA),
|
vol.Required(CONF_TEMPERATURE): cv.nameable(BME680_OVERSAMPLING_SENSOR_SCHEMA.extend({
|
||||||
vol.Required(CONF_PRESSURE): cv.nameable(BME680_OVERSAMPLING_SENSOR_SCHEMA),
|
cv.GenerateID(): cv.declare_variable_id(BME680TemperatureSensor),
|
||||||
vol.Required(CONF_HUMIDITY): cv.nameable(BME680_OVERSAMPLING_SENSOR_SCHEMA),
|
})),
|
||||||
vol.Required(CONF_GAS_RESISTANCE): cv.nameable(sensor.SENSOR_SCHEMA),
|
vol.Required(CONF_PRESSURE): cv.nameable(BME680_OVERSAMPLING_SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(BME680PressureSensor),
|
||||||
|
})),
|
||||||
|
vol.Required(CONF_HUMIDITY): cv.nameable(BME680_OVERSAMPLING_SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(BME680HumiditySensor),
|
||||||
|
})),
|
||||||
|
vol.Required(CONF_GAS_RESISTANCE): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(BME680GasResistanceSensor),
|
||||||
|
})),
|
||||||
vol.Optional(CONF_IIR_FILTER): vol.All(vol.Upper, cv.one_of(*IIR_FILTER_OPTIONS)),
|
vol.Optional(CONF_IIR_FILTER): vol.All(vol.Upper, cv.one_of(*IIR_FILTER_OPTIONS)),
|
||||||
vol.Optional(CONF_HEATER): vol.Any(None, vol.All(vol.Schema({
|
vol.Optional(CONF_HEATER): vol.Any(None, vol.All(vol.Schema({
|
||||||
vol.Optional(CONF_TEMPERATURE, default=320): vol.All(vol.Coerce(int), vol.Range(200, 400)),
|
vol.Optional(CONF_TEMPERATURE, default=320): vol.All(vol.Coerce(int), vol.Range(200, 400)),
|
||||||
|
@ -50,7 +68,7 @@ PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({
|
||||||
cv.positive_time_period_milliseconds, vol.Range(max=core.TimePeriod(milliseconds=4032)))
|
cv.positive_time_period_milliseconds, vol.Range(max=core.TimePeriod(milliseconds=4032)))
|
||||||
}, cv.has_at_least_one_key(CONF_TEMPERATURE, CONF_DURATION)))),
|
}, cv.has_at_least_one_key(CONF_TEMPERATURE, CONF_DURATION)))),
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
@ -89,6 +107,14 @@ def to_code(config):
|
||||||
config[CONF_HUMIDITY])
|
config[CONF_HUMIDITY])
|
||||||
sensor.setup_sensor(bme680.Pget_gas_resistance_sensor(), make.Pmqtt_gas_resistance,
|
sensor.setup_sensor(bme680.Pget_gas_resistance_sensor(), make.Pmqtt_gas_resistance,
|
||||||
config[CONF_GAS_RESISTANCE])
|
config[CONF_GAS_RESISTANCE])
|
||||||
|
setup_component(bme680, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_BME680'
|
BUILD_FLAGS = '-DUSE_BME680'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return [sensor.core_to_hass_config(data, config[CONF_TEMPERATURE]),
|
||||||
|
sensor.core_to_hass_config(data, config[CONF_PRESSURE]),
|
||||||
|
sensor.core_to_hass_config(data, config[CONF_HUMIDITY]),
|
||||||
|
sensor.core_to_hass_config(data, config[CONF_GAS_RESISTANCE])]
|
||||||
|
|
|
@ -4,19 +4,27 @@ import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import sensor
|
from esphomeyaml.components import sensor
|
||||||
from esphomeyaml.const import CONF_ADDRESS, CONF_MAKE_ID, CONF_NAME, CONF_PRESSURE, \
|
from esphomeyaml.const import CONF_ADDRESS, CONF_MAKE_ID, CONF_NAME, CONF_PRESSURE, \
|
||||||
CONF_TEMPERATURE, CONF_UPDATE_INTERVAL
|
CONF_TEMPERATURE, CONF_UPDATE_INTERVAL
|
||||||
from esphomeyaml.helpers import App, Application, HexIntLiteral, add, variable
|
from esphomeyaml.helpers import App, Application, HexIntLiteral, add, variable, setup_component
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ['i2c']
|
||||||
|
|
||||||
MakeBMP085Sensor = Application.MakeBMP085Sensor
|
MakeBMP085Sensor = Application.struct('MakeBMP085Sensor')
|
||||||
|
BMP085TemperatureSensor = sensor.sensor_ns.class_('BMP085TemperatureSensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
BMP085PressureSensor = sensor.sensor_ns.class_('BMP085PressureSensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBMP085Sensor),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBMP085Sensor),
|
||||||
vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA),
|
vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
vol.Required(CONF_PRESSURE): cv.nameable(sensor.SENSOR_SCHEMA),
|
cv.GenerateID(): cv.declare_variable_id(BMP085TemperatureSensor),
|
||||||
|
})),
|
||||||
|
vol.Required(CONF_PRESSURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(BMP085PressureSensor),
|
||||||
|
})),
|
||||||
vol.Optional(CONF_ADDRESS): cv.i2c_address,
|
vol.Optional(CONF_ADDRESS): cv.i2c_address,
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
@ -31,6 +39,12 @@ def to_code(config):
|
||||||
config[CONF_TEMPERATURE])
|
config[CONF_TEMPERATURE])
|
||||||
sensor.setup_sensor(bmp.Pbmp.Pget_pressure_sensor(), bmp.Pmqtt_pressure,
|
sensor.setup_sensor(bmp.Pbmp.Pget_pressure_sensor(), bmp.Pmqtt_pressure,
|
||||||
config[CONF_PRESSURE])
|
config[CONF_PRESSURE])
|
||||||
|
setup_component(bmp.Pbmp, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_BMP085_SENSOR'
|
BUILD_FLAGS = '-DUSE_BMP085_SENSOR'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return [sensor.core_to_hass_config(data, config[CONF_TEMPERATURE]),
|
||||||
|
sensor.core_to_hass_config(data, config[CONF_PRESSURE])]
|
||||||
|
|
|
@ -4,41 +4,51 @@ import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import sensor
|
from esphomeyaml.components import sensor
|
||||||
from esphomeyaml.const import CONF_ADDRESS, CONF_IIR_FILTER, CONF_MAKE_ID, \
|
from esphomeyaml.const import CONF_ADDRESS, CONF_IIR_FILTER, CONF_MAKE_ID, \
|
||||||
CONF_NAME, CONF_OVERSAMPLING, CONF_PRESSURE, CONF_TEMPERATURE, CONF_UPDATE_INTERVAL
|
CONF_NAME, CONF_OVERSAMPLING, CONF_PRESSURE, CONF_TEMPERATURE, CONF_UPDATE_INTERVAL
|
||||||
from esphomeyaml.helpers import App, Application, add, variable
|
from esphomeyaml.helpers import App, Application, add, variable, setup_component
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ['i2c']
|
||||||
|
|
||||||
|
BMP280Oversampling = sensor.sensor_ns.enum('BMP280Oversampling')
|
||||||
OVERSAMPLING_OPTIONS = {
|
OVERSAMPLING_OPTIONS = {
|
||||||
'NONE': sensor.sensor_ns.BMP280_OVERSAMPLING_NONE,
|
'NONE': BMP280Oversampling.BMP280_OVERSAMPLING_NONE,
|
||||||
'1X': sensor.sensor_ns.BMP280_OVERSAMPLING_1X,
|
'1X': BMP280Oversampling.BMP280_OVERSAMPLING_1X,
|
||||||
'2X': sensor.sensor_ns.BMP280_OVERSAMPLING_2X,
|
'2X': BMP280Oversampling.BMP280_OVERSAMPLING_2X,
|
||||||
'4X': sensor.sensor_ns.BMP280_OVERSAMPLING_4X,
|
'4X': BMP280Oversampling.BMP280_OVERSAMPLING_4X,
|
||||||
'8X': sensor.sensor_ns.BMP280_OVERSAMPLING_8X,
|
'8X': BMP280Oversampling.BMP280_OVERSAMPLING_8X,
|
||||||
'16X': sensor.sensor_ns.BMP280_OVERSAMPLING_16X,
|
'16X': BMP280Oversampling.BMP280_OVERSAMPLING_16X,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BMP280IIRFilter = sensor.sensor_ns.enum('BMP280IIRFilter')
|
||||||
IIR_FILTER_OPTIONS = {
|
IIR_FILTER_OPTIONS = {
|
||||||
'OFF': sensor.sensor_ns.BMP280_IIR_FILTER_OFF,
|
'OFF': BMP280IIRFilter.BMP280_IIR_FILTER_OFF,
|
||||||
'2X': sensor.sensor_ns.BMP280_IIR_FILTER_2X,
|
'2X': BMP280IIRFilter.BMP280_IIR_FILTER_2X,
|
||||||
'4X': sensor.sensor_ns.BMP280_IIR_FILTER_4X,
|
'4X': BMP280IIRFilter.BMP280_IIR_FILTER_4X,
|
||||||
'8X': sensor.sensor_ns.BMP280_IIR_FILTER_8X,
|
'8X': BMP280IIRFilter.BMP280_IIR_FILTER_8X,
|
||||||
'16X': sensor.sensor_ns.BMP280_IIR_FILTER_16X,
|
'16X': BMP280IIRFilter.BMP280_IIR_FILTER_16X,
|
||||||
}
|
}
|
||||||
|
|
||||||
BMP280_OVERSAMPLING_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({
|
BMP280_OVERSAMPLING_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({
|
||||||
vol.Optional(CONF_OVERSAMPLING): vol.All(vol.Upper, cv.one_of(*OVERSAMPLING_OPTIONS)),
|
vol.Optional(CONF_OVERSAMPLING): vol.All(vol.Upper, cv.one_of(*OVERSAMPLING_OPTIONS)),
|
||||||
})
|
})
|
||||||
|
|
||||||
MakeBMP280Sensor = Application.MakeBMP280Sensor
|
MakeBMP280Sensor = Application.struct('MakeBMP280Sensor')
|
||||||
|
BMP280TemperatureSensor = sensor.sensor_ns.class_('BMP280TemperatureSensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
BMP280PressureSensor = sensor.sensor_ns.class_('BMP280PressureSensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBMP280Sensor),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBMP280Sensor),
|
||||||
vol.Optional(CONF_ADDRESS, default=0x77): cv.i2c_address,
|
vol.Optional(CONF_ADDRESS, default=0x77): cv.i2c_address,
|
||||||
vol.Required(CONF_TEMPERATURE): cv.nameable(BMP280_OVERSAMPLING_SENSOR_SCHEMA),
|
vol.Required(CONF_TEMPERATURE): cv.nameable(BMP280_OVERSAMPLING_SENSOR_SCHEMA.extend({
|
||||||
vol.Required(CONF_PRESSURE): cv.nameable(BMP280_OVERSAMPLING_SENSOR_SCHEMA),
|
cv.GenerateID(): cv.declare_variable_id(BMP280TemperatureSensor),
|
||||||
|
})),
|
||||||
|
vol.Required(CONF_PRESSURE): cv.nameable(BMP280_OVERSAMPLING_SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(BMP280PressureSensor),
|
||||||
|
})),
|
||||||
vol.Optional(CONF_IIR_FILTER): vol.All(vol.Upper, cv.one_of(*IIR_FILTER_OPTIONS)),
|
vol.Optional(CONF_IIR_FILTER): vol.All(vol.Upper, cv.one_of(*IIR_FILTER_OPTIONS)),
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
@ -62,6 +72,12 @@ def to_code(config):
|
||||||
config[CONF_TEMPERATURE])
|
config[CONF_TEMPERATURE])
|
||||||
sensor.setup_sensor(bmp280.Pget_pressure_sensor(), make.Pmqtt_pressure,
|
sensor.setup_sensor(bmp280.Pget_pressure_sensor(), make.Pmqtt_pressure,
|
||||||
config[CONF_PRESSURE])
|
config[CONF_PRESSURE])
|
||||||
|
setup_component(bmp280, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_BMP280'
|
BUILD_FLAGS = '-DUSE_BMP280'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return [sensor.core_to_hass_config(data, config[CONF_TEMPERATURE]),
|
||||||
|
sensor.core_to_hass_config(data, config[CONF_PRESSURE])]
|
||||||
|
|
|
@ -1,31 +1,44 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from esphomeyaml.components import sensor
|
from esphomeyaml.components import sensor, uart
|
||||||
from esphomeyaml.components.uart import UARTComponent
|
from esphomeyaml.components.uart import UARTComponent
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.const import CONF_CURRENT, CONF_ID, CONF_NAME, CONF_POWER, CONF_UART_ID, \
|
from esphomeyaml.const import CONF_CURRENT, CONF_ID, CONF_NAME, CONF_POWER, CONF_UART_ID, \
|
||||||
CONF_VOLTAGE
|
CONF_VOLTAGE
|
||||||
from esphomeyaml.helpers import App, Pvariable, get_variable
|
from esphomeyaml.helpers import App, Pvariable, get_variable, setup_component, Component
|
||||||
|
|
||||||
DEPENDENCIES = ['uart']
|
DEPENDENCIES = ['uart']
|
||||||
|
|
||||||
CSE7766Component = sensor.sensor_ns.CSE7766Component
|
CSE7766Component = sensor.sensor_ns.class_('CSE7766Component', Component, uart.UARTDevice)
|
||||||
|
CSE7766VoltageSensor = sensor.sensor_ns.class_('CSE7766VoltageSensor',
|
||||||
|
sensor.EmptySensor)
|
||||||
|
CSE7766CurrentSensor = sensor.sensor_ns.class_('CSE7766CurrentSensor',
|
||||||
|
sensor.EmptySensor)
|
||||||
|
CSE7766PowerSensor = sensor.sensor_ns.class_('CSE7766PowerSensor',
|
||||||
|
sensor.EmptySensor)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(): cv.declare_variable_id(CSE7766Component),
|
cv.GenerateID(): cv.declare_variable_id(CSE7766Component),
|
||||||
cv.GenerateID(CONF_UART_ID): cv.use_variable_id(UARTComponent),
|
cv.GenerateID(CONF_UART_ID): cv.use_variable_id(UARTComponent),
|
||||||
|
|
||||||
vol.Optional(CONF_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA),
|
vol.Optional(CONF_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
vol.Optional(CONF_CURRENT): cv.nameable(sensor.SENSOR_SCHEMA),
|
cv.GenerateID(): cv.declare_variable_id(CSE7766VoltageSensor),
|
||||||
vol.Optional(CONF_POWER): cv.nameable(sensor.SENSOR_SCHEMA),
|
})),
|
||||||
}), cv.has_at_least_one_key(CONF_VOLTAGE, CONF_CURRENT, CONF_POWER))
|
vol.Optional(CONF_CURRENT): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(CSE7766CurrentSensor),
|
||||||
|
})),
|
||||||
|
vol.Optional(CONF_POWER): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(CSE7766PowerSensor),
|
||||||
|
})),
|
||||||
|
}).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_least_one_key(CONF_VOLTAGE, CONF_CURRENT,
|
||||||
|
CONF_POWER))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
for uart in get_variable(config[CONF_UART_ID]):
|
for uart_ in get_variable(config[CONF_UART_ID]):
|
||||||
yield
|
yield
|
||||||
|
|
||||||
rhs = App.make_cse7766(uart)
|
rhs = App.make_cse7766(uart_)
|
||||||
cse = Pvariable(config[CONF_ID], rhs)
|
cse = Pvariable(config[CONF_ID], rhs)
|
||||||
|
|
||||||
if CONF_VOLTAGE in config:
|
if CONF_VOLTAGE in config:
|
||||||
|
@ -37,6 +50,15 @@ def to_code(config):
|
||||||
if CONF_POWER in config:
|
if CONF_POWER in config:
|
||||||
conf = config[CONF_POWER]
|
conf = config[CONF_POWER]
|
||||||
sensor.register_sensor(cse.make_power_sensor(conf[CONF_NAME]), conf)
|
sensor.register_sensor(cse.make_power_sensor(conf[CONF_NAME]), conf)
|
||||||
|
setup_component(cse, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_CSE7766'
|
BUILD_FLAGS = '-DUSE_CSE7766'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
ret = []
|
||||||
|
for key in (CONF_VOLTAGE, CONF_CURRENT, CONF_POWER):
|
||||||
|
if key in config:
|
||||||
|
ret.append(sensor.core_to_hass_config(data, config[key]))
|
||||||
|
return ret
|
||||||
|
|
|
@ -7,7 +7,11 @@ from esphomeyaml.const import CONF_ADDRESS, CONF_DALLAS_ID, CONF_INDEX, CONF_NAM
|
||||||
CONF_RESOLUTION
|
CONF_RESOLUTION
|
||||||
from esphomeyaml.helpers import HexIntLiteral, get_variable
|
from esphomeyaml.helpers import HexIntLiteral, get_variable
|
||||||
|
|
||||||
|
DallasTemperatureSensor = sensor.sensor_ns.class_('DallasTemperatureSensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(DallasTemperatureSensor),
|
||||||
vol.Exclusive(CONF_ADDRESS, 'dallas'): cv.hex_int,
|
vol.Exclusive(CONF_ADDRESS, 'dallas'): cv.hex_int,
|
||||||
vol.Exclusive(CONF_INDEX, 'dallas'): cv.positive_int,
|
vol.Exclusive(CONF_INDEX, 'dallas'): cv.positive_int,
|
||||||
cv.GenerateID(CONF_DALLAS_ID): cv.use_variable_id(DallasComponent),
|
cv.GenerateID(CONF_DALLAS_ID): cv.use_variable_id(DallasComponent),
|
||||||
|
@ -16,7 +20,6 @@ PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
hub = None
|
|
||||||
for hub in get_variable(config[CONF_DALLAS_ID]):
|
for hub in get_variable(config[CONF_DALLAS_ID]):
|
||||||
yield
|
yield
|
||||||
if CONF_ADDRESS in config:
|
if CONF_ADDRESS in config:
|
||||||
|
@ -29,3 +32,7 @@ def to_code(config):
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_DALLAS_SENSOR'
|
BUILD_FLAGS = '-DUSE_DALLAS_SENSOR'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return sensor.core_to_hass_config(data, config)
|
||||||
|
|
|
@ -3,46 +3,66 @@ import voluptuous as vol
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import sensor
|
from esphomeyaml.components import sensor
|
||||||
from esphomeyaml.const import CONF_HUMIDITY, CONF_MAKE_ID, CONF_MODEL, CONF_NAME, CONF_PIN, \
|
from esphomeyaml.const import CONF_HUMIDITY, CONF_MAKE_ID, CONF_MODEL, CONF_NAME, CONF_PIN, \
|
||||||
CONF_TEMPERATURE, CONF_UPDATE_INTERVAL
|
CONF_TEMPERATURE, CONF_UPDATE_INTERVAL, CONF_ID
|
||||||
from esphomeyaml.helpers import App, Application, add, gpio_output_pin_expression, variable
|
from esphomeyaml.helpers import App, Application, add, gpio_output_pin_expression, variable, \
|
||||||
|
setup_component, PollingComponent, Pvariable
|
||||||
from esphomeyaml.pins import gpio_output_pin_schema
|
from esphomeyaml.pins import gpio_output_pin_schema
|
||||||
|
|
||||||
|
DHTModel = sensor.sensor_ns.enum('DHTModel')
|
||||||
DHT_MODELS = {
|
DHT_MODELS = {
|
||||||
'AUTO_DETECT': sensor.sensor_ns.DHT_MODEL_AUTO_DETECT,
|
'AUTO_DETECT': DHTModel.DHT_MODEL_AUTO_DETECT,
|
||||||
'DHT11': sensor.sensor_ns.DHT_MODEL_DHT11,
|
'DHT11': DHTModel.DHT_MODEL_DHT11,
|
||||||
'DHT22': sensor.sensor_ns.DHT_MODEL_DHT22,
|
'DHT22': DHTModel.DHT_MODEL_DHT22,
|
||||||
'AM2302': sensor.sensor_ns.DHT_MODEL_AM2302,
|
'AM2302': DHTModel.DHT_MODEL_AM2302,
|
||||||
'RHT03': sensor.sensor_ns.DHT_MODEL_RHT03,
|
'RHT03': DHTModel.DHT_MODEL_RHT03,
|
||||||
}
|
}
|
||||||
|
|
||||||
MakeDHTSensor = Application.MakeDHTSensor
|
MakeDHTSensor = Application.struct('MakeDHTSensor')
|
||||||
|
DHTComponent = sensor.sensor_ns.class_('DHTComponent', PollingComponent)
|
||||||
|
DHTTemperatureSensor = sensor.sensor_ns.class_('DHTTemperatureSensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
DHTHumiditySensor = sensor.sensor_ns.class_('DHTHumiditySensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeDHTSensor),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeDHTSensor),
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(DHTComponent),
|
||||||
vol.Required(CONF_PIN): gpio_output_pin_schema,
|
vol.Required(CONF_PIN): gpio_output_pin_schema,
|
||||||
vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA),
|
vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA),
|
cv.GenerateID(): cv.declare_variable_id(DHTTemperatureSensor),
|
||||||
|
})),
|
||||||
|
vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(DHTHumiditySensor),
|
||||||
|
})),
|
||||||
vol.Optional(CONF_MODEL): vol.All(vol.Upper, cv.one_of(*DHT_MODELS)),
|
vol.Optional(CONF_MODEL): vol.All(vol.Upper, cv.one_of(*DHT_MODELS)),
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
pin = None
|
|
||||||
for pin in gpio_output_pin_expression(config[CONF_PIN]):
|
for pin in gpio_output_pin_expression(config[CONF_PIN]):
|
||||||
yield
|
yield
|
||||||
rhs = App.make_dht_sensor(config[CONF_TEMPERATURE][CONF_NAME],
|
rhs = App.make_dht_sensor(config[CONF_TEMPERATURE][CONF_NAME],
|
||||||
config[CONF_HUMIDITY][CONF_NAME],
|
config[CONF_HUMIDITY][CONF_NAME],
|
||||||
pin, config.get(CONF_UPDATE_INTERVAL))
|
pin, config.get(CONF_UPDATE_INTERVAL))
|
||||||
dht = variable(config[CONF_MAKE_ID], rhs)
|
make = variable(config[CONF_MAKE_ID], rhs)
|
||||||
|
dht = make.Pdht
|
||||||
|
Pvariable(config[CONF_ID], dht)
|
||||||
|
|
||||||
if CONF_MODEL in config:
|
if CONF_MODEL in config:
|
||||||
constant = DHT_MODELS[config[CONF_MODEL]]
|
constant = DHT_MODELS[config[CONF_MODEL]]
|
||||||
add(dht.Pdht.set_dht_model(constant))
|
add(dht.set_dht_model(constant))
|
||||||
|
|
||||||
sensor.setup_sensor(dht.Pdht.Pget_temperature_sensor(),
|
sensor.setup_sensor(dht.Pget_temperature_sensor(),
|
||||||
dht.Pmqtt_temperature, config[CONF_TEMPERATURE])
|
make.Pmqtt_temperature, config[CONF_TEMPERATURE])
|
||||||
sensor.setup_sensor(dht.Pdht.Pget_humidity_sensor(),
|
sensor.setup_sensor(dht.Pget_humidity_sensor(),
|
||||||
dht.Pmqtt_humidity, config[CONF_HUMIDITY])
|
make.Pmqtt_humidity, config[CONF_HUMIDITY])
|
||||||
|
setup_component(dht, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_DHT_SENSOR'
|
BUILD_FLAGS = '-DUSE_DHT_SENSOR'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return [sensor.core_to_hass_config(data, config[CONF_TEMPERATURE]),
|
||||||
|
sensor.core_to_hass_config(data, config[CONF_HUMIDITY])]
|
||||||
|
|
|
@ -1,33 +1,52 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import sensor
|
from esphomeyaml.components import sensor, i2c
|
||||||
from esphomeyaml.const import CONF_HUMIDITY, CONF_MAKE_ID, CONF_NAME, CONF_TEMPERATURE, \
|
from esphomeyaml.const import CONF_HUMIDITY, CONF_MAKE_ID, CONF_NAME, CONF_TEMPERATURE, \
|
||||||
CONF_UPDATE_INTERVAL
|
CONF_UPDATE_INTERVAL, CONF_ID
|
||||||
from esphomeyaml.helpers import App, Application, variable
|
from esphomeyaml.helpers import App, Application, variable, setup_component, PollingComponent, \
|
||||||
|
Pvariable
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ['i2c']
|
||||||
|
|
||||||
MakeDHT12Sensor = Application.MakeDHT12Sensor
|
MakeDHT12Sensor = Application.struct('MakeDHT12Sensor')
|
||||||
|
DHT12Component = sensor.sensor_ns.class_('DHT12Component', PollingComponent, i2c.I2CDevice)
|
||||||
|
DHT12TemperatureSensor = sensor.sensor_ns.class_('DHT12TemperatureSensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
DHT12HumiditySensor = sensor.sensor_ns.class_('DHT12HumiditySensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeDHT12Sensor),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeDHT12Sensor),
|
||||||
vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA),
|
cv.GenerateID(): cv.declare_variable_id(DHT12Component),
|
||||||
vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA),
|
vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(DHT12TemperatureSensor),
|
||||||
|
})),
|
||||||
|
vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(DHT12HumiditySensor),
|
||||||
|
})),
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
rhs = App.make_dht12_sensor(config[CONF_TEMPERATURE][CONF_NAME],
|
rhs = App.make_dht12_sensor(config[CONF_TEMPERATURE][CONF_NAME],
|
||||||
config[CONF_HUMIDITY][CONF_NAME],
|
config[CONF_HUMIDITY][CONF_NAME],
|
||||||
config.get(CONF_UPDATE_INTERVAL))
|
config.get(CONF_UPDATE_INTERVAL))
|
||||||
dht = variable(config[CONF_MAKE_ID], rhs)
|
make = variable(config[CONF_MAKE_ID], rhs)
|
||||||
|
dht = make.Pdht12
|
||||||
|
Pvariable(config[CONF_ID], dht)
|
||||||
|
|
||||||
sensor.setup_sensor(dht.Pdht12.Pget_temperature_sensor(), dht.Pmqtt_temperature,
|
sensor.setup_sensor(dht.Pget_temperature_sensor(), make.Pmqtt_temperature,
|
||||||
config[CONF_TEMPERATURE])
|
config[CONF_TEMPERATURE])
|
||||||
sensor.setup_sensor(dht.Pdht12.Pget_humidity_sensor(), dht.Pmqtt_humidity,
|
sensor.setup_sensor(dht.Pget_humidity_sensor(), make.Pmqtt_humidity,
|
||||||
config[CONF_HUMIDITY])
|
config[CONF_HUMIDITY])
|
||||||
|
setup_component(dht, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_DHT12_SENSOR'
|
BUILD_FLAGS = '-DUSE_DHT12_SENSOR'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return [sensor.core_to_hass_config(data, config[CONF_TEMPERATURE]),
|
||||||
|
sensor.core_to_hass_config(data, config[CONF_HUMIDITY])]
|
||||||
|
|
|
@ -4,25 +4,32 @@ import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml import pins
|
from esphomeyaml import pins
|
||||||
from esphomeyaml.components import sensor
|
from esphomeyaml.components import sensor
|
||||||
from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_PIN, CONF_UPDATE_INTERVAL
|
from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_PIN, CONF_UPDATE_INTERVAL
|
||||||
from esphomeyaml.helpers import App, Application, gpio_input_pin_expression, variable
|
from esphomeyaml.helpers import App, Application, gpio_input_pin_expression, variable, \
|
||||||
|
setup_component
|
||||||
|
|
||||||
MakeDutyCycleSensor = Application.MakeDutyCycleSensor
|
MakeDutyCycleSensor = Application.struct('MakeDutyCycleSensor')
|
||||||
|
DutyCycleSensor = sensor.sensor_ns.class_('DutyCycleSensor', sensor.PollingSensorComponent)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
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),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeDutyCycleSensor),
|
||||||
vol.Required(CONF_PIN): pins.internal_gpio_input_pin_schema,
|
vol.Required(CONF_PIN): pins.internal_gpio_input_pin_schema,
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
||||||
}))
|
}).extend(cv.COMPONENT_SCHEMA.schema))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
pin = None
|
|
||||||
for pin in gpio_input_pin_expression(config[CONF_PIN]):
|
for pin in gpio_input_pin_expression(config[CONF_PIN]):
|
||||||
yield
|
yield
|
||||||
rhs = App.make_duty_cycle_sensor(config[CONF_NAME], pin,
|
rhs = App.make_duty_cycle_sensor(config[CONF_NAME], pin,
|
||||||
config.get(CONF_UPDATE_INTERVAL))
|
config.get(CONF_UPDATE_INTERVAL))
|
||||||
make = variable(config[CONF_MAKE_ID], rhs)
|
make = variable(config[CONF_MAKE_ID], rhs)
|
||||||
sensor.setup_sensor(make.Pduty, make.Pmqtt, config)
|
sensor.setup_sensor(make.Pduty, make.Pmqtt, config)
|
||||||
|
setup_component(make.Pduty, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_DUTY_CYCLE_SENSOR'
|
BUILD_FLAGS = '-DUSE_DUTY_CYCLE_SENSOR'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return sensor.core_to_hass_config(data, config)
|
||||||
|
|
|
@ -3,22 +3,29 @@ import voluptuous as vol
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import sensor
|
from esphomeyaml.components import sensor
|
||||||
from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_UPDATE_INTERVAL, ESP_PLATFORM_ESP32
|
from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_UPDATE_INTERVAL, ESP_PLATFORM_ESP32
|
||||||
from esphomeyaml.helpers import App, Application, variable
|
from esphomeyaml.helpers import App, Application, variable, setup_component
|
||||||
|
|
||||||
ESP_PLATFORMS = [ESP_PLATFORM_ESP32]
|
ESP_PLATFORMS = [ESP_PLATFORM_ESP32]
|
||||||
|
|
||||||
MakeESP32HallSensor = Application.MakeESP32HallSensor
|
MakeESP32HallSensor = Application.struct('MakeESP32HallSensor')
|
||||||
|
ESP32HallSensor = sensor.sensor_ns.class_('ESP32HallSensor', sensor.PollingSensorComponent)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
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),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeESP32HallSensor),
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
||||||
}))
|
}).extend(cv.COMPONENT_SCHEMA.schema))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
rhs = App.make_esp32_hall_sensor(config[CONF_NAME], config.get(CONF_UPDATE_INTERVAL))
|
rhs = App.make_esp32_hall_sensor(config[CONF_NAME], config.get(CONF_UPDATE_INTERVAL))
|
||||||
make = variable(config[CONF_MAKE_ID], rhs)
|
make = variable(config[CONF_MAKE_ID], rhs)
|
||||||
sensor.setup_sensor(make.Phall, make.Pmqtt, config)
|
sensor.setup_sensor(make.Phall, make.Pmqtt, config)
|
||||||
|
setup_component(make.Phall, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_ESP32_HALL_SENSOR'
|
BUILD_FLAGS = '-DUSE_ESP32_HALL_SENSOR'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return sensor.core_to_hass_config(data, config)
|
||||||
|
|
|
@ -1,34 +1,53 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import sensor
|
from esphomeyaml.components import sensor, i2c
|
||||||
from esphomeyaml.const import CONF_HUMIDITY, CONF_MAKE_ID, CONF_NAME, CONF_TEMPERATURE, \
|
from esphomeyaml.const import CONF_HUMIDITY, CONF_MAKE_ID, CONF_NAME, CONF_TEMPERATURE, \
|
||||||
CONF_UPDATE_INTERVAL
|
CONF_UPDATE_INTERVAL, CONF_ID
|
||||||
from esphomeyaml.helpers import App, Application, variable
|
from esphomeyaml.helpers import App, Application, variable, setup_component, PollingComponent, \
|
||||||
|
Pvariable
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ['i2c']
|
||||||
|
|
||||||
MakeHDC1080Sensor = Application.MakeHDC1080Sensor
|
MakeHDC1080Sensor = Application.struct('MakeHDC1080Sensor')
|
||||||
|
HDC1080Component = sensor.sensor_ns.class_('HDC1080Component', PollingComponent, i2c.I2CDevice)
|
||||||
|
HDC1080TemperatureSensor = sensor.sensor_ns.class_('HDC1080TemperatureSensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
HDC1080HumiditySensor = sensor.sensor_ns.class_('HDC1080HumiditySensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHDC1080Sensor),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHDC1080Sensor),
|
||||||
vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA),
|
cv.GenerateID(): cv.declare_variable_id(HDC1080Component),
|
||||||
vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA),
|
vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(HDC1080TemperatureSensor),
|
||||||
|
})),
|
||||||
|
vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(HDC1080HumiditySensor),
|
||||||
|
})),
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
rhs = App.make_hdc1080_sensor(config[CONF_TEMPERATURE][CONF_NAME],
|
rhs = App.make_hdc1080_sensor(config[CONF_TEMPERATURE][CONF_NAME],
|
||||||
config[CONF_HUMIDITY][CONF_NAME],
|
config[CONF_HUMIDITY][CONF_NAME],
|
||||||
config.get(CONF_UPDATE_INTERVAL))
|
config.get(CONF_UPDATE_INTERVAL))
|
||||||
hdc1080 = variable(config[CONF_MAKE_ID], rhs)
|
make = variable(config[CONF_MAKE_ID], rhs)
|
||||||
|
hdc1080 = make.Phdc1080
|
||||||
|
Pvariable(config[CONF_ID], hdc1080)
|
||||||
|
|
||||||
sensor.setup_sensor(hdc1080.Phdc1080.Pget_temperature_sensor(),
|
sensor.setup_sensor(hdc1080.Pget_temperature_sensor(),
|
||||||
hdc1080.Pmqtt_temperature,
|
make.Pmqtt_temperature,
|
||||||
config[CONF_TEMPERATURE])
|
config[CONF_TEMPERATURE])
|
||||||
sensor.setup_sensor(hdc1080.Phdc1080.Pget_humidity_sensor(), hdc1080.Pmqtt_humidity,
|
sensor.setup_sensor(hdc1080.Pget_humidity_sensor(), make.Pmqtt_humidity,
|
||||||
config[CONF_HUMIDITY])
|
config[CONF_HUMIDITY])
|
||||||
|
setup_component(hdc1080, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_HDC1080_SENSOR'
|
BUILD_FLAGS = '-DUSE_HDC1080_SENSOR'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return [sensor.core_to_hass_config(data, config[CONF_TEMPERATURE]),
|
||||||
|
sensor.core_to_hass_config(data, config[CONF_HUMIDITY])]
|
||||||
|
|
|
@ -1,17 +1,18 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
|
||||||
from esphomeyaml import pins
|
from esphomeyaml import pins
|
||||||
from esphomeyaml.components import sensor
|
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 esphomeyaml.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_CURRENT_RESISTOR, CONF_ID, CONF_NAME, CONF_POWER, CONF_SEL_PIN, CONF_UPDATE_INTERVAL, \
|
||||||
CONF_VOLTAGE, CONF_VOLTAGE_DIVIDER
|
CONF_VOLTAGE, CONF_VOLTAGE_DIVIDER
|
||||||
from esphomeyaml.helpers import App, Pvariable, add, gpio_output_pin_expression
|
from esphomeyaml.helpers import App, PollingComponent, Pvariable, add, gpio_output_pin_expression, \
|
||||||
|
setup_component
|
||||||
|
|
||||||
HLW8012Component = sensor.sensor_ns.HLW8012Component
|
HLW8012Component = sensor.sensor_ns.class_('HLW8012Component', PollingComponent)
|
||||||
HLW8012VoltageSensor = sensor.sensor_ns.HLW8012VoltageSensor
|
HLW8012VoltageSensor = sensor.sensor_ns.class_('HLW8012VoltageSensor', sensor.EmptySensor)
|
||||||
HLW8012CurrentSensor = sensor.sensor_ns.HLW8012CurrentSensor
|
HLW8012CurrentSensor = sensor.sensor_ns.class_('HLW8012CurrentSensor', sensor.EmptySensor)
|
||||||
HLW8012PowerSensor = sensor.sensor_ns.HLW8012PowerSensor
|
HLW8012PowerSensor = sensor.sensor_ns.class_('HLW8012PowerSensor', sensor.EmptyPollingParentSensor)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(): cv.declare_variable_id(HLW8012Component),
|
cv.GenerateID(): cv.declare_variable_id(HLW8012Component),
|
||||||
|
@ -19,19 +20,25 @@ PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({
|
||||||
vol.Required(CONF_CF_PIN): pins.input_pin,
|
vol.Required(CONF_CF_PIN): pins.input_pin,
|
||||||
vol.Required(CONF_CF1_PIN): pins.input_pin,
|
vol.Required(CONF_CF1_PIN): pins.input_pin,
|
||||||
|
|
||||||
vol.Optional(CONF_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA),
|
vol.Optional(CONF_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
vol.Optional(CONF_CURRENT): cv.nameable(sensor.SENSOR_SCHEMA),
|
cv.GenerateID(): cv.declare_variable_id(HLW8012VoltageSensor),
|
||||||
vol.Optional(CONF_POWER): cv.nameable(sensor.SENSOR_SCHEMA),
|
})),
|
||||||
|
vol.Optional(CONF_CURRENT): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(HLW8012CurrentSensor),
|
||||||
|
})),
|
||||||
|
vol.Optional(CONF_POWER): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(HLW8012PowerSensor),
|
||||||
|
})),
|
||||||
|
|
||||||
vol.Optional(CONF_CURRENT_RESISTOR): cv.resistance,
|
vol.Optional(CONF_CURRENT_RESISTOR): cv.resistance,
|
||||||
vol.Optional(CONF_VOLTAGE_DIVIDER): cv.positive_float,
|
vol.Optional(CONF_VOLTAGE_DIVIDER): cv.positive_float,
|
||||||
vol.Optional(CONF_CHANGE_MODE_EVERY): vol.All(cv.uint32_t, vol.Range(min=1)),
|
vol.Optional(CONF_CHANGE_MODE_EVERY): vol.All(cv.uint32_t, vol.Range(min=1)),
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
||||||
}), cv.has_at_least_one_key(CONF_VOLTAGE, CONF_CURRENT, CONF_POWER))
|
}).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_least_one_key(CONF_VOLTAGE, CONF_CURRENT,
|
||||||
|
CONF_POWER))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
sel = None
|
|
||||||
for sel in gpio_output_pin_expression(config[CONF_SEL_PIN]):
|
for sel in gpio_output_pin_expression(config[CONF_SEL_PIN]):
|
||||||
yield
|
yield
|
||||||
|
|
||||||
|
@ -50,8 +57,19 @@ def to_code(config):
|
||||||
sensor.register_sensor(hlw.make_power_sensor(conf[CONF_NAME]), conf)
|
sensor.register_sensor(hlw.make_power_sensor(conf[CONF_NAME]), conf)
|
||||||
if CONF_CURRENT_RESISTOR in config:
|
if CONF_CURRENT_RESISTOR in config:
|
||||||
add(hlw.set_current_resistor(config[CONF_CURRENT_RESISTOR]))
|
add(hlw.set_current_resistor(config[CONF_CURRENT_RESISTOR]))
|
||||||
|
if CONF_VOLTAGE_DIVIDER in config:
|
||||||
|
add(hlw.set_voltage_divider(config[CONF_VOLTAGE_DIVIDER]))
|
||||||
if CONF_CHANGE_MODE_EVERY in config:
|
if CONF_CHANGE_MODE_EVERY in config:
|
||||||
add(hlw.set_change_mode_every(config[CONF_CHANGE_MODE_EVERY]))
|
add(hlw.set_change_mode_every(config[CONF_CHANGE_MODE_EVERY]))
|
||||||
|
setup_component(hlw, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_HLW8012'
|
BUILD_FLAGS = '-DUSE_HLW8012'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
ret = []
|
||||||
|
for key in (CONF_VOLTAGE, CONF_CURRENT, CONF_POWER):
|
||||||
|
if key in config:
|
||||||
|
ret.append(sensor.core_to_hass_config(data, config[key]))
|
||||||
|
return ret
|
||||||
|
|
|
@ -2,9 +2,9 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import sensor
|
from esphomeyaml.components import sensor, i2c
|
||||||
from esphomeyaml.const import CONF_ADDRESS, CONF_ID, CONF_NAME, CONF_UPDATE_INTERVAL, CONF_RANGE
|
from esphomeyaml.const import CONF_ADDRESS, CONF_ID, CONF_NAME, CONF_UPDATE_INTERVAL, CONF_RANGE
|
||||||
from esphomeyaml.helpers import App, Pvariable, add
|
from esphomeyaml.helpers import App, Pvariable, add, setup_component, PollingComponent
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ['i2c']
|
||||||
|
|
||||||
|
@ -13,19 +13,23 @@ CONF_FIELD_STRENGTH_Y = 'field_strength_y'
|
||||||
CONF_FIELD_STRENGTH_Z = 'field_strength_z'
|
CONF_FIELD_STRENGTH_Z = 'field_strength_z'
|
||||||
CONF_HEADING = 'heading'
|
CONF_HEADING = 'heading'
|
||||||
|
|
||||||
HMC5883LComponent = sensor.sensor_ns.HMC5883LComponent
|
HMC5883LComponent = sensor.sensor_ns.class_('HMC5883LComponent', PollingComponent, i2c.I2CDevice)
|
||||||
HMC5883LFieldStrengthSensor = sensor.sensor_ns.HMC5883LFieldStrengthSensor
|
HMC5883LFieldStrengthSensor = sensor.sensor_ns.class_('HMC5883LFieldStrengthSensor',
|
||||||
HMC5883LHeadingSensor = sensor.sensor_ns.HMC5883LHeadingSensor
|
sensor.EmptyPollingParentSensor)
|
||||||
|
HMC5883LHeadingSensor = sensor.sensor_ns.class_('HMC5883LHeadingSensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
|
||||||
|
|
||||||
|
HMC5883LRange = sensor.sensor_ns.enum('HMC5883LRange')
|
||||||
HMC5883L_RANGES = {
|
HMC5883L_RANGES = {
|
||||||
88: sensor.sensor_ns.HMC5883L_RANGE_88_UT,
|
88: HMC5883LRange.HMC5883L_RANGE_88_UT,
|
||||||
130: sensor.sensor_ns.HMC5883L_RANGE_130_UT,
|
130: HMC5883LRange.HMC5883L_RANGE_130_UT,
|
||||||
190: sensor.sensor_ns.HMC5883L_RANGE_190_UT,
|
190: HMC5883LRange.HMC5883L_RANGE_190_UT,
|
||||||
250: sensor.sensor_ns.HMC5883L_RANGE_250_UT,
|
250: HMC5883LRange.HMC5883L_RANGE_250_UT,
|
||||||
400: sensor.sensor_ns.HMC5883L_RANGE_400_UT,
|
400: HMC5883LRange.HMC5883L_RANGE_400_UT,
|
||||||
470: sensor.sensor_ns.HMC5883L_RANGE_470_UT,
|
470: HMC5883LRange.HMC5883L_RANGE_470_UT,
|
||||||
560: sensor.sensor_ns.HMC5883L_RANGE_560_UT,
|
560: HMC5883LRange.HMC5883L_RANGE_560_UT,
|
||||||
810: sensor.sensor_ns.HMC5883L_RANGE_810_UT,
|
810: HMC5883LRange.HMC5883L_RANGE_810_UT,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,17 +40,27 @@ def validate_range(value):
|
||||||
return cv.one_of(*HMC5883L_RANGES)(int(value))
|
return cv.one_of(*HMC5883L_RANGES)(int(value))
|
||||||
|
|
||||||
|
|
||||||
|
SENSOR_KEYS = [CONF_FIELD_STRENGTH_X, CONF_FIELD_STRENGTH_Y, CONF_FIELD_STRENGTH_Z,
|
||||||
|
CONF_HEADING]
|
||||||
|
|
||||||
PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(): cv.declare_variable_id(HMC5883LComponent),
|
cv.GenerateID(): cv.declare_variable_id(HMC5883LComponent),
|
||||||
vol.Optional(CONF_ADDRESS): cv.i2c_address,
|
vol.Optional(CONF_ADDRESS): cv.i2c_address,
|
||||||
vol.Optional(CONF_FIELD_STRENGTH_X): cv.nameable(sensor.SENSOR_SCHEMA),
|
vol.Optional(CONF_FIELD_STRENGTH_X): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
vol.Optional(CONF_FIELD_STRENGTH_Y): cv.nameable(sensor.SENSOR_SCHEMA),
|
cv.GenerateID(): cv.declare_variable_id(HMC5883LFieldStrengthSensor),
|
||||||
vol.Optional(CONF_FIELD_STRENGTH_Z): cv.nameable(sensor.SENSOR_SCHEMA),
|
})),
|
||||||
vol.Optional(CONF_HEADING): cv.nameable(sensor.SENSOR_SCHEMA),
|
vol.Optional(CONF_FIELD_STRENGTH_Y): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(HMC5883LFieldStrengthSensor),
|
||||||
|
})),
|
||||||
|
vol.Optional(CONF_FIELD_STRENGTH_Z): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(HMC5883LFieldStrengthSensor),
|
||||||
|
})),
|
||||||
|
vol.Optional(CONF_HEADING): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(HMC5883LHeadingSensor),
|
||||||
|
})),
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
||||||
vol.Optional(CONF_RANGE): validate_range,
|
vol.Optional(CONF_RANGE): validate_range,
|
||||||
}), cv.has_at_least_one_key(CONF_FIELD_STRENGTH_X, CONF_FIELD_STRENGTH_Y, CONF_FIELD_STRENGTH_Z,
|
}).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_least_one_key(*SENSOR_KEYS))
|
||||||
CONF_HEADING))
|
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
@ -68,6 +82,15 @@ def to_code(config):
|
||||||
if CONF_HEADING in config:
|
if CONF_HEADING in config:
|
||||||
conf = config[CONF_HEADING]
|
conf = config[CONF_HEADING]
|
||||||
sensor.register_sensor(hmc.Pmake_heading_sensor(conf[CONF_NAME]), conf)
|
sensor.register_sensor(hmc.Pmake_heading_sensor(conf[CONF_NAME]), conf)
|
||||||
|
setup_component(hmc, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_HMC5883L'
|
BUILD_FLAGS = '-DUSE_HMC5883L'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
ret = []
|
||||||
|
for key in (CONF_FIELD_STRENGTH_X, CONF_FIELD_STRENGTH_Y, CONF_FIELD_STRENGTH_Z, CONF_HEADING):
|
||||||
|
if key in config:
|
||||||
|
ret.append(sensor.core_to_hass_config(data, config[key]))
|
||||||
|
return ret
|
||||||
|
|
|
@ -1,32 +1,52 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
|
from esphomeyaml.components import i2c, sensor
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import sensor
|
|
||||||
from esphomeyaml.const import CONF_HUMIDITY, CONF_MAKE_ID, CONF_NAME, CONF_TEMPERATURE, \
|
from esphomeyaml.const import CONF_HUMIDITY, CONF_MAKE_ID, CONF_NAME, CONF_TEMPERATURE, \
|
||||||
CONF_UPDATE_INTERVAL
|
CONF_UPDATE_INTERVAL, CONF_ID
|
||||||
from esphomeyaml.helpers import App, Application, variable
|
from esphomeyaml.helpers import App, Application, PollingComponent, setup_component, variable, \
|
||||||
|
Pvariable
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ['i2c']
|
||||||
|
|
||||||
MakeHTU21DSensor = Application.MakeHTU21DSensor
|
MakeHTU21DSensor = Application.struct('MakeHTU21DSensor')
|
||||||
|
HTU21DComponent = sensor.sensor_ns.class_('HTU21DComponent', PollingComponent, i2c.I2CDevice)
|
||||||
|
HTU21DTemperatureSensor = sensor.sensor_ns.class_('HTU21DTemperatureSensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
HTU21DHumiditySensor = sensor.sensor_ns.class_('HTU21DHumiditySensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(HTU21DComponent),
|
||||||
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHTU21DSensor),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHTU21DSensor),
|
||||||
vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA),
|
vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA),
|
cv.GenerateID(): cv.declare_variable_id(HTU21DTemperatureSensor),
|
||||||
|
})),
|
||||||
|
vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(HTU21DHumiditySensor),
|
||||||
|
})),
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
||||||
})
|
}).extend(cv.COMPONENT_SCHEMA.schema)
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
rhs = App.make_htu21d_sensor(config[CONF_TEMPERATURE][CONF_NAME],
|
rhs = App.make_htu21d_sensor(config[CONF_TEMPERATURE][CONF_NAME],
|
||||||
config[CONF_HUMIDITY][CONF_NAME],
|
config[CONF_HUMIDITY][CONF_NAME],
|
||||||
config.get(CONF_UPDATE_INTERVAL))
|
config.get(CONF_UPDATE_INTERVAL))
|
||||||
htu21d = variable(config[CONF_MAKE_ID], rhs)
|
make = variable(config[CONF_MAKE_ID], rhs)
|
||||||
sensor.setup_sensor(htu21d.Phtu21d.Pget_temperature_sensor(), htu21d.Pmqtt_temperature,
|
htu21d = make.Phtu21d
|
||||||
|
Pvariable(config[CONF_ID], htu21d)
|
||||||
|
|
||||||
|
sensor.setup_sensor(htu21d.Pget_temperature_sensor(), make.Pmqtt_temperature,
|
||||||
config[CONF_TEMPERATURE])
|
config[CONF_TEMPERATURE])
|
||||||
sensor.setup_sensor(htu21d.Phtu21d.Pget_humidity_sensor(), htu21d.Pmqtt_humidity,
|
sensor.setup_sensor(htu21d.Pget_humidity_sensor(), make.Pmqtt_humidity,
|
||||||
config[CONF_HUMIDITY])
|
config[CONF_HUMIDITY])
|
||||||
|
setup_component(htu21d, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_HTU21D_SENSOR'
|
BUILD_FLAGS = '-DUSE_HTU21D_SENSOR'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return [sensor.core_to_hass_config(data, config[CONF_TEMPERATURE]),
|
||||||
|
sensor.core_to_hass_config(data, config[CONF_HUMIDITY])]
|
||||||
|
|
|
@ -4,43 +4,51 @@ import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml import pins
|
from esphomeyaml import pins
|
||||||
from esphomeyaml.components import sensor
|
from esphomeyaml.components import sensor
|
||||||
from esphomeyaml.const import CONF_GAIN, CONF_MAKE_ID, CONF_NAME, CONF_UPDATE_INTERVAL, CONF_CLK_PIN
|
from esphomeyaml.const import CONF_GAIN, CONF_MAKE_ID, CONF_NAME, CONF_UPDATE_INTERVAL, CONF_CLK_PIN
|
||||||
from esphomeyaml.helpers import App, Application, add, gpio_input_pin_expression, variable
|
from esphomeyaml.helpers import App, Application, add, gpio_input_pin_expression, variable, \
|
||||||
|
setup_component
|
||||||
|
|
||||||
MakeHX711Sensor = Application.MakeHX711Sensor
|
MakeHX711Sensor = Application.struct('MakeHX711Sensor')
|
||||||
|
HX711Sensor = sensor.sensor_ns.class_('HX711Sensor', sensor.PollingSensorComponent)
|
||||||
|
|
||||||
CONF_DOUT_PIN = 'dout_pin'
|
CONF_DOUT_PIN = 'dout_pin'
|
||||||
|
|
||||||
|
HX711Gain = sensor.sensor_ns.enum('HX711Gain')
|
||||||
GAINS = {
|
GAINS = {
|
||||||
128: sensor.sensor_ns.HX711_GAIN_128,
|
128: HX711Gain.HX711_GAIN_128,
|
||||||
32: sensor.sensor_ns.HX711_GAIN_32,
|
32: HX711Gain.HX711_GAIN_32,
|
||||||
64: sensor.sensor_ns.HX711_GAIN_64,
|
64: HX711Gain.HX711_GAIN_64,
|
||||||
}
|
}
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
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),
|
cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHX711Sensor),
|
||||||
vol.Required(CONF_DOUT_PIN): pins.gpio_input_pin_schema,
|
vol.Required(CONF_DOUT_PIN): pins.gpio_input_pin_schema,
|
||||||
vol.Required(CONF_CLK_PIN): pins.gpio_output_pin_schema,
|
vol.Required(CONF_CLK_PIN): pins.gpio_output_pin_schema,
|
||||||
vol.Optional(CONF_GAIN): vol.All(cv.int_, cv.one_of(*GAINS)),
|
vol.Optional(CONF_GAIN): vol.All(cv.int_, cv.one_of(*GAINS)),
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
||||||
}))
|
}).extend(cv.COMPONENT_SCHEMA.schema))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
dout_pin = None
|
|
||||||
for dout_pin in gpio_input_pin_expression(config[CONF_DOUT_PIN]):
|
for dout_pin in gpio_input_pin_expression(config[CONF_DOUT_PIN]):
|
||||||
yield
|
yield
|
||||||
sck_pin = None
|
|
||||||
for sck_pin in gpio_input_pin_expression(config[CONF_CLK_PIN]):
|
for sck_pin in gpio_input_pin_expression(config[CONF_CLK_PIN]):
|
||||||
yield
|
yield
|
||||||
|
|
||||||
rhs = App.make_hx711_sensor(config[CONF_NAME], dout_pin, sck_pin,
|
rhs = App.make_hx711_sensor(config[CONF_NAME], dout_pin, sck_pin,
|
||||||
config.get(CONF_UPDATE_INTERVAL))
|
config.get(CONF_UPDATE_INTERVAL))
|
||||||
make = variable(config[CONF_MAKE_ID], rhs)
|
make = variable(config[CONF_MAKE_ID], rhs)
|
||||||
|
hx711 = make.Phx711
|
||||||
|
|
||||||
if CONF_GAIN in config:
|
if CONF_GAIN in config:
|
||||||
add(make.Phx711.set_gain(GAINS[config[CONF_GAIN]]))
|
add(hx711.set_gain(GAINS[config[CONF_GAIN]]))
|
||||||
|
|
||||||
sensor.setup_sensor(make.Phx711, make.Pmqtt, config)
|
sensor.setup_sensor(hx711, make.Pmqtt, config)
|
||||||
|
setup_component(hx711, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_HX711'
|
BUILD_FLAGS = '-DUSE_HX711'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return sensor.core_to_hass_config(data, config)
|
||||||
|
|
|
@ -1,34 +1,46 @@
|
||||||
# coding=utf-8
|
# coding=utf-8
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
|
from esphomeyaml.components import i2c, sensor
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import sensor
|
from esphomeyaml.const import CONF_ADDRESS, CONF_BUS_VOLTAGE, CONF_CURRENT, CONF_ID, \
|
||||||
from esphomeyaml.const import CONF_ADDRESS, CONF_CURRENT, CONF_ID, CONF_MAX_CURRENT, \
|
CONF_MAX_CURRENT, CONF_MAX_VOLTAGE, CONF_NAME, CONF_POWER, CONF_SHUNT_RESISTANCE, \
|
||||||
CONF_MAX_VOLTAGE, CONF_NAME, CONF_POWER, CONF_UPDATE_INTERVAL, CONF_BUS_VOLTAGE, \
|
CONF_SHUNT_VOLTAGE, CONF_UPDATE_INTERVAL
|
||||||
CONF_SHUNT_VOLTAGE, CONF_SHUNT_RESISTANCE
|
from esphomeyaml.helpers import App, PollingComponent, Pvariable, setup_component
|
||||||
from esphomeyaml.helpers import App, Pvariable
|
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ['i2c']
|
||||||
|
|
||||||
INA219Component = sensor.sensor_ns.INA219Component
|
INA219Component = sensor.sensor_ns.class_('INA219Component', PollingComponent, i2c.I2CDevice)
|
||||||
INA219VoltageSensor = sensor.sensor_ns.INA219VoltageSensor
|
INA219VoltageSensor = sensor.sensor_ns.class_('INA219VoltageSensor',
|
||||||
INA219CurrentSensor = sensor.sensor_ns.INA219CurrentSensor
|
sensor.EmptyPollingParentSensor)
|
||||||
INA219PowerSensor = sensor.sensor_ns.INA219PowerSensor
|
INA219CurrentSensor = sensor.sensor_ns.class_('INA219CurrentSensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
INA219PowerSensor = sensor.sensor_ns.class_('INA219PowerSensor', sensor.EmptyPollingParentSensor)
|
||||||
|
|
||||||
|
SENSOR_KEYS = [CONF_BUS_VOLTAGE, CONF_SHUNT_VOLTAGE, CONF_CURRENT,
|
||||||
|
CONF_POWER]
|
||||||
|
|
||||||
PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(): cv.declare_variable_id(INA219Component),
|
cv.GenerateID(): cv.declare_variable_id(INA219Component),
|
||||||
vol.Optional(CONF_ADDRESS, default=0x40): cv.i2c_address,
|
vol.Optional(CONF_ADDRESS, default=0x40): cv.i2c_address,
|
||||||
vol.Optional(CONF_BUS_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA),
|
vol.Optional(CONF_BUS_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
vol.Optional(CONF_SHUNT_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA),
|
cv.GenerateID(): cv.declare_variable_id(INA219VoltageSensor),
|
||||||
vol.Optional(CONF_CURRENT): cv.nameable(sensor.SENSOR_SCHEMA),
|
})),
|
||||||
vol.Optional(CONF_POWER): cv.nameable(sensor.SENSOR_SCHEMA),
|
vol.Optional(CONF_SHUNT_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(INA219VoltageSensor),
|
||||||
|
})),
|
||||||
|
vol.Optional(CONF_CURRENT): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(INA219CurrentSensor),
|
||||||
|
})),
|
||||||
|
vol.Optional(CONF_POWER): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(INA219PowerSensor),
|
||||||
|
})),
|
||||||
vol.Optional(CONF_SHUNT_RESISTANCE, default=0.1): vol.All(cv.resistance,
|
vol.Optional(CONF_SHUNT_RESISTANCE, default=0.1): vol.All(cv.resistance,
|
||||||
vol.Range(min=0.0, max=32.0)),
|
vol.Range(min=0.0, max=32.0)),
|
||||||
vol.Optional(CONF_MAX_VOLTAGE, default=32.0): vol.All(cv.voltage, vol.Range(min=0.0, max=32.0)),
|
vol.Optional(CONF_MAX_VOLTAGE, default=32.0): vol.All(cv.voltage, vol.Range(min=0.0, max=32.0)),
|
||||||
vol.Optional(CONF_MAX_CURRENT, default=3.2): vol.All(cv.current, vol.Range(min=0.0)),
|
vol.Optional(CONF_MAX_CURRENT, default=3.2): vol.All(cv.current, vol.Range(min=0.0)),
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
||||||
}), cv.has_at_least_one_key(CONF_BUS_VOLTAGE, CONF_SHUNT_VOLTAGE, CONF_CURRENT,
|
}).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_least_one_key(*SENSOR_KEYS))
|
||||||
CONF_POWER))
|
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
|
@ -48,6 +60,15 @@ def to_code(config):
|
||||||
if CONF_POWER in config:
|
if CONF_POWER in config:
|
||||||
conf = config[CONF_POWER]
|
conf = config[CONF_POWER]
|
||||||
sensor.register_sensor(ina.Pmake_power_sensor(conf[CONF_NAME]), conf)
|
sensor.register_sensor(ina.Pmake_power_sensor(conf[CONF_NAME]), conf)
|
||||||
|
setup_component(ina, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_INA219'
|
BUILD_FLAGS = '-DUSE_INA219'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
ret = []
|
||||||
|
for key in (CONF_BUS_VOLTAGE, CONF_SHUNT_VOLTAGE, CONF_CURRENT, CONF_POWER):
|
||||||
|
if key in config:
|
||||||
|
ret.append(sensor.core_to_hass_config(data, config[key]))
|
||||||
|
return ret
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
# coding=utf-8
|
# coding=utf-8
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
|
from esphomeyaml.components import i2c, sensor
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml.components import sensor
|
|
||||||
from esphomeyaml.const import CONF_ADDRESS, CONF_BUS_VOLTAGE, CONF_CURRENT, CONF_ID, CONF_NAME, \
|
from esphomeyaml.const import CONF_ADDRESS, CONF_BUS_VOLTAGE, CONF_CURRENT, CONF_ID, CONF_NAME, \
|
||||||
CONF_POWER, CONF_SHUNT_RESISTANCE, CONF_SHUNT_VOLTAGE, CONF_UPDATE_INTERVAL
|
CONF_POWER, CONF_SHUNT_RESISTANCE, CONF_SHUNT_VOLTAGE, CONF_UPDATE_INTERVAL
|
||||||
from esphomeyaml.helpers import App, Pvariable, add
|
from esphomeyaml.helpers import App, PollingComponent, Pvariable, add, setup_component
|
||||||
|
|
||||||
DEPENDENCIES = ['i2c']
|
DEPENDENCIES = ['i2c']
|
||||||
|
|
||||||
|
@ -13,20 +13,31 @@ CONF_CHANNEL_1 = 'channel_1'
|
||||||
CONF_CHANNEL_2 = 'channel_2'
|
CONF_CHANNEL_2 = 'channel_2'
|
||||||
CONF_CHANNEL_3 = 'channel_3'
|
CONF_CHANNEL_3 = 'channel_3'
|
||||||
|
|
||||||
INA3221Component = sensor.sensor_ns.INA3221Component
|
INA3221Component = sensor.sensor_ns.class_('INA3221Component', PollingComponent, i2c.I2CDevice)
|
||||||
INA3221VoltageSensor = sensor.sensor_ns.INA3221VoltageSensor
|
INA3221VoltageSensor = sensor.sensor_ns.class_('INA3221VoltageSensor',
|
||||||
INA3221CurrentSensor = sensor.sensor_ns.INA3221CurrentSensor
|
sensor.EmptyPollingParentSensor)
|
||||||
INA3221PowerSensor = sensor.sensor_ns.INA3221PowerSensor
|
INA3221CurrentSensor = sensor.sensor_ns.class_('INA3221CurrentSensor',
|
||||||
|
sensor.EmptyPollingParentSensor)
|
||||||
|
INA3221PowerSensor = sensor.sensor_ns.class_('INA3221PowerSensor', sensor.EmptyPollingParentSensor)
|
||||||
|
|
||||||
|
SENSOR_KEYS = [CONF_BUS_VOLTAGE, CONF_SHUNT_VOLTAGE, CONF_CURRENT, CONF_POWER]
|
||||||
|
|
||||||
INA3221_CHANNEL_SCHEMA = vol.All(vol.Schema({
|
INA3221_CHANNEL_SCHEMA = vol.All(vol.Schema({
|
||||||
vol.Optional(CONF_BUS_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA),
|
vol.Optional(CONF_BUS_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
vol.Optional(CONF_SHUNT_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA),
|
cv.GenerateID(): cv.declare_variable_id(INA3221VoltageSensor),
|
||||||
vol.Optional(CONF_CURRENT): cv.nameable(sensor.SENSOR_SCHEMA),
|
})),
|
||||||
vol.Optional(CONF_POWER): cv.nameable(sensor.SENSOR_SCHEMA),
|
vol.Optional(CONF_SHUNT_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(INA3221VoltageSensor),
|
||||||
|
})),
|
||||||
|
vol.Optional(CONF_CURRENT): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(INA3221CurrentSensor),
|
||||||
|
})),
|
||||||
|
vol.Optional(CONF_POWER): cv.nameable(sensor.SENSOR_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_variable_id(INA3221PowerSensor),
|
||||||
|
})),
|
||||||
vol.Optional(CONF_SHUNT_RESISTANCE, default=0.1): vol.All(cv.resistance,
|
vol.Optional(CONF_SHUNT_RESISTANCE, default=0.1): vol.All(cv.resistance,
|
||||||
vol.Range(min=0.0, max=32.0)),
|
vol.Range(min=0.0, max=32.0)),
|
||||||
}), cv.has_at_least_one_key(CONF_BUS_VOLTAGE, CONF_SHUNT_VOLTAGE, CONF_CURRENT,
|
}).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_least_one_key(*SENSOR_KEYS))
|
||||||
CONF_POWER))
|
|
||||||
|
|
||||||
PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(): cv.declare_variable_id(INA3221Component),
|
cv.GenerateID(): cv.declare_variable_id(INA3221Component),
|
||||||
|
@ -60,5 +71,19 @@ def to_code(config):
|
||||||
c = conf[CONF_POWER]
|
c = conf[CONF_POWER]
|
||||||
sensor.register_sensor(ina.Pmake_power_sensor(i, c[CONF_NAME]), c)
|
sensor.register_sensor(ina.Pmake_power_sensor(i, c[CONF_NAME]), c)
|
||||||
|
|
||||||
|
setup_component(ina, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_INA3221'
|
BUILD_FLAGS = '-DUSE_INA3221'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
ret = []
|
||||||
|
for channel in (CONF_CHANNEL_1, CONF_CHANNEL_2, CONF_CHANNEL_3):
|
||||||
|
if channel not in config:
|
||||||
|
continue
|
||||||
|
conf = config[channel]
|
||||||
|
for key in (CONF_BUS_VOLTAGE, CONF_SHUNT_VOLTAGE, CONF_CURRENT, CONF_POWER):
|
||||||
|
if key in conf:
|
||||||
|
ret.append(sensor.core_to_hass_config(data, conf[key]))
|
||||||
|
return ret
|
||||||
|
|
|
@ -2,33 +2,41 @@ import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml import pins
|
from esphomeyaml import pins
|
||||||
from esphomeyaml.components import sensor
|
from esphomeyaml.components import sensor, spi
|
||||||
from esphomeyaml.components.spi import SPIComponent
|
from esphomeyaml.components.spi import SPIComponent
|
||||||
from esphomeyaml.const import CONF_CS_PIN, CONF_MAKE_ID, CONF_NAME, CONF_SPI_ID, \
|
from esphomeyaml.const import CONF_CS_PIN, CONF_MAKE_ID, CONF_NAME, CONF_SPI_ID, \
|
||||||
CONF_UPDATE_INTERVAL
|
CONF_UPDATE_INTERVAL
|
||||||
from esphomeyaml.helpers import App, Application, get_variable, gpio_output_pin_expression, variable
|
from esphomeyaml.helpers import App, Application, get_variable, gpio_output_pin_expression, \
|
||||||
|
variable, setup_component
|
||||||
|
|
||||||
MakeMAX6675Sensor = Application.MakeMAX6675Sensor
|
MakeMAX6675Sensor = Application.struct('MakeMAX6675Sensor')
|
||||||
|
MAX6675Sensor = sensor.sensor_ns.class_('MAX6675Sensor', sensor.PollingSensorComponent,
|
||||||
|
spi.SPIDevice)
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
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_MAKE_ID): cv.declare_variable_id(MakeMAX6675Sensor),
|
||||||
cv.GenerateID(CONF_SPI_ID): cv.use_variable_id(SPIComponent),
|
cv.GenerateID(CONF_SPI_ID): cv.use_variable_id(SPIComponent),
|
||||||
vol.Required(CONF_CS_PIN): pins.gpio_output_pin_schema,
|
vol.Required(CONF_CS_PIN): pins.gpio_output_pin_schema,
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
||||||
}))
|
}).extend(cv.COMPONENT_SCHEMA.schema))
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
spi = None
|
for spi_ in get_variable(config[CONF_SPI_ID]):
|
||||||
for spi in get_variable(config[CONF_SPI_ID]):
|
|
||||||
yield
|
yield
|
||||||
cs = None
|
|
||||||
for cs in gpio_output_pin_expression(config[CONF_CS_PIN]):
|
for cs in gpio_output_pin_expression(config[CONF_CS_PIN]):
|
||||||
yield
|
yield
|
||||||
rhs = App.make_max6675_sensor(config[CONF_NAME], spi, cs,
|
rhs = App.make_max6675_sensor(config[CONF_NAME], spi_, cs,
|
||||||
config.get(CONF_UPDATE_INTERVAL))
|
config.get(CONF_UPDATE_INTERVAL))
|
||||||
make = variable(config[CONF_MAKE_ID], rhs)
|
make = variable(config[CONF_MAKE_ID], rhs)
|
||||||
sensor.setup_sensor(make.Pmax6675, make.Pmqtt, config)
|
max6675 = make.Pmax6675
|
||||||
|
sensor.setup_sensor(max6675, make.Pmqtt, config)
|
||||||
|
setup_component(max6675, config)
|
||||||
|
|
||||||
|
|
||||||
BUILD_FLAGS = '-DUSE_MAX6675_SENSOR'
|
BUILD_FLAGS = '-DUSE_MAX6675_SENSOR'
|
||||||
|
|
||||||
|
|
||||||
|
def to_hass_config(data, config):
|
||||||
|
return sensor.core_to_hass_config(data, config)
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue