mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	Merge branch 'rc'
This commit is contained in:
		
							
								
								
									
										255
									
								
								.gitlab-ci.yml
									
									
									
									
									
								
							
							
						
						
									
										255
									
								
								.gitlab-ci.yml
									
									
									
									
									
								
							| @@ -61,116 +61,239 @@ test2: | ||||
|   <<: *docker-builder | ||||
|   stage: build | ||||
|   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 \ | ||||
|            -t . \ | ||||
|            -i ottowinter/esphomeyaml-hassio-${ADDON_ARCH} \ | ||||
|            -d "$CI_REGISTRY" \ | ||||
|            --${ADDON_ARCH} | ||||
|       docker build \ | ||||
|         --build-arg "BUILD_FROM=${BUILD_FROM}" \ | ||||
|         --build-arg "ADDON_ARCH=${ADDON_ARCH}" \ | ||||
|         --build-arg "ADDON_VERSION=${ADDON_VERSION}" \ | ||||
|         --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 \ | ||||
|         "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:dev" \ | ||||
|         "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" | ||||
|     - docker push "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" | ||||
|     - docker push "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:dev" | ||||
|   retry: 2 | ||||
|       if [ "${DO_PUSH:-true}" = true ]; then | ||||
|         echo "Pushing to CI registry" | ||||
|         docker push ${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA} | ||||
|         docker push ${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:dev | ||||
|       fi | ||||
|  | ||||
| # Generic deploy template | ||||
| .deploy: &deploy | ||||
| .deploy-release: &deploy-release | ||||
|   <<: *docker-builder | ||||
|   stage: deploy | ||||
|   script: | ||||
|     - version=${CI_COMMIT_TAG:1} | ||||
|     - echo "Publishing version ${version}" | ||||
|     - version="${CI_COMMIT_TAG#v}" | ||||
|     - 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 pull "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" | ||||
|  | ||||
|     - echo "Tag ${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${version}" | ||||
|     - | | ||||
|       docker tag \ | ||||
|         "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \ | ||||
|         "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:latest" | ||||
|         "${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}:latest" | ||||
|     - | | ||||
|       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}" | ||||
|     - docker push "ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}" | ||||
|  | ||||
|     - echo "Tag ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:latest" | ||||
|     - | | ||||
|       docker tag \ | ||||
|         "ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${version}" \ | ||||
|         "${CI_REGISTRY}/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" \ | ||||
|         "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" | ||||
|  | ||||
|     - 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:normal: | ||||
|   <<: *docker-builder | ||||
|   stage: build | ||||
|   script: | ||||
|     - docker build -t "${CI_REGISTRY}/ottowinter/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" | ||||
|     - docker build -t "${CI_REGISTRY}/esphomeyaml:dev" . | ||||
|  | ||||
| build:armhf: | ||||
| .build-hassio-edge: &build-hassio-edge | ||||
|   <<: *build-hassio | ||||
|   except: | ||||
|     - /^v\d+\.\d+\.\d+$/ | ||||
|     - /^v\d+\.\d+\.\d+b\d+$/ | ||||
|  | ||||
| .build-hassio-release: &build-hassio-release | ||||
|   <<: *build-hassio | ||||
|   only: | ||||
|     - /^v\d+\.\d+\.\d+$/ | ||||
|     - /^v\d+\.\d+\.\d+b\d+$/ | ||||
|  | ||||
| build:hassio-armhf-edge: | ||||
|   <<: *build-hassio-edge | ||||
|   variables: | ||||
|     ADDON_ARCH: armhf | ||||
|     DO_PUSH: "false" | ||||
|  | ||||
| #build:aarch64: | ||||
| #   <<: *build | ||||
| build:hassio-armhf: | ||||
|   <<: *build-hassio-release | ||||
|   variables: | ||||
|     ADDON_ARCH: armhf | ||||
|     ESPHOMELIB_VERSION: "${CI_COMMIT_TAG}" | ||||
|  | ||||
| #build:hassio-aarch64-edge: | ||||
| #  <<: *build-hassio-edge | ||||
| #  variables: | ||||
| #    ADDON_ARCH: aarch64 | ||||
| #    DO_PUSH: "false" | ||||
|  | ||||
| build:i386: | ||||
|   <<: *build-hassio | ||||
| #build:hassio-aarch64: | ||||
| #  <<: *build-hassio-release | ||||
| #  variables: | ||||
| #    ADDON_ARCH: aarch64 | ||||
| #    ESPHOMELIB_VERSION: "${CI_COMMIT_TAG}" | ||||
|  | ||||
| build:hassio-i386-edge: | ||||
|   <<: *build-hassio-edge | ||||
|   variables: | ||||
|     ADDON_ARCH: i386 | ||||
|     DO_PUSH: "false" | ||||
|  | ||||
| build:amd64: | ||||
|   <<: *build-hassio | ||||
| build:hassio-i386: | ||||
|   <<: *build-hassio-release | ||||
|   variables: | ||||
|     ADDON_ARCH: i386 | ||||
|     ESPHOMELIB_VERSION: "${CI_COMMIT_TAG}" | ||||
|  | ||||
| build:hassio-amd64-edge: | ||||
|   <<: *build-hassio-edge | ||||
|   variables: | ||||
|     ADDON_ARCH: amd64 | ||||
|     DO_PUSH: "false" | ||||
|  | ||||
| build:hassio-amd64: | ||||
|   <<: *build-hassio-release | ||||
|   variables: | ||||
|     ADDON_ARCH: amd64 | ||||
|     ESPHOMELIB_VERSION: "${CI_COMMIT_TAG}" | ||||
|  | ||||
| # Deploy jobs | ||||
| deploy:armhf: | ||||
|   <<: *deploy | ||||
| deploy-release:armhf: | ||||
|   <<: *deploy-release | ||||
|   variables: | ||||
|     ADDON_ARCH: armhf | ||||
|   only: | ||||
|     - /^v\d+\.\d+\.\d+(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?$/ | ||||
|   except: | ||||
|     - /^(?!master).+@/ | ||||
|  | ||||
| #deploy:aarch64: | ||||
| #  <<: *deploy | ||||
| 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 | ||||
| #  only: | ||||
| #    - /^v\d+\.\d+\.\d+(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?$/ | ||||
| #  except: | ||||
| #    - /^(?!master).+@/ | ||||
|  | ||||
| deploy:i386: | ||||
|   <<: *deploy | ||||
| deploy-release:i386: | ||||
|   <<: *deploy-release | ||||
|   variables: | ||||
|     ADDON_ARCH: i386 | ||||
|   only: | ||||
|     - /^v\d+\.\d+\.\d+(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?$/ | ||||
|   except: | ||||
|     - /^(?!master).+@/ | ||||
|  | ||||
| deploy:amd64: | ||||
|   <<: *deploy | ||||
| deploy-beta:i386: | ||||
|   <<: *deploy-beta | ||||
|   variables: | ||||
|     ADDON_ARCH: i386 | ||||
|  | ||||
| deploy-release:amd64: | ||||
|   <<: *deploy-release | ||||
|   variables: | ||||
|     ADDON_ARCH: amd64 | ||||
|   only: | ||||
|     - /^v\d+\.\d+\.\d+(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?$/ | ||||
|   except: | ||||
|     - /^(?!master).+@/ | ||||
|  | ||||
| deploy:pypi: | ||||
| deploy-beta:amd64: | ||||
|   <<: *deploy-beta | ||||
|   variables: | ||||
|     ADDON_ARCH: amd64 | ||||
|  | ||||
| .deploy-pypi: &deploy-pypi | ||||
|   stage: deploy | ||||
|   before_script: | ||||
|   - pip install -e . | ||||
| @@ -181,7 +304,17 @@ deploy:pypi: | ||||
|   tags: | ||||
|   - python2.7 | ||||
|   - esphomeyaml-test | ||||
|  | ||||
| deploy-release:pypi: | ||||
|   <<: *deploy-pypi | ||||
|   only: | ||||
|     - /^v\d+\.\d+\.\d+(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?$/ | ||||
|     - /^v\d+\.\d+\.\d+$/ | ||||
|   except: | ||||
|     - /^(?!master).+@/ | ||||
|  | ||||
| deploy-beta:pypi: | ||||
|   <<: *deploy-pypi | ||||
|   only: | ||||
|     - /^v\d+\.\d+\.\d+b\d+$/ | ||||
|   except: | ||||
|     - /^(?!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> | ||||
|  | ||||
| RUN apt-get update && apt-get install -y \ | ||||
|         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 | ||||
| EXPOSE 6123 | ||||
| VOLUME /config | ||||
| WORKDIR /usr/src/app | ||||
|  | ||||
| RUN pip install --no-cache-dir --no-binary :all: platformio && \ | ||||
|     platformio settings set enable_telemetry No | ||||
|  | ||||
| COPY docker/platformio.ini /usr/src/app/ | ||||
| RUN platformio settings set enable_telemetry No && \ | ||||
|     platformio run -e espressif32 -e espressif8266; exit 0 | ||||
| COPY docker/platformio.ini /pio/platformio.ini | ||||
| RUN platformio run -d /pio; rm -rf /pio | ||||
|  | ||||
| COPY . . | ||||
| RUN pip install --no-cache-dir -e . && \ | ||||
|     pip install --no-cache-dir tzlocal pillow | ||||
| RUN pip install --no-cache-dir --no-binary :all: -e . && \ | ||||
|     pip install --no-cache-dir --no-binary :all: tzlocal | ||||
|  | ||||
| WORKDIR /config | ||||
| 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 \ | ||||
|     && rm -rf /var/lib/apt/lists/* | ||||
|  | ||||
| COPY docker/hassio-builder.sh /usr/bin/ | ||||
|  | ||||
| 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", | ||||
|   "slug": "esphomeyaml-beta", | ||||
|   "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", | ||||
|   "webui": "http://[HOST]:[PORT:6052]", | ||||
|   "boot": "auto", | ||||
|   | ||||
| @@ -1,59 +1,24 @@ | ||||
| # Dockerfile for HassIO add-on | ||||
| ARG BUILD_FROM=ubuntu:bionic | ||||
| # Dockerfile for HassIO edge add-on | ||||
| ARG BUILD_FROM=homeassistant/amd64-base-ubuntu:latest | ||||
| FROM ${BUILD_FROM} | ||||
|  | ||||
| # Re-declare BUILD_FROM to fix weird docker issue | ||||
| ARG BUILD_FROM | ||||
|  | ||||
| # 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 \ | ||||
| RUN apt-get update && apt-get install -y --no-install-recommends \ | ||||
|         python \ | ||||
|         python-pip \ | ||||
|         python-setuptools \ | ||||
|         python-pil \ | ||||
|         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 | ||||
|     && 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 | ||||
|  | ||||
|  | ||||
| # 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 | ||||
| RUN /bin/bash -c "if [[ '$BUILD_FROM' = *\"ubuntu\"* ]]; then \ | ||||
|       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" | ||||
| RUN platformio run -d /pio; rm -rf /pio | ||||
|  | ||||
| # Install latest esphomeyaml from git | ||||
| RUN pip install --no-cache-dir \ | ||||
|       git+git://github.com/OttoWinter/esphomeyaml.git && \ | ||||
| RUN pip install --no-cache-dir git+https://github.com/OttoWinter/esphomeyaml.git@dev#egg=esphomeyaml && \ | ||||
|     pip install --no-cache-dir pillow tzlocal | ||||
|  | ||||
| CMD ["esphomeyaml", "/config/esphomeyaml", "dashboard"] | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| { | ||||
|     "squash": false, | ||||
|     "build_from": { | ||||
|         "aarch64": "arm64v8/ubuntu:bionic", | ||||
|         "amd64": "ubuntu:bionic", | ||||
|         "armhf": "homeassistant/armhf-base:latest", | ||||
|         "i386": "i386/ubuntu:bionic" | ||||
|         "aarch64": "homeassistant/aarch64-base-ubuntu:latest", | ||||
|         "amd64": "homeassistant/amd64-base-ubuntu:latest", | ||||
|         "armhf": "homeassistant/armhf-base-ubuntu:latest", | ||||
|         "i386": "homeassistant/i386-base-ubuntu:latest" | ||||
|     }, | ||||
|     "args": {} | ||||
| } | ||||
|   | ||||
| @@ -1,22 +1,22 @@ | ||||
| from __future__ import print_function | ||||
|  | ||||
| import argparse | ||||
| from collections import OrderedDict | ||||
| import logging | ||||
| import os | ||||
| import random | ||||
| import sys | ||||
| 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.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_WIFI, ESP_PLATFORM_ESP8266 | ||||
| from esphomeyaml.core import ESPHomeYAMLError | ||||
| from esphomeyaml.helpers import AssignmentExpression, Expression, RawStatement, \ | ||||
|     _EXPRESSIONS, add, \ | ||||
|     add_job, color, flush_tasks, indent, quote, statement, relative_path | ||||
| from esphomeyaml.util import safe_print | ||||
|     _EXPRESSIONS, add, add_job, color, flush_tasks, indent, statement, relative_path | ||||
| from esphomeyaml.util import safe_print, run_external_command | ||||
|  | ||||
| _LOGGER = logging.getLogger(__name__) | ||||
|  | ||||
| @@ -62,34 +62,6 @@ def choose_serial_port(config): | ||||
|     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): | ||||
|     import serial | ||||
|     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("Starting log output from %s with baud rate %s", port, baud_rate) | ||||
|  | ||||
|     backtrace_state = False | ||||
|     with serial.Serial(port, baudrate=baud_rate) as ser: | ||||
|         while True: | ||||
|             try: | ||||
| @@ -114,6 +87,9 @@ def run_miniterm(config, port, escape=False): | ||||
|                 message = message.replace('\033', '\\033') | ||||
|             safe_print(message) | ||||
|  | ||||
|             backtrace_state = platformio_api.process_stacktrace( | ||||
|                 config, line, backtrace_state=backtrace_state) | ||||
|  | ||||
|  | ||||
| def write_cpp(config): | ||||
|     _LOGGER.info("Generating C++ source...") | ||||
| @@ -154,11 +130,7 @@ def write_cpp(config): | ||||
|  | ||||
| def compile_program(args, config): | ||||
|     _LOGGER.info("Compiling app...") | ||||
|     build_path = relative_path(config[CONF_ESPHOMEYAML][CONF_BUILD_PATH]) | ||||
|     command = ['platformio', 'run', '-d', build_path] | ||||
|     if args.verbose: | ||||
|         command.append('-v') | ||||
|     return run_platformio(*command) | ||||
|     return platformio_api.run_compile(config, args.verbose) | ||||
|  | ||||
|  | ||||
| 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]) | ||||
|     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 | ||||
|     return run_platformio('esptool.py', '--before', 'default_reset', '--after', 'hard_reset', | ||||
|                           '--chip', 'esp8266', '--port', port, 'write_flash', '0x0', | ||||
|                           path, main=esptool._main) | ||||
|     return run_external_command(esptool._main, *cmd) | ||||
|  | ||||
|  | ||||
| def upload_program(config, args, port): | ||||
| @@ -190,11 +162,7 @@ def upload_program(config, args, port): | ||||
|     if port != 'OTA' and serial_port: | ||||
|         if core.ESP_PLATFORM == ESP_PLATFORM_ESP8266 and args.use_esptoolpy: | ||||
|             return upload_using_esptool(config, port) | ||||
|         command = ['platformio', 'run', '-d', build_path, | ||||
|                    '-t', 'upload', '--upload-port', port] | ||||
|         if args.verbose: | ||||
|             command.append('-v') | ||||
|         return run_platformio(*command) | ||||
|         return platformio_api.run_upload(config, args.verbose, port) | ||||
|  | ||||
|     if 'ota' not in config: | ||||
|         _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): | ||||
|     log_level = logging.DEBUG if debug else logging.INFO | ||||
|     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) | ||||
|     datefmt = '%H:%M:%S' | ||||
|  | ||||
| @@ -367,6 +335,28 @@ def command_clean(args, config): | ||||
|     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): | ||||
|     from esphomeyaml.dashboard import dashboard | ||||
|  | ||||
| @@ -388,6 +378,7 @@ POST_CONFIG_ACTIONS = { | ||||
|     'clean-mqtt': command_clean_mqtt, | ||||
|     'mqtt-fingerprint': command_mqtt_fingerprint, | ||||
|     '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.", | ||||
|                            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:]) | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| import copy | ||||
|  | ||||
| import voluptuous as vol | ||||
|  | ||||
| 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 | ||||
| from esphomeyaml.core import ESPHomeYAMLError | ||||
| 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 | ||||
|  | ||||
|  | ||||
| @@ -28,8 +31,9 @@ def validate_recursive_condition(value): | ||||
|  | ||||
|  | ||||
| def validate_recursive_action(value): | ||||
|     value = cv.ensure_list(value) | ||||
|     value = cv.ensure_list(value)[:] | ||||
|     for i, item in enumerate(value): | ||||
|         item = copy.deepcopy(item) | ||||
|         if not isinstance(item, dict): | ||||
|             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) | ||||
| @@ -41,11 +45,12 @@ def validate_recursive_action(value): | ||||
|         item.setdefault(CONF_ACTION_ID, None) | ||||
|         key2 = next((x for x in item if x != CONF_ACTION_ID and x != key), 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)) | ||||
|         validator = ACTION_REGISTRY[key][0] | ||||
|         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]) | ||||
|         } | ||||
|     return value | ||||
| @@ -54,14 +59,20 @@ def validate_recursive_action(value): | ||||
| ACTION_REGISTRY = ServiceRegistry() | ||||
|  | ||||
| # pylint: disable=invalid-name | ||||
| DelayAction = esphomelib_ns.DelayAction | ||||
| LambdaAction = esphomelib_ns.LambdaAction | ||||
| IfAction = esphomelib_ns.IfAction | ||||
| UpdateComponentAction = esphomelib_ns.UpdateComponentAction | ||||
| Automation = esphomelib_ns.Automation | ||||
| DelayAction = esphomelib_ns.class_('DelayAction', Action, Component) | ||||
| LambdaAction = esphomelib_ns.class_('LambdaAction', Action) | ||||
| IfAction = esphomelib_ns.class_('IfAction', Action) | ||||
| UpdateComponentAction = esphomelib_ns.class_('UpdateComponentAction', Action) | ||||
| 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({ | ||||
|     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_OR): validate_recursive_condition, | ||||
|     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_, | ||||
| })]) | ||||
|  | ||||
| # 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): | ||||
|     schema = AUTOMATION_SCHEMA.extend(extra_schema or {}) | ||||
| @@ -91,6 +96,8 @@ def validate_automation(extra_schema=None, extra_validators=None, single=False): | ||||
|                 try: | ||||
|                     return vol.Schema([schema])(value) | ||||
|                 except vol.Invalid as err2: | ||||
|                     if 'Unable to find action' in str(err): | ||||
|                         raise err2 | ||||
|                     raise vol.MultipleInvalid([err, err2]) | ||||
|         elif isinstance(value, dict): | ||||
|             if CONF_THEN in value: | ||||
| @@ -113,8 +120,8 @@ def validate_automation(extra_schema=None, extra_validators=None, single=False): | ||||
|  | ||||
|  | ||||
| AUTOMATION_SCHEMA = vol.Schema({ | ||||
|     cv.GenerateID(CONF_TRIGGER_ID): cv.declare_variable_id(None), | ||||
|     cv.GenerateID(CONF_AUTOMATION_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(Automation), | ||||
|     vol.Optional(CONF_IF): CONDITIONS_SCHEMA, | ||||
|     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' | ||||
| 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 | ||||
|  | ||||
| from esphomeyaml.components import sensor, i2c | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.components import sensor | ||||
| from esphomeyaml.const import CONF_ADDRESS, CONF_ID, CONF_RATE | ||||
| from esphomeyaml.helpers import App, Pvariable | ||||
| from esphomeyaml.const import CONF_ADDRESS, CONF_ID | ||||
| from esphomeyaml.helpers import App, Pvariable, setup_component, Component | ||||
|  | ||||
| DEPENDENCIES = ['i2c'] | ||||
|  | ||||
| ADS1115Component = sensor.sensor_ns.ADS1115Component | ||||
|  | ||||
| RATE_REMOVE_MESSAGE = """The rate option has been removed in 1.5.0 and is no longer required.""" | ||||
| ADS1115Component = sensor.sensor_ns.class_('ADS1115Component', Component, i2c.I2CDevice) | ||||
|  | ||||
| ADS1115_SCHEMA = vol.Schema({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(ADS1115Component), | ||||
|     vol.Required(CONF_ADDRESS): cv.i2c_address, | ||||
|  | ||||
|     vol.Optional(CONF_RATE): cv.invalid(RATE_REMOVE_MESSAGE) | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.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): | ||||
|     for conf in config: | ||||
|         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' | ||||
|   | ||||
| @@ -1,13 +1,16 @@ | ||||
| import voluptuous as vol | ||||
|  | ||||
| from esphomeyaml import automation, core | ||||
| from esphomeyaml.components import mqtt | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml import automation | ||||
| from esphomeyaml.const import CONF_DEVICE_CLASS, CONF_ID, CONF_INTERNAL, CONF_INVERTED, \ | ||||
|     CONF_MAX_LENGTH, CONF_MIN_LENGTH, CONF_MQTT_ID, CONF_ON_CLICK, CONF_ON_DOUBLE_CLICK, \ | ||||
|     CONF_ON_PRESS, CONF_ON_RELEASE, CONF_TRIGGER_ID, CONF_FILTERS, CONF_INVERT, CONF_DELAYED_ON, \ | ||||
|     CONF_DELAYED_OFF, CONF_LAMBDA, CONF_HEARTBEAT | ||||
| from esphomeyaml.helpers import App, NoArg, Pvariable, add, add_job, esphomelib_ns, \ | ||||
|     setup_mqtt_component, bool_, process_lambda, ArrayInitializer | ||||
| from esphomeyaml.const import CONF_DELAYED_OFF, CONF_DELAYED_ON, CONF_DEVICE_CLASS, CONF_FILTERS, \ | ||||
|     CONF_HEARTBEAT, CONF_ID, CONF_INTERNAL, CONF_INVALID_COOLDOWN, CONF_INVERT, CONF_INVERTED, \ | ||||
|     CONF_LAMBDA, CONF_MAX_LENGTH, CONF_MIN_LENGTH, CONF_MQTT_ID, CONF_ON_CLICK, \ | ||||
|     CONF_ON_DOUBLE_CLICK, CONF_ON_MULTI_CLICK, CONF_ON_PRESS, CONF_ON_RELEASE, CONF_STATE, \ | ||||
|     CONF_TIMING, CONF_TRIGGER_ID | ||||
| from esphomeyaml.helpers import App, ArrayInitializer, NoArg, Pvariable, StructInitializer, add, \ | ||||
|     add_job, bool_, esphomelib_ns, process_lambda, setup_mqtt_component, Nameable, Trigger, \ | ||||
|     Component | ||||
|  | ||||
| DEVICE_CLASSES = [ | ||||
|     '', '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') | ||||
| PressTrigger = binary_sensor_ns.PressTrigger | ||||
| ReleaseTrigger = binary_sensor_ns.ReleaseTrigger | ||||
| ClickTrigger = binary_sensor_ns.ClickTrigger | ||||
| DoubleClickTrigger = binary_sensor_ns.DoubleClickTrigger | ||||
| BinarySensor = binary_sensor_ns.BinarySensor | ||||
| InvertFilter = binary_sensor_ns.InvertFilter | ||||
| LambdaFilter = binary_sensor_ns.LambdaFilter | ||||
| DelayedOnFilter = binary_sensor_ns.DelayedOnFilter | ||||
| DelayedOffFilter = binary_sensor_ns.DelayedOffFilter | ||||
| HeartbeatFilter = binary_sensor_ns.HeartbeatFilter | ||||
| MQTTBinarySensorComponent = binary_sensor_ns.MQTTBinarySensorComponent | ||||
| BinarySensor = binary_sensor_ns.class_('BinarySensor', Nameable) | ||||
| MQTTBinarySensorComponent = binary_sensor_ns.class_('MQTTBinarySensorComponent', mqtt.MQTTComponent) | ||||
|  | ||||
| # Triggers | ||||
| PressTrigger = binary_sensor_ns.class_('PressTrigger', Trigger.template(NoArg)) | ||||
| ReleaseTrigger = binary_sensor_ns.class_('ReleaseTrigger', Trigger.template(NoArg)) | ||||
| ClickTrigger = binary_sensor_ns.class_('ClickTrigger', Trigger.template(NoArg)) | ||||
| DoubleClickTrigger = binary_sensor_ns.class_('DoubleClickTrigger', Trigger.template(NoArg)) | ||||
| MultiClickTrigger = binary_sensor_ns.class_('MultiClickTrigger', Trigger.template(NoArg), Component) | ||||
| MultiClickTriggerEvent = binary_sensor_ns.struct('MultiClickTriggerEvent') | ||||
|  | ||||
| # 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] | ||||
|  | ||||
| @@ -43,9 +54,101 @@ FILTERS_SCHEMA = vol.All(cv.ensure_list, [vol.All({ | ||||
|     vol.Optional(CONF_LAMBDA): cv.lambda_, | ||||
| }, 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({ | ||||
|     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_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_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( | ||||
|         "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) | ||||
|         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) | ||||
|  | ||||
|  | ||||
| @@ -154,4 +279,14 @@ def register_binary_sensor(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' | ||||
|   | ||||
| @@ -1,15 +1,17 @@ | ||||
| import voluptuous as vol | ||||
|  | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.components import binary_sensor | ||||
| from esphomeyaml.components.esp32_ble_tracker import CONF_ESP32_BLE_ID, ESP32BLETracker, \ | ||||
|     make_address_array | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.const import CONF_MAC_ADDRESS, CONF_NAME | ||||
| from esphomeyaml.helpers import get_variable | ||||
| from esphomeyaml.helpers import esphomelib_ns, get_variable | ||||
|  | ||||
| DEPENDENCIES = ['esp32_ble_tracker'] | ||||
| ESP32BLEPresenceDevice = esphomelib_ns.class_('ESP32BLEPresenceDevice', binary_sensor.BinarySensor) | ||||
|  | ||||
| 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, | ||||
|     cv.GenerateID(CONF_ESP32_BLE_ID): cv.use_variable_id(ESP32BLETracker) | ||||
| })) | ||||
| @@ -21,3 +23,7 @@ def to_code(config): | ||||
|         yield | ||||
|     rhs = hub.make_presence_sensor(config[CONF_NAME], make_address_array(config[CONF_MAC_ADDRESS])) | ||||
|     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 | ||||
|  | ||||
|  | ||||
| ESP32TouchBinarySensor = binary_sensor.binary_sensor_ns.class_('ESP32TouchBinarySensor', | ||||
|                                                                binary_sensor.BinarySensor) | ||||
|  | ||||
| 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_THRESHOLD): cv.uint16_t, | ||||
|     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' | ||||
|  | ||||
|  | ||||
| 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.components import binary_sensor | ||||
| 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({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(GPIOBinarySensorComponent), | ||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeGPIOBinarySensor), | ||||
|     vol.Required(CONF_PIN): pins.gpio_input_pin_schema | ||||
| })) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema)) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
| @@ -21,6 +26,11 @@ def to_code(config): | ||||
|     rhs = App.make_gpio_binary_sensor(config[CONF_NAME], pin) | ||||
|     gpio = variable(config[CONF_MAKE_ID], rhs) | ||||
|     binary_sensor.setup_binary_sensor(gpio.Pgpio, gpio.Pmqtt, config) | ||||
|     setup_component(gpio.Pgpio, config) | ||||
|  | ||||
|  | ||||
| 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 esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.components import binary_sensor | ||||
| from esphomeyaml.components import binary_sensor, display | ||||
| from esphomeyaml.components.display.nextion import Nextion | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.const import CONF_COMPONENT_ID, CONF_NAME, CONF_PAGE_ID | ||||
| from esphomeyaml.helpers import get_variable | ||||
|  | ||||
| @@ -10,7 +10,11 @@ DEPENDENCIES = ['display'] | ||||
|  | ||||
| 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({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(NextionTouchComponent), | ||||
|     vol.Required(CONF_PAGE_ID): cv.uint8_t, | ||||
|     vol.Required(CONF_COMPONENT_ID): cv.uint8_t, | ||||
|     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], | ||||
|                                    config[CONF_COMPONENT_ID]) | ||||
|     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 | ||||
|  | ||||
|  | ||||
| PN532BinarySensor = binary_sensor.binary_sensor_ns.class_('PN532BinarySensor', | ||||
|                                                           binary_sensor.BinarySensor) | ||||
|  | ||||
| PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(PN532BinarySensor), | ||||
|     vol.Required(CONF_UID): validate_uid, | ||||
|     cv.GenerateID(CONF_PN532_ID): cv.use_variable_id(PN532Component) | ||||
| })) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     hub = None | ||||
|     for hub in get_variable(config[CONF_PN532_ID]): | ||||
|         yield | ||||
|     addr = [HexInt(int(x, 16)) for x in config[CONF_UID].split('-')] | ||||
|     rhs = hub.make_tag(config[CONF_NAME], ArrayInitializer(*addr, multiline=False)) | ||||
|     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' | ||||
|  | ||||
| RDM6300BinarySensor = binary_sensor.binary_sensor_ns.class_('RDM6300BinarySensor', | ||||
|                                                             binary_sensor.BinarySensor) | ||||
|  | ||||
| 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, | ||||
|     cv.GenerateID(CONF_RDM6300_ID): cv.use_variable_id(rdm6300.RDM6300Component) | ||||
| })) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     hub = None | ||||
|     for hub in get_variable(config[CONF_RDM6300_ID]): | ||||
|         yield | ||||
|     rhs = hub.make_card(config[CONF_NAME], config[CONF_UID]) | ||||
|     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_RECEIVER_ID = 'receiver_id' | ||||
|  | ||||
| RemoteReceiver = remote_ns.RemoteReceiver | ||||
| LGReceiver = remote_ns.LGReceiver | ||||
| NECReceiver = remote_ns.NECReceiver | ||||
| PanasonicReceiver = remote_ns.PanasonicReceiver | ||||
| RawReceiver = remote_ns.RawReceiver | ||||
| SamsungReceiver = remote_ns.SamsungReceiver | ||||
| SonyReceiver = remote_ns.SonyReceiver | ||||
| RCSwitchRawReceiver = remote_ns.RCSwitchRawReceiver | ||||
| RCSwitchTypeAReceiver = remote_ns.RCSwitchTypeAReceiver | ||||
| RCSwitchTypeBReceiver = remote_ns.RCSwitchTypeBReceiver | ||||
| RCSwitchTypeCReceiver = remote_ns.RCSwitchTypeCReceiver | ||||
| RCSwitchTypeDReceiver = remote_ns.RCSwitchTypeDReceiver | ||||
| RemoteReceiver = remote_ns.class_('RemoteReceiver', binary_sensor.BinarySensor) | ||||
| LGReceiver = remote_ns.class_('LGReceiver', RemoteReceiver) | ||||
| NECReceiver = remote_ns.class_('NECReceiver', RemoteReceiver) | ||||
| PanasonicReceiver = remote_ns.class_('PanasonicReceiver', RemoteReceiver) | ||||
| RawReceiver = remote_ns.class_('RawReceiver', RemoteReceiver) | ||||
| SamsungReceiver = remote_ns.class_('SamsungReceiver', RemoteReceiver) | ||||
| SonyReceiver = remote_ns.class_('SonyReceiver', RemoteReceiver) | ||||
| RCSwitchRawReceiver = remote_ns.class_('RCSwitchRawReceiver', RemoteReceiver) | ||||
| RCSwitchTypeAReceiver = remote_ns.class_('RCSwitchTypeAReceiver', RCSwitchRawReceiver) | ||||
| RCSwitchTypeBReceiver = remote_ns.class_('RCSwitchTypeBReceiver', RCSwitchRawReceiver) | ||||
| RCSwitchTypeCReceiver = remote_ns.class_('RCSwitchTypeCReceiver', RCSwitchRawReceiver) | ||||
| RCSwitchTypeDReceiver = remote_ns.class_('RCSwitchTypeDReceiver', RCSwitchRawReceiver) | ||||
|  | ||||
| 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.Required(CONF_DATA): cv.hex_uint32_t, | ||||
|         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): | ||||
|     remote = None | ||||
|     for remote in get_variable(config[CONF_REMOTE_RECEIVER_ID]): | ||||
|         yield | ||||
|     rhs = receiver_base(config) | ||||
| @@ -119,3 +119,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| 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 | ||||
| from esphomeyaml.components import binary_sensor | ||||
| 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'] | ||||
|  | ||||
| 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({ | ||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeStatusBinarySensor), | ||||
| })) | ||||
|     cv.GenerateID(): cv.declare_variable_id(StatusBinarySensor), | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema)) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     rhs = App.make_status_binary_sensor(config[CONF_NAME]) | ||||
|     status = variable(config[CONF_MAKE_ID], rhs) | ||||
|     binary_sensor.setup_binary_sensor(status.Pstatus, status.Pmqtt, config) | ||||
|     setup_component(status.Pstatus, config) | ||||
|  | ||||
|  | ||||
| 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 esphomeyaml.config_validation as cv | ||||
| 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.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({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(TemplateBinarySensor), | ||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeTemplateBinarySensor), | ||||
|     vol.Required(CONF_LAMBDA): cv.lambda_, | ||||
| })) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema)) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     rhs = App.make_template_binary_sensor(config[CONF_NAME]) | ||||
|     make = variable(config[CONF_MAKE_ID], rhs) | ||||
|     binary_sensor.setup_binary_sensor(make.Ptemplate_, make.Pmqtt, config) | ||||
|     setup_component(make.Ptemplate_, config) | ||||
|  | ||||
|     template_ = None | ||||
|     for template_ in process_lambda(config[CONF_LAMBDA], [], | ||||
| @@ -26,3 +32,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| 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 | ||||
|  | ||||
| from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY | ||||
| from esphomeyaml.components import mqtt | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.const import CONF_ID, CONF_MQTT_ID, CONF_INTERNAL | ||||
| 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({ | ||||
|  | ||||
| }) | ||||
|  | ||||
| cover_ns = esphomelib_ns.namespace('cover') | ||||
| Cover = cover_ns.Cover | ||||
| MQTTCoverComponent = cover_ns.MQTTCoverComponent | ||||
| CoverState = cover_ns.CoverState | ||||
|  | ||||
| Cover = cover_ns.class_('Cover', Nameable) | ||||
| MQTTCoverComponent = cover_ns.class_('MQTTCoverComponent', mqtt.MQTTComponent) | ||||
|  | ||||
| CoverState = cover_ns.class_('CoverState') | ||||
| COVER_OPEN = cover_ns.COVER_OPEN | ||||
| COVER_CLOSED = cover_ns.COVER_CLOSED | ||||
| OpenAction = cover_ns.OpenAction | ||||
| CloseAction = cover_ns.CloseAction | ||||
| StopAction = cover_ns.StopAction | ||||
|  | ||||
| # Actions | ||||
| 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({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(Cover), | ||||
| @@ -44,7 +49,7 @@ BUILD_FLAGS = '-DUSE_COVER' | ||||
|  | ||||
| CONF_COVER_OPEN = 'cover.open' | ||||
| 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' | ||||
| 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' | ||||
| 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) | ||||
|     type = StopAction.template(arg_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.const import CONF_CLOSE_ACTION, CONF_LAMBDA, CONF_MAKE_ID, CONF_NAME, \ | ||||
|     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({ | ||||
|     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_OPTIMISTIC): cv.boolean, | ||||
|     vol.Optional(CONF_OPEN_ACTION): automation.validate_automation(single=True), | ||||
|     vol.Optional(CONF_CLOSE_ACTION): automation.validate_automation(single=True), | ||||
|     vol.Optional(CONF_STOP_ACTION): automation.validate_automation(single=True), | ||||
| }), 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): | ||||
| @@ -24,9 +27,9 @@ def to_code(config): | ||||
|     make = variable(config[CONF_MAKE_ID], rhs) | ||||
|  | ||||
|     cover.setup_cover(make.Ptemplate_, make.Pmqtt, config) | ||||
|     setup_component(make.Ptemplate_, config) | ||||
|  | ||||
|     if CONF_LAMBDA in config: | ||||
|         template_ = None | ||||
|         for template_ in process_lambda(config[CONF_LAMBDA], [], | ||||
|                                         return_type=optional.template(cover.CoverState)): | ||||
|             yield | ||||
| @@ -45,3 +48,12 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| 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.components import sensor | ||||
| 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({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(DallasComponent), | ||||
|     vol.Required(CONF_PIN): pins.input_output_pin, | ||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, | ||||
| })]) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema)]) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     for conf in config: | ||||
|         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' | ||||
|   | ||||
| @@ -1,11 +1,12 @@ | ||||
| import voluptuous as vol | ||||
|  | ||||
| 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, \ | ||||
|     CONF_SLEEP_DURATION, CONF_WAKEUP_PIN | ||||
| from esphomeyaml.helpers import App, Pvariable, add, gpio_input_pin_expression, esphomelib_ns, \ | ||||
|     TemplateArguments, get_variable | ||||
|     CONF_SLEEP_DURATION, CONF_WAKEUP_PIN, CONF_MODE, CONF_PINS | ||||
| from esphomeyaml.helpers import Action, App, Component, Pvariable, TemplateArguments, add, \ | ||||
|     esphomelib_ns, get_variable, gpio_input_pin_expression, setup_component, global_ns, \ | ||||
|     StructInitializer | ||||
|  | ||||
|  | ||||
| def validate_pin_number(value): | ||||
| @@ -16,17 +17,26 @@ def validate_pin_number(value): | ||||
|     return value | ||||
|  | ||||
|  | ||||
| DeepSleepComponent = esphomelib_ns.DeepSleepComponent | ||||
| EnterDeepSleepAction = esphomelib_ns.EnterDeepSleepAction | ||||
| PreventDeepSleepAction = esphomelib_ns.PreventDeepSleepAction | ||||
| DeepSleepComponent = esphomelib_ns.class_('DeepSleepComponent', Component) | ||||
| EnterDeepSleepAction = esphomelib_ns.class_('EnterDeepSleepAction', Action) | ||||
| PreventDeepSleepAction = esphomelib_ns.class_('PreventDeepSleepAction', Action) | ||||
|  | ||||
| WakeupPinMode = esphomelib_ns.enum('WakeupPinMode') | ||||
| WAKEUP_PIN_MODES = { | ||||
|     'IGNORE': esphomelib_ns.WAKEUP_PIN_MODE_IGNORE, | ||||
|     'KEEP_AWAKE': esphomelib_ns.WAKEUP_PIN_MODE_KEEP_AWAKE, | ||||
|     'INVERT_WAKEUP': esphomelib_ns.WAKEUP_PIN_MODE_INVERT_WAKEUP, | ||||
|     'IGNORE': WakeupPinMode.WAKEUP_PIN_MODE_IGNORE, | ||||
|     'KEEP_AWAKE': WakeupPinMode.WAKEUP_PIN_MODE_KEEP_AWAKE, | ||||
|     '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_ESP32_EXT1_WAKEUP = 'esp32_ext1_wakeup' | ||||
|  | ||||
| CONFIG_SCHEMA = vol.Schema({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(DeepSleepComponent), | ||||
| @@ -35,9 +45,14 @@ CONFIG_SCHEMA = vol.Schema({ | ||||
|                                            validate_pin_number), | ||||
|     vol.Optional(CONF_WAKEUP_PIN_MODE): vol.All(cv.only_on_esp32, vol.Upper, | ||||
|                                                 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_DURATION): cv.positive_time_period_milliseconds, | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
| @@ -46,7 +61,6 @@ def to_code(config): | ||||
|     if CONF_SLEEP_DURATION in config: | ||||
|         add(deep_sleep.set_sleep_duration(config[CONF_SLEEP_DURATION])) | ||||
|     if CONF_WAKEUP_PIN in config: | ||||
|         pin = None | ||||
|         for pin in gpio_input_pin_expression(config[CONF_WAKEUP_PIN]): | ||||
|             yield | ||||
|         add(deep_sleep.set_wakeup_pin(pin)) | ||||
| @@ -57,10 +71,23 @@ def to_code(config): | ||||
|     if CONF_RUN_DURATION in config: | ||||
|         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' | ||||
|  | ||||
|  | ||||
| CONF_DEEP_SLEEP_ENTER = 'deep_sleep.enter' | ||||
| DEEP_SLEEP_ENTER_ACTION_SCHEMA = maybe_simple_id({ | ||||
|     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') | ||||
| DisplayBuffer = display_ns.DisplayBuffer | ||||
| DisplayBuffer = display_ns.class_('DisplayBuffer') | ||||
| DisplayBufferRef = DisplayBuffer.operator('ref') | ||||
|  | ||||
| DISPLAY_ROTATIONS = { | ||||
|   | ||||
| @@ -5,11 +5,12 @@ from esphomeyaml import pins | ||||
| from esphomeyaml.components import display | ||||
| from esphomeyaml.const import CONF_DATA_PINS, CONF_DIMENSIONS, CONF_ENABLE_PIN, CONF_ID, \ | ||||
|     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.LCDDisplay | ||||
| LCDDisplay = display.display_ns.class_('LCDDisplay', PollingComponent) | ||||
| LCDDisplayRef = LCDDisplay.operator('ref') | ||||
| GPIOLCDDisplay = display.display_ns.class_('GPIOLCDDisplay', LCDDisplay) | ||||
|  | ||||
|  | ||||
| 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_RS_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): | ||||
| @@ -67,6 +68,7 @@ def to_code(config): | ||||
|         add(lcd.set_writer(lambda_)) | ||||
|  | ||||
|     display.setup_display(lcd, config) | ||||
|     setup_component(lcd, config) | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_LCD_DISPLAY' | ||||
|   | ||||
| @@ -1,20 +1,21 @@ | ||||
| import voluptuous as vol | ||||
|  | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.components import display | ||||
| from esphomeyaml.components.display.lcd_gpio import LCDDisplayRef, validate_lcd_dimensions | ||||
| from esphomeyaml.components import display, i2c | ||||
| 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.helpers import App, Pvariable, add, process_lambda | ||||
| from esphomeyaml.helpers import App, Pvariable, add, process_lambda, setup_component | ||||
|  | ||||
| DEPENDENCIES = ['i2c'] | ||||
|  | ||||
| PCF8574LCDDisplay = display.display_ns.PCF8574LCDDisplay | ||||
| PCF8574LCDDisplay = display.display_ns.class_('PCF8574LCDDisplay', LCDDisplay, i2c.I2CDevice) | ||||
|  | ||||
| PLATFORM_SCHEMA = display.BASIC_DISPLAY_PLATFORM_SCHEMA.extend({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(PCF8574LCDDisplay), | ||||
|     vol.Required(CONF_DIMENSIONS): validate_lcd_dimensions, | ||||
|     vol.Optional(CONF_ADDRESS): cv.i2c_address, | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
| @@ -30,6 +31,7 @@ def to_code(config): | ||||
|         add(lcd.set_writer(lambda_)) | ||||
|  | ||||
|     display.setup_display(lcd, config) | ||||
|     setup_component(lcd, config) | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = ['-DUSE_LCD_DISPLAY', '-DUSE_LCD_DISPLAY_PCF8574'] | ||||
|   | ||||
| @@ -2,16 +2,16 @@ import voluptuous as vol | ||||
|  | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml import pins | ||||
| from esphomeyaml.components import display | ||||
| from esphomeyaml.components import display, spi | ||||
| from esphomeyaml.components.spi import SPIComponent | ||||
| from esphomeyaml.const import CONF_CS_PIN, CONF_ID, CONF_INTENSITY, CONF_LAMBDA, CONF_NUM_CHIPS, \ | ||||
|     CONF_SPI_ID | ||||
| from esphomeyaml.helpers import App, Pvariable, add, get_variable, gpio_output_pin_expression, \ | ||||
|     process_lambda | ||||
|     process_lambda, setup_component, PollingComponent | ||||
|  | ||||
| DEPENDENCIES = ['spi'] | ||||
|  | ||||
| MAX7219Component = display.display_ns.MAX7219Component | ||||
| MAX7219Component = display.display_ns.class_('MAX7219Component', PollingComponent, spi.SPIDevice) | ||||
| MAX7219ComponentRef = MAX7219Component.operator('ref') | ||||
|  | ||||
| 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_INTENSITY): vol.All(cv.uint8_t, vol.Range(min=0, max=15)), | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     for spi in get_variable(config[CONF_SPI_ID]): | ||||
|     for spi_ in get_variable(config[CONF_SPI_ID]): | ||||
|         yield | ||||
|     for cs in gpio_output_pin_expression(config[CONF_CS_PIN]): | ||||
|         yield | ||||
|     rhs = App.make_max7219(spi, cs) | ||||
|     rhs = App.make_max7219(spi_, cs) | ||||
|     max7219 = Pvariable(config[CONF_ID], rhs) | ||||
|  | ||||
|     if CONF_NUM_CHIPS in config: | ||||
| @@ -43,6 +43,7 @@ def to_code(config): | ||||
|         add(max7219.set_writer(lambda_)) | ||||
|  | ||||
|     display.setup_display(max7219, config) | ||||
|     setup_component(max7219, config) | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_MAX7219' | ||||
|   | ||||
| @@ -1,24 +1,26 @@ | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.components import display | ||||
| from esphomeyaml.components import display, uart | ||||
| from esphomeyaml.components.uart import UARTComponent | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.const import CONF_ID, CONF_LAMBDA, CONF_UART_ID | ||||
| from esphomeyaml.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'] | ||||
|  | ||||
| Nextion = display.display_ns.Nextion | ||||
| Nextion = display.display_ns.class_('Nextion', PollingComponent, uart.UARTDevice) | ||||
| NextionRef = Nextion.operator('ref') | ||||
|  | ||||
| PLATFORM_SCHEMA = display.BASIC_DISPLAY_PLATFORM_SCHEMA.extend({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(Nextion), | ||||
|     cv.GenerateID(CONF_UART_ID): cv.use_variable_id(UARTComponent), | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     for uart in get_variable(config[CONF_UART_ID]): | ||||
|     for uart_ in get_variable(config[CONF_UART_ID]): | ||||
|         yield | ||||
|     rhs = App.make_nextion(uart) | ||||
|     rhs = App.make_nextion(uart_) | ||||
|     nextion = Pvariable(config[CONF_ID], rhs) | ||||
|  | ||||
|     if CONF_LAMBDA in config: | ||||
| @@ -27,6 +29,7 @@ def to_code(config): | ||||
|         add(nextion.set_writer(lambda_)) | ||||
|  | ||||
|     display.setup_display(nextion, config) | ||||
|     setup_component(nextion, config) | ||||
|  | ||||
|  | ||||
| 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, \ | ||||
|     CONF_MODEL, CONF_RESET_PIN, CONF_LAMBDA | ||||
| from esphomeyaml.helpers import App, Pvariable, add, \ | ||||
|     gpio_output_pin_expression, process_lambda | ||||
|     gpio_output_pin_expression, process_lambda, setup_component | ||||
|  | ||||
| DEPENDENCIES = ['i2c'] | ||||
|  | ||||
| I2CSSD1306 = display.display_ns.I2CSSD1306 | ||||
| I2CSSD1306 = display.display_ns.class_('I2CSSD1306', ssd1306_spi.SSD1306) | ||||
|  | ||||
| PLATFORM_SCHEMA = display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({ | ||||
|     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_EXTERNAL_VCC): cv.boolean, | ||||
|     vol.Optional(CONF_ADDRESS): cv.i2c_address, | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
| @@ -41,6 +41,7 @@ def to_code(config): | ||||
|         add(ssd.set_writer(lambda_)) | ||||
|  | ||||
|     display.setup_display(ssd, config) | ||||
|     setup_component(ssd, config) | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_SSD1306' | ||||
|   | ||||
| @@ -2,27 +2,29 @@ import voluptuous as vol | ||||
|  | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml import pins | ||||
| from esphomeyaml.components import display | ||||
| from esphomeyaml.components import display, spi | ||||
| from esphomeyaml.components.spi import SPIComponent | ||||
| from esphomeyaml.const import CONF_CS_PIN, CONF_DC_PIN, CONF_EXTERNAL_VCC, \ | ||||
|     CONF_ID, CONF_MODEL, \ | ||||
|     CONF_RESET_PIN, CONF_SPI_ID, CONF_LAMBDA | ||||
| 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'] | ||||
|  | ||||
| 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 = { | ||||
|     'SSD1306_128X32': display.display_ns.SSD1306_MODEL_128_32, | ||||
|     'SSD1306_128X64': display.display_ns.SSD1306_MODEL_128_64, | ||||
|     'SSD1306_96X16': display.display_ns.SSD1306_MODEL_96_16, | ||||
|     'SSD1306_64X48': display.display_ns.SSD1306_MODEL_64_48, | ||||
|     'SH1106_128X32': display.display_ns.SH1106_MODEL_128_32, | ||||
|     'SH1106_128X64': display.display_ns.SH1106_MODEL_128_64, | ||||
|     'SH1106_96X16': display.display_ns.SH1106_MODEL_96_16, | ||||
|     'SH1106_64X48': display.display_ns.SH1106_MODEL_64_48, | ||||
|     'SSD1306_128X32': SSD1306Model.SSD1306_MODEL_128_32, | ||||
|     'SSD1306_128X64': SSD1306Model.SSD1306_MODEL_128_64, | ||||
|     'SSD1306_96X16': SSD1306Model.SSD1306_MODEL_96_16, | ||||
|     'SSD1306_64X48': SSD1306Model.SSD1306_MODEL_64_48, | ||||
|     'SH1106_128X32': SSD1306Model.SH1106_MODEL_128_32, | ||||
|     'SH1106_128X64': SSD1306Model.SH1106_MODEL_128_64, | ||||
|     'SH1106_96X16': SSD1306Model.SH1106_MODEL_96_16, | ||||
|     'SH1106_64X48': SSD1306Model.SH1106_MODEL_64_48, | ||||
| } | ||||
|  | ||||
| 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.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema, | ||||
|     vol.Optional(CONF_EXTERNAL_VCC): cv.boolean, | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     for spi in get_variable(config[CONF_SPI_ID]): | ||||
|     for spi_ in get_variable(config[CONF_SPI_ID]): | ||||
|         yield | ||||
|     for cs in gpio_output_pin_expression(config[CONF_CS_PIN]): | ||||
|         yield | ||||
|     for dc in gpio_output_pin_expression(config[CONF_DC_PIN]): | ||||
|         yield | ||||
|  | ||||
|     rhs = App.make_spi_ssd1306(spi, cs, dc) | ||||
|     rhs = App.make_spi_ssd1306(spi_, cs, dc) | ||||
|     ssd = Pvariable(config[CONF_ID], rhs) | ||||
|     add(ssd.set_model(MODELS[config[CONF_MODEL]])) | ||||
|  | ||||
| @@ -63,6 +65,7 @@ def to_code(config): | ||||
|         add(ssd.set_writer(lambda_)) | ||||
|  | ||||
|     display.setup_display(ssd, config) | ||||
|     setup_component(ssd, config) | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_SSD1306' | ||||
|   | ||||
| @@ -2,25 +2,30 @@ import voluptuous as vol | ||||
|  | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml import pins | ||||
| from esphomeyaml.components import display | ||||
| from esphomeyaml.components import display, spi | ||||
| from esphomeyaml.components.spi import SPIComponent | ||||
| from esphomeyaml.const import CONF_BUSY_PIN, CONF_CS_PIN, CONF_DC_PIN, CONF_FULL_UPDATE_EVERY, \ | ||||
|     CONF_ID, CONF_LAMBDA, CONF_MODEL, CONF_RESET_PIN, CONF_SPI_ID | ||||
| from esphomeyaml.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'] | ||||
|  | ||||
| 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 = { | ||||
|     '1.54in': ('a', display.display_ns.WAVESHARE_EPAPER_1_54_IN), | ||||
|     '2.13in': ('a', display.display_ns.WAVESHARE_EPAPER_2_13_IN), | ||||
|     '2.90in': ('a', display.display_ns.WAVESHARE_EPAPER_2_9_IN), | ||||
|     '2.70in': ('b', display.display_ns.WAVESHARE_EPAPER_2_7_IN), | ||||
|     '4.20in': ('b', display.display_ns.WAVESHARE_EPAPER_4_2_IN), | ||||
|     '7.50in': ('b', display.display_ns.WAVESHARE_EPAPER_7_5_IN), | ||||
|     '1.54in': ('a', WaveshareEPaperTypeAModel.WAVESHARE_EPAPER_1_54_IN), | ||||
|     '2.13in': ('a', WaveshareEPaperTypeAModel.WAVESHARE_EPAPER_2_13_IN), | ||||
|     '2.90in': ('a', WaveshareEPaperTypeAModel.WAVESHARE_EPAPER_2_9_IN), | ||||
|     '2.70in': ('b', WaveshareEPaperTypeBModel.WAVESHARE_EPAPER_2_7_IN), | ||||
|     '4.20in': ('b', WaveshareEPaperTypeBModel.WAVESHARE_EPAPER_4_2_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({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(None), | ||||
|     cv.GenerateID(): cv.declare_variable_id(WaveshareEPaper), | ||||
|     cv.GenerateID(CONF_SPI_ID): cv.use_variable_id(SPIComponent), | ||||
|     vol.Required(CONF_CS_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_BUSY_PIN): pins.gpio_input_pin_schema, | ||||
|     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): | ||||
|     for spi in get_variable(config[CONF_SPI_ID]): | ||||
|     for spi_ in get_variable(config[CONF_SPI_ID]): | ||||
|         yield | ||||
|     for cs in gpio_output_pin_expression(config[CONF_CS_PIN]): | ||||
|         yield | ||||
| @@ -55,10 +60,10 @@ def to_code(config): | ||||
|  | ||||
|     model_type, model = MODELS[config[CONF_MODEL]] | ||||
|     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) | ||||
|     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) | ||||
|     else: | ||||
|         raise NotImplementedError() | ||||
| @@ -79,6 +84,7 @@ def to_code(config): | ||||
|         add(epaper.set_full_update_every(config[CONF_FULL_UPDATE_EVERY])) | ||||
|  | ||||
|     display.setup_display(epaper, config) | ||||
|     setup_component(epaper, config) | ||||
|  | ||||
|  | ||||
| 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 | ||||
|  | ||||
| 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.helpers import App, Pvariable, add, esphomelib_ns, RawExpression, ArrayInitializer | ||||
| from esphomeyaml.const import CONF_ID, CONF_SCAN_INTERVAL, CONF_TYPE, CONF_UUID, ESP_PLATFORM_ESP32 | ||||
| from esphomeyaml.helpers import App, ArrayInitializer, Component, Pvariable, RawExpression, add, \ | ||||
|     esphomelib_ns, setup_component | ||||
|  | ||||
| ESP_PLATFORMS = [ESP_PLATFORM_ESP32] | ||||
|  | ||||
| ESP32BLEBeacon = esphomelib_ns.ESP32BLEBeacon | ||||
| ESP32BLEBeacon = esphomelib_ns.class_('ESP32BLEBeacon', Component) | ||||
|  | ||||
| CONF_MAJOR = 'major' | ||||
| CONF_MINOR = 'minor' | ||||
| @@ -18,12 +19,12 @@ CONFIG_SCHEMA = vol.Schema({ | ||||
|     vol.Optional(CONF_MAJOR): cv.uint16_t, | ||||
|     vol.Optional(CONF_MINOR): cv.uint16_t, | ||||
|     vol.Optional(CONF_SCAN_INTERVAL): cv.positive_time_period_milliseconds, | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     uuid = config[CONF_UUID].hex | ||||
|     uuid_arr = [RawExpression('0x{}'.format(uuid[i:i+2])) for i in range(0, len(uuid), 2)] | ||||
|     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)) | ||||
|     ble = Pvariable(config[CONF_ID], rhs) | ||||
|     if CONF_MAJOR in config: | ||||
| @@ -31,5 +32,7 @@ def to_code(config): | ||||
|     if CONF_MINOR in config: | ||||
|         add(ble.set_minor(config[CONF_MINOR])) | ||||
|  | ||||
|     setup_component(ble, config) | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_ESP32_BLE_BEACON' | ||||
|   | ||||
| @@ -1,19 +1,26 @@ | ||||
| import voluptuous as vol | ||||
|  | ||||
| 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.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] | ||||
|  | ||||
| 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({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(ESP32BLETracker), | ||||
|     vol.Optional(CONF_SCAN_INTERVAL): cv.positive_time_period_milliseconds, | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema) | ||||
|  | ||||
|  | ||||
| def make_address_array(address): | ||||
| @@ -27,5 +34,7 @@ def to_code(config): | ||||
|     if CONF_SCAN_INTERVAL in config: | ||||
|         add(ble.set_scan_interval(config[CONF_SCAN_INTERVAL])) | ||||
|  | ||||
|     setup_component(ble, config) | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_ESP32_BLE_TRACKER' | ||||
|   | ||||
| @@ -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_HIGH_VOLTAGE_REFERENCE, CONF_VOLTAGE_ATTENUATION, ESP_PLATFORM_ESP32 | ||||
| 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] | ||||
|  | ||||
| @@ -41,7 +41,7 @@ VOLTAGE_ATTENUATION = { | ||||
|     '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({ | ||||
|     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_HIGH_VOLTAGE_REFERENCE): validate_voltage(HIGH_VOLTAGE_REFERENCE), | ||||
|     vol.Optional(CONF_VOLTAGE_ATTENUATION): validate_voltage(VOLTAGE_ATTENUATION), | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
| @@ -80,5 +80,7 @@ def to_code(config): | ||||
|         value = VOLTAGE_ATTENUATION[config[CONF_VOLTAGE_ATTENUATION]] | ||||
|         add(touch.set_voltage_attenuation(value)) | ||||
|  | ||||
|     setup_component(touch, config) | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_ESP32_TOUCH_BINARY_SENSOR' | ||||
|   | ||||
| @@ -1,29 +1,33 @@ | ||||
| import voluptuous as vol | ||||
|  | ||||
| from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY | ||||
| from esphomeyaml.components import mqtt | ||||
| import esphomeyaml.config_validation as cv | ||||
| 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_SPEED, CONF_OSCILLATING | ||||
|     CONF_SPEED, CONF_OSCILLATING, CONF_OSCILLATION_OUTPUT, CONF_NAME | ||||
| 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({ | ||||
|  | ||||
| }) | ||||
|  | ||||
| fan_ns = esphomelib_ns.namespace('fan') | ||||
| FanState = fan_ns.FanState | ||||
| MQTTFanComponent = fan_ns.MQTTFanComponent | ||||
| MakeFan = Application.MakeFan | ||||
| TurnOnAction = fan_ns.TurnOnAction | ||||
| TurnOffAction = fan_ns.TurnOffAction | ||||
| ToggleAction = fan_ns.ToggleAction | ||||
| FanSpeed = fan_ns.FanSpeed | ||||
| FAN_SPEED_OFF = fan_ns.FAN_SPEED_OFF | ||||
| FAN_SPEED_LOW = fan_ns.FAN_SPEED_LOW | ||||
| FAN_SPEED_MEDIUM = fan_ns.FAN_SPEED_MEDIUM | ||||
| FAN_SPEED_HIGH = fan_ns.FAN_SPEED_HIGH | ||||
| FanState = fan_ns.class_('FanState', Nameable, Component) | ||||
| MQTTFanComponent = fan_ns.class_('MQTTFanComponent', mqtt.MQTTComponent) | ||||
| MakeFan = Application.struct('MakeFan') | ||||
|  | ||||
| # Actions | ||||
| TurnOnAction = fan_ns.class_('TurnOnAction', Action) | ||||
| TurnOffAction = fan_ns.class_('TurnOffAction', Action) | ||||
| ToggleAction = fan_ns.class_('ToggleAction', Action) | ||||
|  | ||||
| FanSpeed = fan_ns.enum('FanSpeed') | ||||
| 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({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(FanState), | ||||
| @@ -73,7 +77,7 @@ BUILD_FLAGS = '-DUSE_FAN' | ||||
|  | ||||
| CONF_FAN_TOGGLE = 'fan.toggle' | ||||
| 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' | ||||
| 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' | ||||
| 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_SPEED): cv.templatable(validate_fan_speed), | ||||
| }) | ||||
| @@ -128,3 +132,15 @@ def fan_turn_on_to_code(config, action_id, arg_type): | ||||
|             yield None | ||||
|         add(action.set_speed(template_)) | ||||
|     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 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.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({ | ||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(fan.MakeFan), | ||||
|     vol.Required(CONF_OUTPUT): cv.use_variable_id(None), | ||||
|     vol.Optional(CONF_OSCILLATION_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(output.BinaryOutput), | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema)) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     output = None | ||||
|     for output in get_variable(config[CONF_OUTPUT]): | ||||
|     for output_ in get_variable(config[CONF_OUTPUT]): | ||||
|         yield | ||||
|  | ||||
|     rhs = App.make_fan(config[CONF_NAME]) | ||||
|     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: | ||||
|         oscillation_output = None | ||||
|         for oscillation_output in get_variable(config[CONF_OSCILLATION_OUTPUT]): | ||||
|             yield | ||||
|         add(fan_struct.Poutput.set_oscillation(oscillation_output)) | ||||
|  | ||||
|     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 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, \ | ||||
|     CONF_OSCILLATION_OUTPUT, CONF_OUTPUT, CONF_SPEED, CONF_SPEED_COMMAND_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({ | ||||
|     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_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.Required(CONF_LOW): cv.percentage, | ||||
|         vol.Required(CONF_MEDIUM): cv.percentage, | ||||
|         vol.Required(CONF_HIGH): cv.percentage, | ||||
|     }), | ||||
| })) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema)) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     output = None | ||||
|     for output in get_variable(config[CONF_OUTPUT]): | ||||
|     for output_ in get_variable(config[CONF_OUTPUT]): | ||||
|         yield | ||||
|     rhs = App.make_fan(config[CONF_NAME]) | ||||
|     fan_struct = variable(config[CONF_MAKE_ID], rhs) | ||||
|     if CONF_SPEED in config: | ||||
|         speeds = config[CONF_SPEED] | ||||
|         add(fan_struct.Poutput.set_speed(output, | ||||
|         add(fan_struct.Poutput.set_speed(output_, | ||||
|                                          speeds[CONF_LOW], | ||||
|                                          speeds[CONF_MEDIUM], | ||||
|                                          speeds[CONF_HIGH])) | ||||
|     else: | ||||
|         add(fan_struct.Poutput.set_speed(output)) | ||||
|         add(fan_struct.Poutput.set_speed(output_)) | ||||
|  | ||||
|     if CONF_OSCILLATION_OUTPUT in config: | ||||
|         oscillation_output = None | ||||
|         for oscillation_output in get_variable(config[CONF_OSCILLATION_OUTPUT]): | ||||
|             yield | ||||
|         add(fan_struct.Poutput.set_oscillation(oscillation_output)) | ||||
|  | ||||
|     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'] | ||||
|  | ||||
| Font = display.display_ns.Font | ||||
| Glyph = display.display_ns.Glyph | ||||
| Font = display.display_ns.class_('Font') | ||||
| Glyph = display.display_ns.class_('Glyph') | ||||
|  | ||||
|  | ||||
| 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.const import CONF_FREQUENCY, CONF_SCL, CONF_SDA, CONF_SCAN, CONF_ID, \ | ||||
|     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({ | ||||
|     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 " | ||||
|                                                    "because timeouts are already handled by the " | ||||
|                                                    "low-level i2c interface.") | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
| @@ -27,6 +28,8 @@ def to_code(config): | ||||
|     if CONF_FREQUENCY in config: | ||||
|         add(i2c.set_frequency(config[CONF_FREQUENCY])) | ||||
|  | ||||
|     setup_component(i2c, config) | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_I2C' | ||||
|  | ||||
|   | ||||
| @@ -15,7 +15,7 @@ _LOGGER = logging.getLogger(__name__) | ||||
|  | ||||
| DEPENDENCIES = ['display'] | ||||
|  | ||||
| Image_ = display.display_ns.Image | ||||
| Image_ = display.display_ns.class_('Image') | ||||
|  | ||||
| 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 | ||||
|  | ||||
| from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY | ||||
| from esphomeyaml.components import mqtt | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.const import CONF_ALPHA, CONF_BLUE, CONF_BRIGHTNESS, CONF_COLORS, \ | ||||
|     CONF_DEFAULT_TRANSITION_LENGTH, CONF_DURATION, CONF_EFFECTS, CONF_EFFECT_ID, \ | ||||
| @@ -10,36 +11,48 @@ from esphomeyaml.const import CONF_ALPHA, CONF_BLUE, CONF_BRIGHTNESS, CONF_COLOR | ||||
|     CONF_EFFECT | ||||
| from esphomeyaml.helpers import Application, ArrayInitializer, Pvariable, RawExpression, \ | ||||
|     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({ | ||||
|  | ||||
| }) | ||||
|  | ||||
| # Base | ||||
| light_ns = esphomelib_ns.namespace('light') | ||||
| LightState = light_ns.LightState | ||||
| LightColorValues = light_ns.LightColorValues | ||||
| MQTTJSONLightComponent = light_ns.MQTTJSONLightComponent | ||||
| ToggleAction = light_ns.ToggleAction | ||||
| TurnOffAction = light_ns.TurnOffAction | ||||
| TurnOnAction = light_ns.TurnOnAction | ||||
| MakeLight = Application.MakeLight | ||||
| RandomLightEffect = light_ns.RandomLightEffect | ||||
| LambdaLightEffect = light_ns.LambdaLightEffect | ||||
| StrobeLightEffect = light_ns.StrobeLightEffect | ||||
| StrobeLightEffectColor = light_ns.StrobeLightEffectColor | ||||
| FlickerLightEffect = light_ns.FlickerLightEffect | ||||
| FastLEDLambdaLightEffect = light_ns.FastLEDLambdaLightEffect | ||||
| FastLEDRainbowLightEffect = light_ns.FastLEDRainbowLightEffect | ||||
| FastLEDColorWipeEffect = light_ns.FastLEDColorWipeEffect | ||||
| FastLEDColorWipeEffectColor = light_ns.FastLEDColorWipeEffectColor | ||||
| FastLEDScanEffect = light_ns.FastLEDScanEffect | ||||
| FastLEDScanEffectColor = light_ns.FastLEDScanEffectColor | ||||
| FastLEDTwinkleEffect = light_ns.FastLEDTwinkleEffect | ||||
| FastLEDRandomTwinkleEffect = light_ns.FastLEDRandomTwinkleEffect | ||||
| FastLEDFireworksEffect = light_ns.FastLEDFireworksEffect | ||||
| FastLEDFlickerEffect = light_ns.FastLEDFlickerEffect | ||||
| FastLEDLightOutputComponent = light_ns.FastLEDLightOutputComponent | ||||
| LightState = light_ns.class_('LightState', Nameable, Component) | ||||
| MakeLight = Application.struct('MakeLight') | ||||
| LightOutput = light_ns.class_('LightOutput') | ||||
| FastLEDLightOutputComponent = light_ns.class_('FastLEDLightOutputComponent', LightOutput) | ||||
|  | ||||
| # Actions | ||||
| ToggleAction = light_ns.class_('ToggleAction', Action) | ||||
| TurnOffAction = light_ns.class_('TurnOffAction', Action) | ||||
| TurnOnAction = light_ns.class_('TurnOnAction', Action) | ||||
|  | ||||
| LightColorValues = light_ns.class_('LightColorValues') | ||||
|  | ||||
|  | ||||
| MQTTJSONLightComponent = light_ns.class_('MQTTJSONLightComponent', mqtt.MQTTComponent) | ||||
|  | ||||
| # Effects | ||||
| LightEffect = light_ns.class_('LightEffect') | ||||
| RandomLightEffect = light_ns.class_('RandomLightEffect', LightEffect) | ||||
| LambdaLightEffect = light_ns.class_('LambdaLightEffect', LightEffect) | ||||
| StrobeLightEffect = light_ns.class_('StrobeLightEffect', LightEffect) | ||||
| StrobeLightEffectColor = light_ns.class_('StrobeLightEffectColor', LightEffect) | ||||
| FlickerLightEffect = light_ns.class_('FlickerLightEffect', LightEffect) | ||||
| 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_FLICKER = 'flicker' | ||||
| @@ -344,7 +357,7 @@ BUILD_FLAGS = '-DUSE_LIGHT' | ||||
|  | ||||
| CONF_LIGHT_TOGGLE = 'light.toggle' | ||||
| 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), | ||||
| }) | ||||
|  | ||||
| @@ -366,7 +379,7 @@ def light_toggle_to_code(config, action_id, arg_type): | ||||
|  | ||||
| CONF_LIGHT_TURN_OFF = 'light.turn_off' | ||||
| 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), | ||||
| }) | ||||
|  | ||||
| @@ -388,7 +401,7 @@ def light_turn_off_to_code(config, action_id, arg_type): | ||||
|  | ||||
| CONF_LIGHT_TURN_ON = 'light.turn_on' | ||||
| 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'): | ||||
|         cv.templatable(cv.positive_time_period_milliseconds), | ||||
|     vol.Exclusive(CONF_FLASH_LENGTH, 'transformer'): | ||||
| @@ -448,3 +461,24 @@ def light_turn_on_to_code(config, action_id, arg_type): | ||||
|             yield None | ||||
|         add(action.set_effect(template_)) | ||||
|     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 | ||||
|  | ||||
| from esphomeyaml.components import light, output | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.components import light | ||||
| from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_OUTPUT, CONF_EFFECTS | ||||
| from esphomeyaml.helpers import App, get_variable, variable | ||||
| from esphomeyaml.const import CONF_EFFECTS, CONF_MAKE_ID, CONF_NAME, CONF_OUTPUT | ||||
| from esphomeyaml.helpers import App, get_variable, setup_component, variable | ||||
|  | ||||
| PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ | ||||
|     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), | ||||
| })) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema)) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     output = None | ||||
|     for output in get_variable(config[CONF_OUTPUT]): | ||||
|     for output_ in get_variable(config[CONF_OUTPUT]): | ||||
|         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.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 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, \ | ||||
|     validate_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_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({ | ||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), | ||||
|     vol.Required(CONF_COLD_WHITE): cv.use_variable_id(None), | ||||
|     vol.Required(CONF_WARM_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(output.FloatOutput), | ||||
|     vol.Required(CONF_COLD_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_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds, | ||||
|     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): | ||||
| @@ -32,3 +32,9 @@ def to_code(config): | ||||
|                               cold_white, warm_white) | ||||
|     light_struct = variable(config[CONF_MAKE_ID], rhs) | ||||
|     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_RGB_ORDER, CONF_EFFECTS, CONF_COLOR_CORRECT | ||||
| from esphomeyaml.helpers import App, Application, RawExpression, TemplateArguments, add, \ | ||||
|     get_variable, variable | ||||
|     get_variable, variable, setup_component | ||||
|  | ||||
| TYPES = [ | ||||
|     'NEOPIXEL', | ||||
| @@ -53,7 +53,7 @@ def validate(value): | ||||
|     return value | ||||
|  | ||||
|  | ||||
| MakeFastLEDLight = Application.MakeFastLEDLight | ||||
| MakeFastLEDLight = Application.struct('MakeFastLEDLight') | ||||
|  | ||||
| PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ | ||||
|     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_POWER_SUPPLY): cv.use_variable_id(PowerSupplyComponent), | ||||
|     vol.Optional(CONF_EFFECTS): light.validate_effects(light.FASTLED_EFFECTS), | ||||
| }), validate) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema), validate) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
| @@ -89,7 +89,6 @@ def to_code(config): | ||||
|         add(fast_led.set_max_refresh_rate(config[CONF_MAX_REFRESH_RATE])) | ||||
|  | ||||
|     if CONF_POWER_SUPPLY in config: | ||||
|         power_supply = None | ||||
|         for power_supply in get_variable(config[CONF_POWER_SUPPLY]): | ||||
|             yield | ||||
|         add(fast_led.set_power_supply(power_supply)) | ||||
| @@ -99,6 +98,12 @@ def to_code(config): | ||||
|         add(fast_led.set_correction(r, g, b)) | ||||
|  | ||||
|     light.setup_light(make.Pstate, make.Pmqtt, config) | ||||
|     setup_component(fast_led, config) | ||||
|  | ||||
|  | ||||
| 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_NAME, CONF_NUM_LEDS, CONF_POWER_SUPPLY, CONF_RGB_ORDER, CONF_EFFECTS, CONF_COLOR_CORRECT | ||||
| from esphomeyaml.helpers import App, Application, RawExpression, TemplateArguments, add, \ | ||||
|     get_variable, variable | ||||
|     get_variable, variable, setup_component | ||||
|  | ||||
| CHIPSETS = [ | ||||
|     'LPD8806', | ||||
| @@ -30,7 +30,7 @@ RGB_ORDERS = [ | ||||
|     'BGR', | ||||
| ] | ||||
|  | ||||
| MakeFastLEDLight = Application.MakeFastLEDLight | ||||
| MakeFastLEDLight = Application.struct('MakeFastLEDLight') | ||||
|  | ||||
| PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ | ||||
|     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_POWER_SUPPLY): cv.use_variable_id(PowerSupplyComponent), | ||||
|     vol.Optional(CONF_EFFECTS): light.validate_effects(light.FASTLED_EFFECTS), | ||||
| })) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema)) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
| @@ -69,7 +69,6 @@ def to_code(config): | ||||
|         add(fast_led.set_max_refresh_rate(config[CONF_MAX_REFRESH_RATE])) | ||||
|  | ||||
|     if CONF_POWER_SUPPLY in config: | ||||
|         power_supply = None | ||||
|         for power_supply in get_variable(config[CONF_POWER_SUPPLY]): | ||||
|             yield | ||||
|         add(fast_led.set_power_supply(power_supply)) | ||||
| @@ -79,6 +78,12 @@ def to_code(config): | ||||
|         add(fast_led.set_correction(r, g, b)) | ||||
|  | ||||
|     light.setup_light(make.Pstate, make.Pmqtt, config) | ||||
|     setup_component(fast_led, config) | ||||
|  | ||||
|  | ||||
| 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 | ||||
|  | ||||
| from esphomeyaml.components import light, output | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.components import light | ||||
| from esphomeyaml.const import CONF_DEFAULT_TRANSITION_LENGTH, CONF_GAMMA_CORRECT, CONF_MAKE_ID, \ | ||||
|     CONF_NAME, CONF_OUTPUT, CONF_EFFECTS | ||||
| from esphomeyaml.helpers import App, get_variable, variable | ||||
| from esphomeyaml.const import CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_GAMMA_CORRECT, \ | ||||
|     CONF_MAKE_ID, CONF_NAME, CONF_OUTPUT | ||||
| from esphomeyaml.helpers import App, get_variable, setup_component, variable | ||||
|  | ||||
| PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ | ||||
|     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_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds, | ||||
|     vol.Optional(CONF_EFFECTS): light.validate_effects(light.MONOCHROMATIC_EFFECTS), | ||||
| })) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema)) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     output = None | ||||
|     for output in get_variable(config[CONF_OUTPUT]): | ||||
|     for output_ in get_variable(config[CONF_OUTPUT]): | ||||
|         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.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 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, \ | ||||
|     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({ | ||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), | ||||
|     vol.Required(CONF_RED): cv.use_variable_id(None), | ||||
|     vol.Required(CONF_GREEN): cv.use_variable_id(None), | ||||
|     vol.Required(CONF_BLUE): cv.use_variable_id(None), | ||||
|     vol.Required(CONF_RED): cv.use_variable_id(output.FloatOutput), | ||||
|     vol.Required(CONF_GREEN): cv.use_variable_id(output.FloatOutput), | ||||
|     vol.Required(CONF_BLUE): cv.use_variable_id(output.FloatOutput), | ||||
|     vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float, | ||||
|     vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds, | ||||
|     vol.Optional(CONF_EFFECTS): light.validate_effects(light.RGB_EFFECTS), | ||||
| })) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema)) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     red = None | ||||
|     for red in get_variable(config[CONF_RED]): | ||||
|         yield | ||||
|     green = None | ||||
|     for green in get_variable(config[CONF_GREEN]): | ||||
|         yield | ||||
|     blue = None | ||||
|     for blue in get_variable(config[CONF_BLUE]): | ||||
|         yield | ||||
|     rhs = App.make_rgb_light(config[CONF_NAME], red, green, blue) | ||||
|     light_struct = variable(config[CONF_MAKE_ID], rhs) | ||||
|     light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config) | ||||
|     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 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, \ | ||||
|     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({ | ||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), | ||||
|     vol.Required(CONF_RED): cv.use_variable_id(None), | ||||
|     vol.Required(CONF_GREEN): cv.use_variable_id(None), | ||||
|     vol.Required(CONF_BLUE): cv.use_variable_id(None), | ||||
|     vol.Required(CONF_WHITE): cv.use_variable_id(None), | ||||
|     vol.Required(CONF_RED): cv.use_variable_id(output.FloatOutput), | ||||
|     vol.Required(CONF_GREEN): cv.use_variable_id(output.FloatOutput), | ||||
|     vol.Required(CONF_BLUE): cv.use_variable_id(output.FloatOutput), | ||||
|     vol.Required(CONF_WHITE): cv.use_variable_id(output.FloatOutput), | ||||
|     vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float, | ||||
|     vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds, | ||||
|     vol.Optional(CONF_EFFECTS): light.validate_effects(light.RGB_EFFECTS), | ||||
| })) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema)) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     red = None | ||||
|     for red in get_variable(config[CONF_RED]): | ||||
|         yield | ||||
|     green = None | ||||
|     for green in get_variable(config[CONF_GREEN]): | ||||
|         yield | ||||
|     blue = None | ||||
|     for blue in get_variable(config[CONF_BLUE]): | ||||
|         yield | ||||
|     white = None | ||||
|     for white in get_variable(config[CONF_WHITE]): | ||||
|         yield | ||||
|     rhs = App.make_rgbw_light(config[CONF_NAME], red, green, blue, white) | ||||
|     light_struct = variable(config[CONF_MAKE_ID], rhs) | ||||
|     light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config) | ||||
|     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 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, \ | ||||
|     CONF_DEFAULT_TRANSITION_LENGTH, CONF_EFFECTS, CONF_GAMMA_CORRECT, CONF_GREEN, CONF_MAKE_ID, \ | ||||
|     CONF_NAME, CONF_RED, CONF_WARM_WHITE, CONF_WARM_WHITE_COLOR_TEMPERATURE | ||||
| from esphomeyaml.helpers import App, get_variable, variable | ||||
| from esphomeyaml.helpers import App, get_variable, variable, setup_component | ||||
|  | ||||
|  | ||||
| def validate_color_temperature(value): | ||||
| @@ -30,18 +30,18 @@ def validate_cold_white_colder(value): | ||||
|  | ||||
| PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ | ||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), | ||||
|     vol.Required(CONF_RED): cv.use_variable_id(None), | ||||
|     vol.Required(CONF_GREEN): cv.use_variable_id(None), | ||||
|     vol.Required(CONF_BLUE): cv.use_variable_id(None), | ||||
|     vol.Required(CONF_COLD_WHITE): cv.use_variable_id(None), | ||||
|     vol.Required(CONF_WARM_WHITE): cv.use_variable_id(None), | ||||
|     vol.Required(CONF_RED): cv.use_variable_id(output.FloatOutput), | ||||
|     vol.Required(CONF_GREEN): cv.use_variable_id(output.FloatOutput), | ||||
|     vol.Required(CONF_BLUE): cv.use_variable_id(output.FloatOutput), | ||||
|     vol.Required(CONF_COLD_WHITE): cv.use_variable_id(output.FloatOutput), | ||||
|     vol.Required(CONF_WARM_WHITE): cv.use_variable_id(output.FloatOutput), | ||||
|     vol.Required(CONF_COLD_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_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds, | ||||
|     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): | ||||
| @@ -60,3 +60,9 @@ def to_code(config): | ||||
|                                red, green, blue, cold_white, warm_white) | ||||
|     light_struct = variable(config[CONF_MAKE_ID], rhs) | ||||
|     light.setup_light(light_struct.Pstate, light_struct.Pmqtt, config) | ||||
|     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, \ | ||||
|     CONF_LOGS, CONF_TAG, CONF_TX_BUFFER_SIZE | ||||
| from esphomeyaml.core import ESPHomeYAMLError, Lambda | ||||
| from esphomeyaml.helpers import App, Pvariable, TemplateArguments, add, esphomelib_ns, global_ns, \ | ||||
|     process_lambda, RawExpression, statement | ||||
| from esphomeyaml.helpers import App, Pvariable, RawExpression, TemplateArguments, add, \ | ||||
|     esphomelib_ns, global_ns, process_lambda, statement, Component | ||||
|  | ||||
| LOG_LEVELS = { | ||||
|     'NONE': global_ns.ESPHOMELIB_LOG_LEVEL_NONE, | ||||
| @@ -44,7 +44,7 @@ def validate_local_no_higher_than_global(value): | ||||
|     return value | ||||
|  | ||||
|  | ||||
| LogComponent = esphomelib_ns.LogComponent | ||||
| LogComponent = esphomelib_ns.class_('LogComponent', Component) | ||||
|  | ||||
| CONFIG_SCHEMA = vol.All(vol.Schema({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(LogComponent), | ||||
| @@ -79,6 +79,7 @@ def maybe_simple_message(schema): | ||||
|         if isinstance(value, dict): | ||||
|             return vol.Schema(schema)(value) | ||||
|         return vol.Schema(schema)({CONF_FORMAT: value}) | ||||
|  | ||||
|     return validator | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| from collections import OrderedDict | ||||
| import re | ||||
|  | ||||
| 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_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_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, \ | ||||
|     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): | ||||
| @@ -34,12 +38,14 @@ MQTT_MESSAGE_SCHEMA = vol.Any(None, MQTT_MESSAGE_BASE.extend({ | ||||
| })) | ||||
|  | ||||
| mqtt_ns = esphomelib_ns.namespace('mqtt') | ||||
| MQTTMessage = mqtt_ns.MQTTMessage | ||||
| MQTTClientComponent = mqtt_ns.MQTTClientComponent | ||||
| MQTTPublishAction = mqtt_ns.MQTTPublishAction | ||||
| MQTTPublishJsonAction = mqtt_ns.MQTTPublishJsonAction | ||||
| MQTTMessageTrigger = mqtt_ns.MQTTMessageTrigger | ||||
| MQTTJsonMessageTrigger = mqtt_ns.MQTTJsonMessageTrigger | ||||
| MQTTMessage = mqtt_ns.struct('MQTTMessage') | ||||
| MQTTClientComponent = mqtt_ns.class_('MQTTClientComponent', Component) | ||||
| MQTTPublishAction = mqtt_ns.class_('MQTTPublishAction', Action) | ||||
| MQTTPublishJsonAction = mqtt_ns.class_('MQTTPublishJsonAction', Action) | ||||
| MQTTMessageTrigger = mqtt_ns.class_('MQTTMessageTrigger', Trigger.template(std_string)) | ||||
| MQTTJsonMessageTrigger = mqtt_ns.class_('MQTTJsonMessageTrigger', | ||||
|                                         Trigger.template(JsonObjectConstRef)) | ||||
| MQTTComponent = mqtt_ns.class_('MQTTComponent', Component) | ||||
|  | ||||
|  | ||||
| def validate_broker(value): | ||||
| @@ -239,3 +245,66 @@ def required_build_flags(config): | ||||
|     if CONF_SSL_FINGERPRINTS in config: | ||||
|         return '-DASYNC_TCP_SSL_ENABLED=1' | ||||
|     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, \ | ||||
|     ESP_PLATFORM_ESP32, ESP_PLATFORM_ESP8266 | ||||
| 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__) | ||||
|  | ||||
| OTAComponent = esphomelib_ns.OTAComponent | ||||
| OTAComponent = esphomelib_ns.class_('OTAComponent', Component) | ||||
|  | ||||
| CONFIG_SCHEMA = vol.Schema({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(OTAComponent), | ||||
|     vol.Optional(CONF_SAFE_MODE, default=True): cv.boolean, | ||||
|     # TODO Num attempts + wait time | ||||
|     vol.Optional(CONF_PORT): cv.port, | ||||
|     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.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, \ | ||||
|     templatable, bool_ | ||||
|     templatable, float_, add_job, Action | ||||
|  | ||||
| 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) | ||||
|  | ||||
| output_ns = esphomelib_ns.namespace('output') | ||||
| TurnOffAction = output_ns.TurnOffAction | ||||
| TurnOnAction = output_ns.TurnOnAction | ||||
| SetLevelAction = output_ns.SetLevelAction | ||||
| BinaryOutput = output_ns.class_('BinaryOutput') | ||||
| FloatOutput = output_ns.class_('FloatOutput', BinaryOutput) | ||||
|  | ||||
| # 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): | ||||
| @@ -43,37 +47,20 @@ 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): | ||||
|         yield | ||||
|     add_job(setup_output_platform_, obj, config, skip_power_supply) | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_OUTPUT' | ||||
|  | ||||
|  | ||||
| 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({ | ||||
|     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) | ||||
| def output_turn_off_to_code(config, action_id, arg_type): | ||||
| @ACTION_REGISTRY.register(CONF_OUTPUT_TURN_ON, OUTPUT_TURN_ON_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 | ||||
| @@ -82,10 +69,26 @@ def output_turn_off_to_code(config, action_id, arg_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' | ||||
| OUTPUT_SET_LEVEL_ACTION = vol.Schema({ | ||||
|     vol.Required(CONF_ID): cv.use_variable_id(None), | ||||
|     vol.Required(CONF_LEVEL): cv.percentage, | ||||
|     vol.Required(CONF_ID): cv.use_variable_id(FloatOutput), | ||||
|     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) | ||||
|     type = SetLevelAction.template(arg_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 | ||||
|     add(action.set_level(template_)) | ||||
|     yield action | ||||
|   | ||||
| @@ -1,36 +1,41 @@ | ||||
| import voluptuous as vol | ||||
|  | ||||
| from esphomeyaml import pins | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.components import output | ||||
| from esphomeyaml.const import CONF_ID, CONF_NUMBER, CONF_PIN, ESP_PLATFORM_ESP8266 | ||||
| from esphomeyaml.core import ESPHomeYAMLError | ||||
| from esphomeyaml.helpers import App, Pvariable, gpio_output_pin_expression | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.const import CONF_ID, CONF_NUMBER, CONF_PIN, ESP_PLATFORM_ESP8266, CONF_FREQUENCY | ||||
| from esphomeyaml.helpers import App, Component, Pvariable, gpio_output_pin_expression, \ | ||||
|     setup_component, add | ||||
|  | ||||
| ESP_PLATFORMS = [ESP_PLATFORM_ESP8266] | ||||
|  | ||||
|  | ||||
| def valid_pwm_pin(value): | ||||
|     if value[CONF_NUMBER] > 16: | ||||
|         raise ESPHomeYAMLError(u"ESP8266: Only pins 0-16 support PWM.") | ||||
|     num = value[CONF_NUMBER] | ||||
|     cv.one_of(0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16)(num) | ||||
|     return value | ||||
|  | ||||
|  | ||||
| ESP8266PWMOutput = output.output_ns.ESP8266PWMOutput | ||||
| ESP8266PWMOutput = output.output_ns.class_('ESP8266PWMOutput', output.FloatOutput, Component) | ||||
|  | ||||
| PLATFORM_SCHEMA = output.FLOAT_OUTPUT_PLATFORM_SCHEMA.extend({ | ||||
|     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.Optional(CONF_FREQUENCY): vol.All(cv.frequency, vol.Range(min=1.0e-6)), | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     pin = None | ||||
|     for pin in gpio_output_pin_expression(config[CONF_PIN]): | ||||
|         yield | ||||
|     rhs = App.make_esp8266_pwm_output(pin) | ||||
|     gpio = Pvariable(config[CONF_ID], rhs) | ||||
|  | ||||
|     if CONF_FREQUENCY in config: | ||||
|         add(gpio.set_frequency(config[CONF_FREQUENCY])) | ||||
|  | ||||
|     output.setup_output_platform(gpio, config) | ||||
|     setup_component(gpio, config) | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_ESP8266_PWM_OUTPUT' | ||||
|   | ||||
| @@ -4,23 +4,25 @@ from esphomeyaml import pins | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.components import output | ||||
| 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({ | ||||
|     vol.Required(CONF_ID): cv.declare_variable_id(GPIOBinaryOutputComponent), | ||||
|     vol.Required(CONF_PIN): pins.gpio_output_pin_schema, | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     pin = None | ||||
|     for pin in gpio_output_pin_expression(config[CONF_PIN]): | ||||
|         yield | ||||
|     rhs = App.make_gpio_output(pin) | ||||
|     gpio = Pvariable(config[CONF_ID], rhs) | ||||
|     output.setup_output_platform(gpio, config) | ||||
|     setup_component(gpio, config) | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_GPIO_OUTPUT' | ||||
|   | ||||
| @@ -5,7 +5,7 @@ from esphomeyaml import pins | ||||
| from esphomeyaml.components import output | ||||
| from esphomeyaml.const import APB_CLOCK_FREQ, CONF_BIT_DEPTH, CONF_CHANNEL, CONF_FREQUENCY, \ | ||||
|     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] | ||||
|  | ||||
| @@ -19,7 +19,7 @@ def validate_frequency_bit_depth(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({ | ||||
|     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_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)) | ||||
| }), validate_frequency_bit_depth) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema), validate_frequency_bit_depth) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
| @@ -39,6 +39,7 @@ def to_code(config): | ||||
|     if CONF_CHANNEL in config: | ||||
|         add(ledc.set_channel(config[CONF_CHANNEL])) | ||||
|     output.setup_output_platform(ledc, config) | ||||
|     setup_component(ledc, config) | ||||
|  | ||||
|  | ||||
| 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'] | ||||
|  | ||||
| Channel = PCA9685OutputComponent.Channel | ||||
| Channel = PCA9685OutputComponent.class_('Channel', output.FloatOutput) | ||||
|  | ||||
| PLATFORM_SCHEMA = output.FLOAT_OUTPUT_PLATFORM_SCHEMA.extend({ | ||||
|     vol.Required(CONF_ID): cv.declare_variable_id(Channel), | ||||
| @@ -23,7 +23,6 @@ def to_code(config): | ||||
|     if CONF_POWER_SUPPLY in config: | ||||
|         for power_supply in get_variable(config[CONF_POWER_SUPPLY]): | ||||
|             yield | ||||
|     pca9685 = None | ||||
|     for pca9685 in get_variable(config[CONF_PCA9685_ID]): | ||||
|         yield | ||||
|     rhs = pca9685.create_channel(config[CONF_CHANNEL], power_supply) | ||||
|   | ||||
| @@ -1,13 +1,14 @@ | ||||
| import voluptuous as vol | ||||
|  | ||||
| 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.helpers import App, HexIntLiteral, Pvariable, add | ||||
| from esphomeyaml.helpers import App, HexIntLiteral, Pvariable, add, setup_component, Component | ||||
|  | ||||
| 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. " | ||||
|                           "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_PHASE_BALANCER): cv.invalid(PHASE_BALANCER_MESSAGE), | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema) | ||||
|  | ||||
| CONFIG_SCHEMA = vol.All(cv.ensure_list, [PCA9685_SCHEMA]) | ||||
|  | ||||
| @@ -30,6 +31,7 @@ def to_code(config): | ||||
|         pca9685 = Pvariable(conf[CONF_ID], rhs) | ||||
|         if CONF_ADDRESS in conf: | ||||
|             add(pca9685.set_address(HexIntLiteral(conf[CONF_ADDRESS]))) | ||||
|         setup_component(pca9685, conf) | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_PCA9685_OUTPUT' | ||||
|   | ||||
| @@ -1,19 +1,27 @@ | ||||
| import voluptuous as vol | ||||
|  | ||||
| from esphomeyaml import pins | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.const import CONF_ADDRESS, CONF_ID, CONF_PCF8575 | ||||
| from esphomeyaml.helpers import App, Pvariable, esphomelib_ns | ||||
| from esphomeyaml.helpers import App, GPIOInputPin, GPIOOutputPin, Pvariable, io_ns, setup_component | ||||
|  | ||||
| DEPENDENCIES = ['i2c'] | ||||
|  | ||||
| io_ns = esphomelib_ns.namespace('io') | ||||
| PCF8574Component = io_ns.PCF8574Component | ||||
| PCF8574GPIOMode = io_ns.enum('PCF8574GPIOMode') | ||||
| 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({ | ||||
|     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_PCF8575, default=False): cv.boolean, | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.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): | ||||
|     for conf in config: | ||||
|         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' | ||||
|   | ||||
| @@ -2,16 +2,18 @@ import voluptuous as vol | ||||
|  | ||||
| import esphomeyaml.config_validation as cv | ||||
| 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.const import CONF_CS_PIN, CONF_ID, CONF_SPI_ID, CONF_UPDATE_INTERVAL, \ | ||||
|     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'] | ||||
|  | ||||
| PN532Component = binary_sensor.binary_sensor_ns.PN532Component | ||||
| PN532Trigger = binary_sensor.binary_sensor_ns.PN532Trigger | ||||
| PN532Component = binary_sensor.binary_sensor_ns.class_('PN532Component', PollingComponent, | ||||
|                                                        spi.SPIDevice) | ||||
| PN532Trigger = binary_sensor.binary_sensor_ns.class_('PN532Trigger', Trigger.template(std_string)) | ||||
|  | ||||
| CONFIG_SCHEMA = vol.All(cv.ensure_list, [vol.Schema({ | ||||
|     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({ | ||||
|         cv.GenerateID(CONF_TRIGGER_ID): cv.declare_variable_id(PN532Trigger), | ||||
|     }), | ||||
| })]) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema)]) | ||||
|  | ||||
|  | ||||
| def to_code(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 | ||||
|         cs = None | ||||
|         for cs in gpio_output_pin_expression(conf[CONF_CS_PIN]): | ||||
|             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) | ||||
|  | ||||
|         for conf_ in conf.get(CONF_ON_TAG, []): | ||||
|             trigger = Pvariable(conf_[CONF_TRIGGER_ID], pn532.make_trigger()) | ||||
|             automation.build_automation(trigger, std_string, conf_) | ||||
|  | ||||
|         setup_component(pn532, conf) | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_PN532' | ||||
|   | ||||
| @@ -3,25 +3,26 @@ import voluptuous as vol | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml import pins | ||||
| 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({ | ||||
|     vol.Required(CONF_ID): cv.declare_variable_id(PowerSupplyComponent), | ||||
|     vol.Required(CONF_PIN): pins.gpio_output_pin_schema, | ||||
|     vol.Optional(CONF_ENABLE_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]) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     for conf in config: | ||||
|         pin = None | ||||
|         for pin in gpio_output_pin_expression(conf[CONF_PIN]): | ||||
|             yield | ||||
|  | ||||
|         rhs = App.make_power_supply(pin) | ||||
|         psu = Pvariable(conf[CONF_ID], rhs) | ||||
|         if CONF_ENABLE_TIME in conf: | ||||
| @@ -29,5 +30,7 @@ def to_code(config): | ||||
|         if CONF_KEEP_ON_TIME in conf: | ||||
|             add(psu.set_keep_on_time(conf[CONF_KEEP_ON_TIME])) | ||||
|  | ||||
|         setup_component(psu, conf) | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_OUTPUT' | ||||
|   | ||||
| @@ -1,28 +1,28 @@ | ||||
| import voluptuous as vol | ||||
|  | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.components import binary_sensor | ||||
| from esphomeyaml.components.uart import UARTComponent | ||||
| from esphomeyaml.components import binary_sensor, uart | ||||
| 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'] | ||||
|  | ||||
| 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({ | ||||
|     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): | ||||
|     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 | ||||
|         rhs = App.make_rdm6300_component(uart) | ||||
|         Pvariable(conf[CONF_ID], rhs) | ||||
|         rhs = App.make_rdm6300_component(uart_) | ||||
|         var = Pvariable(conf[CONF_ID], rhs) | ||||
|         setup_component(var, conf) | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_RDM6300' | ||||
|   | ||||
| @@ -4,20 +4,26 @@ import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml import pins | ||||
| from esphomeyaml.const import CONF_BUFFER_SIZE, CONF_DUMP, CONF_FILTER, CONF_ID, CONF_IDLE, \ | ||||
|     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') | ||||
|  | ||||
| RemoteReceiverComponent = remote_ns.RemoteReceiverComponent | ||||
| RemoteControlComponentBase = remote_ns.class_('RemoteControlComponentBase') | ||||
| RemoteReceiverComponent = remote_ns.class_('RemoteReceiverComponent', | ||||
|                                            RemoteControlComponentBase, | ||||
|                                            Component) | ||||
|  | ||||
| RemoteReceiveDumper = remote_ns.class_('RemoteReceiveDumper') | ||||
|  | ||||
| DUMPERS = { | ||||
|     'lg': remote_ns.LGDumper, | ||||
|     'nec': remote_ns.NECDumper, | ||||
|     'panasonic': remote_ns.PanasonicDumper, | ||||
|     'raw': remote_ns.RawDumper, | ||||
|     'samsung': remote_ns.SamsungDumper, | ||||
|     'sony': remote_ns.SonyDumper, | ||||
|     'rc_switch': remote_ns.RCSwitchDumper, | ||||
|     'lg': remote_ns.class_('LGDumper', RemoteReceiveDumper), | ||||
|     'nec': remote_ns.class_('NECDumper', RemoteReceiveDumper), | ||||
|     'panasonic': remote_ns.class_('PanasonicDumper', RemoteReceiveDumper), | ||||
|     'raw': remote_ns.class_('RawDumper', RemoteReceiveDumper), | ||||
|     'samsung': remote_ns.class_('SamsungDumper', RemoteReceiveDumper), | ||||
|     'sony': remote_ns.class_('SonyDumper', RemoteReceiveDumper), | ||||
|     '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_FILTER): cv.positive_time_period_microseconds, | ||||
|     vol.Optional(CONF_IDLE): cv.positive_time_period_microseconds, | ||||
| })]) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema)]) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     for conf in config: | ||||
|         pin = None | ||||
|         for pin in gpio_input_pin_expression(conf[CONF_PIN]): | ||||
|             yield | ||||
|         rhs = App.make_remote_receiver_component(pin) | ||||
|         receiver = Pvariable(conf[CONF_ID], rhs) | ||||
|  | ||||
|         for dumper in conf[CONF_DUMP]: | ||||
|             add(receiver.add_dumper(DUMPERS[dumper].new())) | ||||
|         if CONF_TOLERANCE in conf: | ||||
| @@ -60,5 +66,7 @@ def to_code(config): | ||||
|         if CONF_IDLE in conf: | ||||
|             add(receiver.set_idle_us(conf[CONF_IDLE])) | ||||
|  | ||||
|         setup_component(receiver, conf) | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_REMOTE_RECEIVER' | ||||
|   | ||||
| @@ -1,17 +1,18 @@ | ||||
| import voluptuous as vol | ||||
|  | ||||
| import esphomeyaml.config_validation as cv | ||||
| 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, \ | ||||
|     CONF_DEVICE, CONF_FAMILY, CONF_GROUP, CONF_ID, CONF_INVERTED, CONF_ONE, CONF_PIN, \ | ||||
|     CONF_PROTOCOL, CONF_PULSE_LENGTH, CONF_STATE, CONF_SYNC, CONF_ZERO | ||||
| from esphomeyaml.core import HexInt | ||||
| from esphomeyaml.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.RemoteTransmitterComponent | ||||
| RCSwitchProtocol = remote_ns.RCSwitchProtocol | ||||
| RemoteTransmitterComponent = remote_ns.class_('RemoteTransmitterComponent', | ||||
|                                               RemoteControlComponentBase, Component) | ||||
| RCSwitchProtocol = remote_ns.class_('RCSwitchProtocol') | ||||
| 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.Optional(CONF_CARRIER_DUTY_PERCENT): vol.All(cv.percentage_int, | ||||
|                                                      vol.Range(min=1, max=100)), | ||||
| })]) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema)]) | ||||
|  | ||||
|  | ||||
| def build_rc_switch_protocol(config): | ||||
| @@ -104,13 +105,15 @@ def binary_code(value): | ||||
|  | ||||
| def to_code(config): | ||||
|     for conf in config: | ||||
|         pin = None | ||||
|         for pin in gpio_output_pin_expression(conf[CONF_PIN]): | ||||
|             yield | ||||
|         rhs = App.make_remote_transmitter_component(pin) | ||||
|         transmitter = Pvariable(conf[CONF_ID], rhs) | ||||
|  | ||||
|         if CONF_CARRIER_DUTY_PERCENT in conf: | ||||
|             add(transmitter.set_carrier_duty_percent(conf[CONF_CARRIER_DUTY_PERCENT])) | ||||
|  | ||||
|         setup_component(transmitter, conf) | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_REMOTE_TRANSMITTER' | ||||
|   | ||||
| @@ -4,10 +4,11 @@ from esphomeyaml import automation | ||||
| from esphomeyaml.automation import ACTION_REGISTRY, maybe_simple_id | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.const import CONF_ID | ||||
| from esphomeyaml.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 | ||||
| ScriptExecuteAction = esphomelib_ns.ScriptExecuteAction | ||||
| Script = esphomelib_ns.class_('Script', Trigger.template(NoArg)) | ||||
| ScriptExecuteAction = esphomelib_ns.class_('ScriptExecuteAction', Action) | ||||
|  | ||||
| CONFIG_SCHEMA = automation.validate_automation({ | ||||
|     vol.Required(CONF_ID): cv.declare_variable_id(Script), | ||||
|   | ||||
| @@ -1,15 +1,18 @@ | ||||
| import voluptuous as vol | ||||
|  | ||||
| import esphomeyaml.config_validation as cv | ||||
| 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, \ | ||||
|     CONF_DEBOUNCE, CONF_DELTA, CONF_EXPIRE_AFTER, CONF_EXPONENTIAL_MOVING_AVERAGE, CONF_FILTERS, \ | ||||
|     CONF_FILTER_NAN, CONF_FILTER_OUT, CONF_HEARTBEAT, CONF_ICON, CONF_ID, CONF_INTERNAL, \ | ||||
|     CONF_LAMBDA, CONF_MQTT_ID, CONF_MULTIPLY, CONF_OFFSET, CONF_ON_RAW_VALUE, CONF_ON_VALUE, \ | ||||
|     CONF_ON_VALUE_RANGE, CONF_OR, CONF_SEND_EVERY, CONF_SLIDING_WINDOW_MOVING_AVERAGE, \ | ||||
|     CONF_THROTTLE, CONF_TRIGGER_ID, CONF_UNIQUE, CONF_UNIT_OF_MEASUREMENT, CONF_WINDOW_SIZE | ||||
| from esphomeyaml.helpers import App, ArrayInitializer, Pvariable, add, add_job, esphomelib_ns, \ | ||||
|     float_, process_lambda, setup_mqtt_component, templatable | ||||
|     CONF_ON_VALUE_RANGE, CONF_OR, CONF_SEND_EVERY, CONF_SEND_FIRST_AT, \ | ||||
|     CONF_SLIDING_WINDOW_MOVING_AVERAGE, CONF_THROTTLE, CONF_TRIGGER_ID, CONF_UNIQUE, \ | ||||
|     CONF_UNIT_OF_MEASUREMENT, CONF_WINDOW_SIZE | ||||
| from esphomeyaml.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({ | ||||
|  | ||||
| @@ -20,6 +23,15 @@ def validate_recursive_filter(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, | ||||
|                CONF_SLIDING_WINDOW_MOVING_AVERAGE, CONF_EXPONENTIAL_MOVING_AVERAGE, CONF_LAMBDA, | ||||
|                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_FILTER_OUT): vol.Coerce(float), | ||||
|     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_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.Required(CONF_ALPHA): cv.positive_float, | ||||
|         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, | ||||
| }, cv.has_exactly_one_key(*FILTER_KEYS))]) | ||||
|  | ||||
| # pylint: disable=invalid-name | ||||
| # Base | ||||
| sensor_ns = esphomelib_ns.namespace('sensor') | ||||
| Sensor = sensor_ns.Sensor | ||||
| MQTTSensorComponent = sensor_ns.MQTTSensorComponent | ||||
| 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 | ||||
| Sensor = sensor_ns.class_('Sensor', Nameable) | ||||
| MQTTSensorComponent = sensor_ns.class_('MQTTSensorComponent', mqtt.MQTTComponent) | ||||
|  | ||||
| SensorStateTrigger = sensor_ns.SensorStateTrigger | ||||
| SensorRawStateTrigger = sensor_ns.SensorRawStateTrigger | ||||
| ValueRangeTrigger = sensor_ns.ValueRangeTrigger | ||||
| PollingSensorComponent = sensor_ns.class_('PollingSensorComponent', PollingComponent, Sensor) | ||||
| EmptySensor = sensor_ns.class_('EmptySensor', Sensor) | ||||
| 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({ | ||||
|     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_ICON): cv.icon, | ||||
|     vol.Optional(CONF_ACCURACY_DECIMALS): vol.Coerce(int), | ||||
| @@ -103,7 +123,8 @@ def setup_filter(config): | ||||
|         yield FilterOutNANFilter.new() | ||||
|     elif CONF_SLIDING_WINDOW_MOVING_AVERAGE in config: | ||||
|         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: | ||||
|         conf = config[CONF_EXPONENTIAL_MOVING_AVERAGE] | ||||
|         yield ExponentialMovingAverageFilter.new(conf[CONF_ALPHA], conf[CONF_SEND_EVERY]) | ||||
| @@ -199,3 +220,18 @@ def register_sensor(var, config): | ||||
|  | ||||
|  | ||||
| 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.const import CONF_ATTENUATION, CONF_MAKE_ID, CONF_NAME, CONF_PIN, \ | ||||
|     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 = { | ||||
|     '0db': global_ns.ADC_0db, | ||||
| @@ -22,14 +22,16 @@ def validate_adc_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({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(ADCSensorComponent), | ||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeADCSensor), | ||||
|     vol.Required(CONF_PIN): validate_adc_pin, | ||||
|     vol.Optional(CONF_ATTENUATION): vol.All(cv.only_on_esp32, cv.one_of(*ATTENUATION_MODES)), | ||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, | ||||
| })) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema)) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
| @@ -42,7 +44,8 @@ def to_code(config): | ||||
|     adc = make.Padc | ||||
|     if CONF_ATTENUATION in config: | ||||
|         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' | ||||
| @@ -52,3 +55,7 @@ def required_build_flags(config): | ||||
|     if config[CONF_PIN] == 'VCC': | ||||
|         return '-DUSE_ADC_SENSOR_VCC' | ||||
|     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'] | ||||
|  | ||||
| ADS1115Multiplexer = sensor.sensor_ns.enum('ADS1115Multiplexer') | ||||
| MUX = { | ||||
|     'A0_A1': sensor.sensor_ns.ADS1115_MULTIPLEXER_P0_N1, | ||||
|     'A0_A3': sensor.sensor_ns.ADS1115_MULTIPLEXER_P0_N3, | ||||
|     'A1_A3': sensor.sensor_ns.ADS1115_MULTIPLEXER_P1_N3, | ||||
|     'A2_A3': sensor.sensor_ns.ADS1115_MULTIPLEXER_P2_N3, | ||||
|     'A0_GND': sensor.sensor_ns.ADS1115_MULTIPLEXER_P0_NG, | ||||
|     'A1_GND': sensor.sensor_ns.ADS1115_MULTIPLEXER_P1_NG, | ||||
|     'A2_GND': sensor.sensor_ns.ADS1115_MULTIPLEXER_P2_NG, | ||||
|     'A3_GND': sensor.sensor_ns.ADS1115_MULTIPLEXER_P3_NG, | ||||
|     'A0_A1': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P0_N1, | ||||
|     'A0_A3': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P0_N3, | ||||
|     'A1_A3': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P1_N3, | ||||
|     'A2_A3': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P2_N3, | ||||
|     'A0_GND': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P0_NG, | ||||
|     'A1_GND': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P1_NG, | ||||
|     'A2_GND': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P2_NG, | ||||
|     'A3_GND': ADS1115Multiplexer.ADS1115_MULTIPLEXER_P3_NG, | ||||
| } | ||||
|  | ||||
| ADS1115Gain = sensor.sensor_ns.enum('ADS1115Gain') | ||||
| GAIN = { | ||||
|     '6.144': sensor.sensor_ns.ADS1115_GAIN_6P144, | ||||
|     '4.096': sensor.sensor_ns.ADS1115_GAIN_6P096, | ||||
|     '2.048': sensor.sensor_ns.ADS1115_GAIN_2P048, | ||||
|     '1.024': sensor.sensor_ns.ADS1115_GAIN_1P024, | ||||
|     '0.512': sensor.sensor_ns.ADS1115_GAIN_0P512, | ||||
|     '0.256': sensor.sensor_ns.ADS1115_GAIN_0P256, | ||||
|     '6.144': ADS1115Gain.ADS1115_GAIN_6P144, | ||||
|     '4.096': ADS1115Gain.ADS1115_GAIN_6P096, | ||||
|     '2.048': ADS1115Gain.ADS1115_GAIN_2P048, | ||||
|     '1.024': ADS1115Gain.ADS1115_GAIN_1P024, | ||||
|     '0.512': ADS1115Gain.ADS1115_GAIN_0P512, | ||||
|     '0.256': ADS1115Gain.ADS1115_GAIN_0P256, | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -45,7 +47,10 @@ def validate_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({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(ADS1115Sensor), | ||||
|     vol.Required(CONF_MULTIPLEXER): validate_mux, | ||||
|     vol.Required(CONF_GAIN): validate_gain, | ||||
|     cv.GenerateID(CONF_ADS1115_ID): cv.use_variable_id(ADS1115Component), | ||||
| @@ -65,3 +70,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| 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 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, \ | ||||
|     CONF_UPDATE_INTERVAL | ||||
| from esphomeyaml.helpers import App, Application, add, variable | ||||
| from esphomeyaml.helpers import App, Application, add, variable, setup_component | ||||
|  | ||||
| DEPENDENCIES = ['i2c'] | ||||
|  | ||||
| BH1750Resolution = sensor.sensor_ns.enum('BH1750Resolution') | ||||
| BH1750_RESOLUTIONS = { | ||||
|     4.0: sensor.sensor_ns.BH1750_RESOLUTION_4P0_LX, | ||||
|     1.0: sensor.sensor_ns.BH1750_RESOLUTION_1P0_LX, | ||||
|     0.5: sensor.sensor_ns.BH1750_RESOLUTION_0P5_LX, | ||||
|     4.0: BH1750Resolution.BH1750_RESOLUTION_4P0_LX, | ||||
|     1.0: BH1750Resolution.BH1750_RESOLUTION_1P0_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({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(BH1750Sensor), | ||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBH1750Sensor), | ||||
|     vol.Optional(CONF_ADDRESS, default=0x23): cv.i2c_address, | ||||
|     vol.Optional(CONF_RESOLUTION): vol.All(cv.positive_float, cv.one_of(*BH1750_RESOLUTIONS)), | ||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, | ||||
| })) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema)) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
| @@ -32,6 +36,11 @@ def to_code(config): | ||||
|     if CONF_RESOLUTION in config: | ||||
|         add(bh1750.set_resolution(BH1750_RESOLUTIONS[config[CONF_RESOLUTION]])) | ||||
|     sensor.setup_sensor(bh1750, make_bh1750.Pmqtt, config) | ||||
|     setup_component(bh1750, config) | ||||
|  | ||||
|  | ||||
| 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, \ | ||||
|     make_address_array | ||||
| 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'] | ||||
|  | ||||
| ESP32BLERSSISensor = esphomelib_ns.class_('ESP32BLERSSISensor', sensor.Sensor) | ||||
|  | ||||
| PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(ESP32BLERSSISensor), | ||||
|     vol.Required(CONF_MAC_ADDRESS): cv.mac_address, | ||||
|     cv.GenerateID(CONF_ESP32_BLE_ID): cv.use_variable_id(ESP32BLETracker) | ||||
| })) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     hub = None | ||||
|     for hub in get_variable(config[CONF_ESP32_BLE_ID]): | ||||
|         yield | ||||
|     rhs = hub.make_rssi_sensor(config[CONF_NAME], make_address_array(config[CONF_MAC_ADDRESS])) | ||||
|     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.const import CONF_ADDRESS, CONF_HUMIDITY, CONF_IIR_FILTER, CONF_MAKE_ID, \ | ||||
|     CONF_NAME, CONF_OVERSAMPLING, CONF_PRESSURE, CONF_TEMPERATURE, CONF_UPDATE_INTERVAL | ||||
| from esphomeyaml.helpers import App, Application, add, variable | ||||
| from esphomeyaml.helpers import App, Application, add, variable, setup_component | ||||
|  | ||||
| DEPENDENCIES = ['i2c'] | ||||
|  | ||||
| BME280Oversampling = sensor.sensor_ns.enum('BME280Oversampling') | ||||
| OVERSAMPLING_OPTIONS = { | ||||
|     'NONE': sensor.sensor_ns.BME280_OVERSAMPLING_NONE, | ||||
|     '1X': sensor.sensor_ns.BME280_OVERSAMPLING_1X, | ||||
|     '2X': sensor.sensor_ns.BME280_OVERSAMPLING_2X, | ||||
|     '4X': sensor.sensor_ns.BME280_OVERSAMPLING_4X, | ||||
|     '8X': sensor.sensor_ns.BME280_OVERSAMPLING_8X, | ||||
|     '16X': sensor.sensor_ns.BME280_OVERSAMPLING_16X, | ||||
|     'NONE': BME280Oversampling.BME280_OVERSAMPLING_NONE, | ||||
|     '1X': BME280Oversampling.BME280_OVERSAMPLING_1X, | ||||
|     '2X': BME280Oversampling.BME280_OVERSAMPLING_2X, | ||||
|     '4X': BME280Oversampling.BME280_OVERSAMPLING_4X, | ||||
|     '8X': BME280Oversampling.BME280_OVERSAMPLING_8X, | ||||
|     '16X': BME280Oversampling.BME280_OVERSAMPLING_16X, | ||||
| } | ||||
|  | ||||
| BME280IIRFilter = sensor.sensor_ns.enum('BME280IIRFilter') | ||||
| IIR_FILTER_OPTIONS = { | ||||
|     'OFF': sensor.sensor_ns.BME280_IIR_FILTER_OFF, | ||||
|     '2X': sensor.sensor_ns.BME280_IIR_FILTER_2X, | ||||
|     '4X': sensor.sensor_ns.BME280_IIR_FILTER_4X, | ||||
|     '8X': sensor.sensor_ns.BME280_IIR_FILTER_8X, | ||||
|     '16X': sensor.sensor_ns.BME280_IIR_FILTER_16X, | ||||
|     'OFF': BME280IIRFilter.BME280_IIR_FILTER_OFF, | ||||
|     '2X': BME280IIRFilter.BME280_IIR_FILTER_2X, | ||||
|     '4X': BME280IIRFilter.BME280_IIR_FILTER_4X, | ||||
|     '8X': BME280IIRFilter.BME280_IIR_FILTER_8X, | ||||
|     '16X': BME280IIRFilter.BME280_IIR_FILTER_16X, | ||||
| } | ||||
|  | ||||
| BME280_OVERSAMPLING_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({ | ||||
|     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({ | ||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBME280Sensor), | ||||
|     vol.Optional(CONF_ADDRESS, default=0x77): cv.i2c_address, | ||||
|     vol.Required(CONF_TEMPERATURE): cv.nameable(BME280_OVERSAMPLING_SENSOR_SCHEMA), | ||||
|     vol.Required(CONF_PRESSURE): cv.nameable(BME280_OVERSAMPLING_SENSOR_SCHEMA), | ||||
|     vol.Required(CONF_HUMIDITY): cv.nameable(BME280_OVERSAMPLING_SENSOR_SCHEMA), | ||||
|     vol.Required(CONF_TEMPERATURE): cv.nameable(BME280_OVERSAMPLING_SENSOR_SCHEMA.extend({ | ||||
|         cv.GenerateID(): cv.declare_variable_id(BME280TemperatureSensor), | ||||
|     })), | ||||
|     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_UPDATE_INTERVAL): cv.update_interval, | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
| @@ -69,6 +83,13 @@ def to_code(config): | ||||
|                         config[CONF_PRESSURE]) | ||||
|     sensor.setup_sensor(bme280.Pget_humidity_sensor(), make.Pmqtt_humidity, | ||||
|                         config[CONF_HUMIDITY]) | ||||
|     setup_component(bme280, config) | ||||
|  | ||||
|  | ||||
| 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, \ | ||||
|     CONF_MAKE_ID, CONF_NAME, CONF_OVERSAMPLING, CONF_PRESSURE, CONF_TEMPERATURE, \ | ||||
|     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'] | ||||
|  | ||||
| BME680Oversampling = sensor.sensor_ns.enum('BME680Oversampling') | ||||
| OVERSAMPLING_OPTIONS = { | ||||
|     'NONE': sensor.sensor_ns.BME680_OVERSAMPLING_NONE, | ||||
|     '1X': sensor.sensor_ns.BME680_OVERSAMPLING_1X, | ||||
|     '2X': sensor.sensor_ns.BME680_OVERSAMPLING_2X, | ||||
|     '4X': sensor.sensor_ns.BME680_OVERSAMPLING_4X, | ||||
|     '8X': sensor.sensor_ns.BME680_OVERSAMPLING_8X, | ||||
|     '16X': sensor.sensor_ns.BME680_OVERSAMPLING_16X, | ||||
|     'NONE': BME680Oversampling.BME680_OVERSAMPLING_NONE, | ||||
|     '1X': BME680Oversampling.BME680_OVERSAMPLING_1X, | ||||
|     '2X': BME680Oversampling.BME680_OVERSAMPLING_2X, | ||||
|     '4X': BME680Oversampling.BME680_OVERSAMPLING_4X, | ||||
|     '8X': BME680Oversampling.BME680_OVERSAMPLING_8X, | ||||
|     '16X': BME680Oversampling.BME680_OVERSAMPLING_16X, | ||||
| } | ||||
|  | ||||
| BME680IIRFilter = sensor.sensor_ns.enum('BME680IIRFilter') | ||||
| IIR_FILTER_OPTIONS = { | ||||
|     'OFF': sensor.sensor_ns.BME680_IIR_FILTER_OFF, | ||||
|     '1X': sensor.sensor_ns.BME680_IIR_FILTER_1X, | ||||
|     '3X': sensor.sensor_ns.BME680_IIR_FILTER_3X, | ||||
|     '7X': sensor.sensor_ns.BME680_IIR_FILTER_7X, | ||||
|     '15X': sensor.sensor_ns.BME680_IIR_FILTER_15X, | ||||
|     '31X': sensor.sensor_ns.BME680_IIR_FILTER_31X, | ||||
|     '63X': sensor.sensor_ns.BME680_IIR_FILTER_63X, | ||||
|     '127X': sensor.sensor_ns.BME680_IIR_FILTER_127X, | ||||
|     'OFF': BME680IIRFilter.BME680_IIR_FILTER_OFF, | ||||
|     '1X': BME680IIRFilter.BME680_IIR_FILTER_1X, | ||||
|     '3X': BME680IIRFilter.BME680_IIR_FILTER_3X, | ||||
|     '7X': BME680IIRFilter.BME680_IIR_FILTER_7X, | ||||
|     '15X': BME680IIRFilter.BME680_IIR_FILTER_15X, | ||||
|     '31X': BME680IIRFilter.BME680_IIR_FILTER_31X, | ||||
|     '63X': BME680IIRFilter.BME680_IIR_FILTER_63X, | ||||
|     '127X': BME680IIRFilter.BME680_IIR_FILTER_127X, | ||||
| } | ||||
|  | ||||
| BME680_OVERSAMPLING_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({ | ||||
|     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({ | ||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBME680Sensor), | ||||
|     vol.Optional(CONF_ADDRESS, default=0x76): cv.i2c_address, | ||||
|     vol.Required(CONF_TEMPERATURE): cv.nameable(BME680_OVERSAMPLING_SENSOR_SCHEMA), | ||||
|     vol.Required(CONF_PRESSURE): cv.nameable(BME680_OVERSAMPLING_SENSOR_SCHEMA), | ||||
|     vol.Required(CONF_HUMIDITY): cv.nameable(BME680_OVERSAMPLING_SENSOR_SCHEMA), | ||||
|     vol.Required(CONF_GAS_RESISTANCE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     vol.Required(CONF_TEMPERATURE): cv.nameable(BME680_OVERSAMPLING_SENSOR_SCHEMA.extend({ | ||||
|         cv.GenerateID(): cv.declare_variable_id(BME680TemperatureSensor), | ||||
|     })), | ||||
|     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_HEATER): vol.Any(None, vol.All(vol.Schema({ | ||||
|         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.has_at_least_one_key(CONF_TEMPERATURE, CONF_DURATION)))), | ||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
| @@ -89,6 +107,14 @@ def to_code(config): | ||||
|                         config[CONF_HUMIDITY]) | ||||
|     sensor.setup_sensor(bme680.Pget_gas_resistance_sensor(), make.Pmqtt_gas_resistance, | ||||
|                         config[CONF_GAS_RESISTANCE]) | ||||
|     setup_component(bme680, config) | ||||
|  | ||||
|  | ||||
| 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.const import CONF_ADDRESS, CONF_MAKE_ID, CONF_NAME, CONF_PRESSURE, \ | ||||
|     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'] | ||||
|  | ||||
| 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({ | ||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBMP085Sensor), | ||||
|     vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     vol.Required(CONF_PRESSURE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ | ||||
|         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_UPDATE_INTERVAL): cv.update_interval, | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
| @@ -31,6 +39,12 @@ def to_code(config): | ||||
|                         config[CONF_TEMPERATURE]) | ||||
|     sensor.setup_sensor(bmp.Pbmp.Pget_pressure_sensor(), bmp.Pmqtt_pressure, | ||||
|                         config[CONF_PRESSURE]) | ||||
|     setup_component(bmp.Pbmp, config) | ||||
|  | ||||
|  | ||||
| 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.const import CONF_ADDRESS, CONF_IIR_FILTER, CONF_MAKE_ID, \ | ||||
|     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'] | ||||
|  | ||||
| BMP280Oversampling = sensor.sensor_ns.enum('BMP280Oversampling') | ||||
| OVERSAMPLING_OPTIONS = { | ||||
|     'NONE': sensor.sensor_ns.BMP280_OVERSAMPLING_NONE, | ||||
|     '1X': sensor.sensor_ns.BMP280_OVERSAMPLING_1X, | ||||
|     '2X': sensor.sensor_ns.BMP280_OVERSAMPLING_2X, | ||||
|     '4X': sensor.sensor_ns.BMP280_OVERSAMPLING_4X, | ||||
|     '8X': sensor.sensor_ns.BMP280_OVERSAMPLING_8X, | ||||
|     '16X': sensor.sensor_ns.BMP280_OVERSAMPLING_16X, | ||||
|     'NONE': BMP280Oversampling.BMP280_OVERSAMPLING_NONE, | ||||
|     '1X': BMP280Oversampling.BMP280_OVERSAMPLING_1X, | ||||
|     '2X': BMP280Oversampling.BMP280_OVERSAMPLING_2X, | ||||
|     '4X': BMP280Oversampling.BMP280_OVERSAMPLING_4X, | ||||
|     '8X': BMP280Oversampling.BMP280_OVERSAMPLING_8X, | ||||
|     '16X': BMP280Oversampling.BMP280_OVERSAMPLING_16X, | ||||
| } | ||||
|  | ||||
| BMP280IIRFilter = sensor.sensor_ns.enum('BMP280IIRFilter') | ||||
| IIR_FILTER_OPTIONS = { | ||||
|     'OFF': sensor.sensor_ns.BMP280_IIR_FILTER_OFF, | ||||
|     '2X': sensor.sensor_ns.BMP280_IIR_FILTER_2X, | ||||
|     '4X': sensor.sensor_ns.BMP280_IIR_FILTER_4X, | ||||
|     '8X': sensor.sensor_ns.BMP280_IIR_FILTER_8X, | ||||
|     '16X': sensor.sensor_ns.BMP280_IIR_FILTER_16X, | ||||
|     'OFF': BMP280IIRFilter.BMP280_IIR_FILTER_OFF, | ||||
|     '2X': BMP280IIRFilter.BMP280_IIR_FILTER_2X, | ||||
|     '4X': BMP280IIRFilter.BMP280_IIR_FILTER_4X, | ||||
|     '8X': BMP280IIRFilter.BMP280_IIR_FILTER_8X, | ||||
|     '16X': BMP280IIRFilter.BMP280_IIR_FILTER_16X, | ||||
| } | ||||
|  | ||||
| BMP280_OVERSAMPLING_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({ | ||||
|     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({ | ||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBMP280Sensor), | ||||
|     vol.Optional(CONF_ADDRESS, default=0x77): cv.i2c_address, | ||||
|     vol.Required(CONF_TEMPERATURE): cv.nameable(BMP280_OVERSAMPLING_SENSOR_SCHEMA), | ||||
|     vol.Required(CONF_PRESSURE): cv.nameable(BMP280_OVERSAMPLING_SENSOR_SCHEMA), | ||||
|     vol.Required(CONF_TEMPERATURE): cv.nameable(BMP280_OVERSAMPLING_SENSOR_SCHEMA.extend({ | ||||
|         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_UPDATE_INTERVAL): cv.update_interval, | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
| @@ -62,6 +72,12 @@ def to_code(config): | ||||
|                         config[CONF_TEMPERATURE]) | ||||
|     sensor.setup_sensor(bmp280.Pget_pressure_sensor(), make.Pmqtt_pressure, | ||||
|                         config[CONF_PRESSURE]) | ||||
|     setup_component(bmp280, config) | ||||
|  | ||||
|  | ||||
| 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 | ||||
|  | ||||
| from esphomeyaml.components import sensor | ||||
| from esphomeyaml.components import sensor, uart | ||||
| from esphomeyaml.components.uart import UARTComponent | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.const import CONF_CURRENT, CONF_ID, CONF_NAME, CONF_POWER, CONF_UART_ID, \ | ||||
|     CONF_VOLTAGE | ||||
| from esphomeyaml.helpers import App, Pvariable, get_variable | ||||
| from esphomeyaml.helpers import App, Pvariable, get_variable, setup_component, Component | ||||
|  | ||||
| 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({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(CSE7766Component), | ||||
|     cv.GenerateID(CONF_UART_ID): cv.use_variable_id(UARTComponent), | ||||
|  | ||||
|     vol.Optional(CONF_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     vol.Optional(CONF_CURRENT): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     vol.Optional(CONF_POWER): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
| }), cv.has_at_least_one_key(CONF_VOLTAGE, CONF_CURRENT, CONF_POWER)) | ||||
|     vol.Optional(CONF_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ | ||||
|         cv.GenerateID(): cv.declare_variable_id(CSE7766VoltageSensor), | ||||
|     })), | ||||
|     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): | ||||
|     for uart in get_variable(config[CONF_UART_ID]): | ||||
|     for uart_ in get_variable(config[CONF_UART_ID]): | ||||
|         yield | ||||
|  | ||||
|     rhs = App.make_cse7766(uart) | ||||
|     rhs = App.make_cse7766(uart_) | ||||
|     cse = Pvariable(config[CONF_ID], rhs) | ||||
|  | ||||
|     if CONF_VOLTAGE in config: | ||||
| @@ -37,6 +50,15 @@ def to_code(config): | ||||
|     if CONF_POWER in config: | ||||
|         conf = config[CONF_POWER] | ||||
|         sensor.register_sensor(cse.make_power_sensor(conf[CONF_NAME]), conf) | ||||
|     setup_component(cse, config) | ||||
|  | ||||
|  | ||||
| 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 | ||||
| from esphomeyaml.helpers import HexIntLiteral, get_variable | ||||
|  | ||||
| DallasTemperatureSensor = sensor.sensor_ns.class_('DallasTemperatureSensor', | ||||
|                                                   sensor.EmptyPollingParentSensor) | ||||
|  | ||||
| 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_INDEX, 'dallas'): cv.positive_int, | ||||
|     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): | ||||
|     hub = None | ||||
|     for hub in get_variable(config[CONF_DALLAS_ID]): | ||||
|         yield | ||||
|     if CONF_ADDRESS in config: | ||||
| @@ -29,3 +32,7 @@ def to_code(config): | ||||
|  | ||||
|  | ||||
| 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 | ||||
| from esphomeyaml.components import sensor | ||||
| from esphomeyaml.const import CONF_HUMIDITY, CONF_MAKE_ID, CONF_MODEL, CONF_NAME, CONF_PIN, \ | ||||
|     CONF_TEMPERATURE, CONF_UPDATE_INTERVAL | ||||
| from esphomeyaml.helpers import App, Application, add, gpio_output_pin_expression, variable | ||||
|     CONF_TEMPERATURE, CONF_UPDATE_INTERVAL, CONF_ID | ||||
| from esphomeyaml.helpers import App, Application, add, gpio_output_pin_expression, variable, \ | ||||
|     setup_component, PollingComponent, Pvariable | ||||
| from esphomeyaml.pins import gpio_output_pin_schema | ||||
|  | ||||
| DHTModel = sensor.sensor_ns.enum('DHTModel') | ||||
| DHT_MODELS = { | ||||
|     'AUTO_DETECT': sensor.sensor_ns.DHT_MODEL_AUTO_DETECT, | ||||
|     'DHT11': sensor.sensor_ns.DHT_MODEL_DHT11, | ||||
|     'DHT22': sensor.sensor_ns.DHT_MODEL_DHT22, | ||||
|     'AM2302': sensor.sensor_ns.DHT_MODEL_AM2302, | ||||
|     'RHT03': sensor.sensor_ns.DHT_MODEL_RHT03, | ||||
|     'AUTO_DETECT': DHTModel.DHT_MODEL_AUTO_DETECT, | ||||
|     'DHT11': DHTModel.DHT_MODEL_DHT11, | ||||
|     'DHT22': DHTModel.DHT_MODEL_DHT22, | ||||
|     'AM2302': DHTModel.DHT_MODEL_AM2302, | ||||
|     '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({ | ||||
|     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_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     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(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_UPDATE_INTERVAL): cv.update_interval, | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     pin = None | ||||
|     for pin in gpio_output_pin_expression(config[CONF_PIN]): | ||||
|         yield | ||||
|     rhs = App.make_dht_sensor(config[CONF_TEMPERATURE][CONF_NAME], | ||||
|                               config[CONF_HUMIDITY][CONF_NAME], | ||||
|                               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: | ||||
|         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(), | ||||
|                         dht.Pmqtt_temperature, config[CONF_TEMPERATURE]) | ||||
|     sensor.setup_sensor(dht.Pdht.Pget_humidity_sensor(), | ||||
|                         dht.Pmqtt_humidity, config[CONF_HUMIDITY]) | ||||
|     sensor.setup_sensor(dht.Pget_temperature_sensor(), | ||||
|                         make.Pmqtt_temperature, config[CONF_TEMPERATURE]) | ||||
|     sensor.setup_sensor(dht.Pget_humidity_sensor(), | ||||
|                         make.Pmqtt_humidity, config[CONF_HUMIDITY]) | ||||
|     setup_component(dht, config) | ||||
|  | ||||
|  | ||||
| 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 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, \ | ||||
|     CONF_UPDATE_INTERVAL | ||||
| from esphomeyaml.helpers import App, Application, variable | ||||
|     CONF_UPDATE_INTERVAL, CONF_ID | ||||
| from esphomeyaml.helpers import App, Application, variable, setup_component, PollingComponent, \ | ||||
|     Pvariable | ||||
|  | ||||
| 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({ | ||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeDHT12Sensor), | ||||
|     vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     cv.GenerateID(): cv.declare_variable_id(DHT12Component), | ||||
|     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, | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     rhs = App.make_dht12_sensor(config[CONF_TEMPERATURE][CONF_NAME], | ||||
|                                 config[CONF_HUMIDITY][CONF_NAME], | ||||
|                                 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]) | ||||
|     sensor.setup_sensor(dht.Pdht12.Pget_humidity_sensor(), dht.Pmqtt_humidity, | ||||
|     sensor.setup_sensor(dht.Pget_humidity_sensor(), make.Pmqtt_humidity, | ||||
|                         config[CONF_HUMIDITY]) | ||||
|     setup_component(dht, config) | ||||
|  | ||||
|  | ||||
| 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.components import sensor | ||||
| 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({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(DutyCycleSensor), | ||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeDutyCycleSensor), | ||||
|     vol.Required(CONF_PIN): pins.internal_gpio_input_pin_schema, | ||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, | ||||
| })) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema)) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     pin = None | ||||
|     for pin in gpio_input_pin_expression(config[CONF_PIN]): | ||||
|         yield | ||||
|     rhs = App.make_duty_cycle_sensor(config[CONF_NAME], pin, | ||||
|                                      config.get(CONF_UPDATE_INTERVAL)) | ||||
|     make = variable(config[CONF_MAKE_ID], rhs) | ||||
|     sensor.setup_sensor(make.Pduty, make.Pmqtt, config) | ||||
|     setup_component(make.Pduty, config) | ||||
|  | ||||
|  | ||||
| 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 | ||||
| from esphomeyaml.components import sensor | ||||
| 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] | ||||
|  | ||||
| MakeESP32HallSensor = Application.MakeESP32HallSensor | ||||
| MakeESP32HallSensor = Application.struct('MakeESP32HallSensor') | ||||
| ESP32HallSensor = sensor.sensor_ns.class_('ESP32HallSensor', sensor.PollingSensorComponent) | ||||
|  | ||||
| PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(ESP32HallSensor), | ||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeESP32HallSensor), | ||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, | ||||
| })) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema)) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     rhs = App.make_esp32_hall_sensor(config[CONF_NAME], config.get(CONF_UPDATE_INTERVAL)) | ||||
|     make = variable(config[CONF_MAKE_ID], rhs) | ||||
|     sensor.setup_sensor(make.Phall, make.Pmqtt, config) | ||||
|     setup_component(make.Phall, config) | ||||
|  | ||||
|  | ||||
| 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 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, \ | ||||
|     CONF_UPDATE_INTERVAL | ||||
| from esphomeyaml.helpers import App, Application, variable | ||||
|     CONF_UPDATE_INTERVAL, CONF_ID | ||||
| from esphomeyaml.helpers import App, Application, variable, setup_component, PollingComponent, \ | ||||
|     Pvariable | ||||
|  | ||||
| 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({ | ||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHDC1080Sensor), | ||||
|     vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     cv.GenerateID(): cv.declare_variable_id(HDC1080Component), | ||||
|     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, | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     rhs = App.make_hdc1080_sensor(config[CONF_TEMPERATURE][CONF_NAME], | ||||
|                                   config[CONF_HUMIDITY][CONF_NAME], | ||||
|                                   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(), | ||||
|                         hdc1080.Pmqtt_temperature, | ||||
|     sensor.setup_sensor(hdc1080.Pget_temperature_sensor(), | ||||
|                         make.Pmqtt_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]) | ||||
|     setup_component(hdc1080, config) | ||||
|  | ||||
|  | ||||
| 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 esphomeyaml.config_validation as cv | ||||
| from esphomeyaml import pins | ||||
| from esphomeyaml.components import sensor | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.const import CONF_CF1_PIN, CONF_CF_PIN, CONF_CHANGE_MODE_EVERY, CONF_CURRENT, \ | ||||
|     CONF_CURRENT_RESISTOR, CONF_ID, CONF_NAME, CONF_POWER, CONF_SEL_PIN, CONF_UPDATE_INTERVAL, \ | ||||
|     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 | ||||
| HLW8012VoltageSensor = sensor.sensor_ns.HLW8012VoltageSensor | ||||
| HLW8012CurrentSensor = sensor.sensor_ns.HLW8012CurrentSensor | ||||
| HLW8012PowerSensor = sensor.sensor_ns.HLW8012PowerSensor | ||||
| HLW8012Component = sensor.sensor_ns.class_('HLW8012Component', PollingComponent) | ||||
| HLW8012VoltageSensor = sensor.sensor_ns.class_('HLW8012VoltageSensor', sensor.EmptySensor) | ||||
| HLW8012CurrentSensor = sensor.sensor_ns.class_('HLW8012CurrentSensor', sensor.EmptySensor) | ||||
| HLW8012PowerSensor = sensor.sensor_ns.class_('HLW8012PowerSensor', sensor.EmptyPollingParentSensor) | ||||
|  | ||||
| PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({ | ||||
|     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_CF1_PIN): pins.input_pin, | ||||
|  | ||||
|     vol.Optional(CONF_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     vol.Optional(CONF_CURRENT): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     vol.Optional(CONF_POWER): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     vol.Optional(CONF_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ | ||||
|         cv.GenerateID(): cv.declare_variable_id(HLW8012VoltageSensor), | ||||
|     })), | ||||
|     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_VOLTAGE_DIVIDER): cv.positive_float, | ||||
|     vol.Optional(CONF_CHANGE_MODE_EVERY): vol.All(cv.uint32_t, vol.Range(min=1)), | ||||
|     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): | ||||
|     sel = None | ||||
|     for sel in gpio_output_pin_expression(config[CONF_SEL_PIN]): | ||||
|         yield | ||||
|  | ||||
| @@ -50,8 +57,19 @@ def to_code(config): | ||||
|         sensor.register_sensor(hlw.make_power_sensor(conf[CONF_NAME]), conf) | ||||
|     if CONF_CURRENT_RESISTOR in config: | ||||
|         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: | ||||
|         add(hlw.set_change_mode_every(config[CONF_CHANGE_MODE_EVERY])) | ||||
|     setup_component(hlw, config) | ||||
|  | ||||
|  | ||||
| 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 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.helpers import App, Pvariable, add | ||||
| from esphomeyaml.helpers import App, Pvariable, add, setup_component, PollingComponent | ||||
|  | ||||
| DEPENDENCIES = ['i2c'] | ||||
|  | ||||
| @@ -13,19 +13,23 @@ CONF_FIELD_STRENGTH_Y = 'field_strength_y' | ||||
| CONF_FIELD_STRENGTH_Z = 'field_strength_z' | ||||
| CONF_HEADING = 'heading' | ||||
|  | ||||
| HMC5883LComponent = sensor.sensor_ns.HMC5883LComponent | ||||
| HMC5883LFieldStrengthSensor = sensor.sensor_ns.HMC5883LFieldStrengthSensor | ||||
| HMC5883LHeadingSensor = sensor.sensor_ns.HMC5883LHeadingSensor | ||||
| HMC5883LComponent = sensor.sensor_ns.class_('HMC5883LComponent', PollingComponent, i2c.I2CDevice) | ||||
| HMC5883LFieldStrengthSensor = sensor.sensor_ns.class_('HMC5883LFieldStrengthSensor', | ||||
|                                                       sensor.EmptyPollingParentSensor) | ||||
| HMC5883LHeadingSensor = sensor.sensor_ns.class_('HMC5883LHeadingSensor', | ||||
|                                                 sensor.EmptyPollingParentSensor) | ||||
|  | ||||
|  | ||||
| HMC5883LRange = sensor.sensor_ns.enum('HMC5883LRange') | ||||
| HMC5883L_RANGES = { | ||||
|     88: sensor.sensor_ns.HMC5883L_RANGE_88_UT, | ||||
|     130: sensor.sensor_ns.HMC5883L_RANGE_130_UT, | ||||
|     190: sensor.sensor_ns.HMC5883L_RANGE_190_UT, | ||||
|     250: sensor.sensor_ns.HMC5883L_RANGE_250_UT, | ||||
|     400: sensor.sensor_ns.HMC5883L_RANGE_400_UT, | ||||
|     470: sensor.sensor_ns.HMC5883L_RANGE_470_UT, | ||||
|     560: sensor.sensor_ns.HMC5883L_RANGE_560_UT, | ||||
|     810: sensor.sensor_ns.HMC5883L_RANGE_810_UT, | ||||
|     88: HMC5883LRange.HMC5883L_RANGE_88_UT, | ||||
|     130: HMC5883LRange.HMC5883L_RANGE_130_UT, | ||||
|     190: HMC5883LRange.HMC5883L_RANGE_190_UT, | ||||
|     250: HMC5883LRange.HMC5883L_RANGE_250_UT, | ||||
|     400: HMC5883LRange.HMC5883L_RANGE_400_UT, | ||||
|     470: HMC5883LRange.HMC5883L_RANGE_470_UT, | ||||
|     560: HMC5883LRange.HMC5883L_RANGE_560_UT, | ||||
|     810: HMC5883LRange.HMC5883L_RANGE_810_UT, | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -36,17 +40,27 @@ def validate_range(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({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(HMC5883LComponent), | ||||
|     vol.Optional(CONF_ADDRESS): cv.i2c_address, | ||||
|     vol.Optional(CONF_FIELD_STRENGTH_X): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     vol.Optional(CONF_FIELD_STRENGTH_Y): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     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_X): cv.nameable(sensor.SENSOR_SCHEMA.extend({ | ||||
|         cv.GenerateID(): cv.declare_variable_id(HMC5883LFieldStrengthSensor), | ||||
|     })), | ||||
|     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_RANGE): validate_range, | ||||
| }), cv.has_at_least_one_key(CONF_FIELD_STRENGTH_X, CONF_FIELD_STRENGTH_Y, CONF_FIELD_STRENGTH_Z, | ||||
|                             CONF_HEADING)) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_least_one_key(*SENSOR_KEYS)) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
| @@ -68,6 +82,15 @@ def to_code(config): | ||||
|     if CONF_HEADING in config: | ||||
|         conf = config[CONF_HEADING] | ||||
|         sensor.register_sensor(hmc.Pmake_heading_sensor(conf[CONF_NAME]), conf) | ||||
|     setup_component(hmc, config) | ||||
|  | ||||
|  | ||||
| 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 | ||||
|  | ||||
| from esphomeyaml.components import i2c, sensor | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.components import sensor | ||||
| from esphomeyaml.const import CONF_HUMIDITY, CONF_MAKE_ID, CONF_NAME, CONF_TEMPERATURE, \ | ||||
|     CONF_UPDATE_INTERVAL | ||||
| from esphomeyaml.helpers import App, Application, variable | ||||
|     CONF_UPDATE_INTERVAL, CONF_ID | ||||
| from esphomeyaml.helpers import App, Application, PollingComponent, setup_component, variable, \ | ||||
|     Pvariable | ||||
|  | ||||
| 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({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(HTU21DComponent), | ||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHTU21DSensor), | ||||
|     vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     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(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, | ||||
| }) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     rhs = App.make_htu21d_sensor(config[CONF_TEMPERATURE][CONF_NAME], | ||||
|                                  config[CONF_HUMIDITY][CONF_NAME], | ||||
|                                  config.get(CONF_UPDATE_INTERVAL)) | ||||
|     htu21d = variable(config[CONF_MAKE_ID], rhs) | ||||
|     sensor.setup_sensor(htu21d.Phtu21d.Pget_temperature_sensor(), htu21d.Pmqtt_temperature, | ||||
|     make = variable(config[CONF_MAKE_ID], rhs) | ||||
|     htu21d = make.Phtu21d | ||||
|     Pvariable(config[CONF_ID], htu21d) | ||||
|  | ||||
|     sensor.setup_sensor(htu21d.Pget_temperature_sensor(), make.Pmqtt_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]) | ||||
|     setup_component(htu21d, config) | ||||
|  | ||||
|  | ||||
| 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.components import sensor | ||||
| 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' | ||||
|  | ||||
| HX711Gain = sensor.sensor_ns.enum('HX711Gain') | ||||
| GAINS = { | ||||
|     128: sensor.sensor_ns.HX711_GAIN_128, | ||||
|     32: sensor.sensor_ns.HX711_GAIN_32, | ||||
|     64: sensor.sensor_ns.HX711_GAIN_64, | ||||
|     128: HX711Gain.HX711_GAIN_128, | ||||
|     32: HX711Gain.HX711_GAIN_32, | ||||
|     64: HX711Gain.HX711_GAIN_64, | ||||
| } | ||||
|  | ||||
| PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(HX711Sensor), | ||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHX711Sensor), | ||||
|     vol.Required(CONF_DOUT_PIN): pins.gpio_input_pin_schema, | ||||
|     vol.Required(CONF_CLK_PIN): pins.gpio_output_pin_schema, | ||||
|     vol.Optional(CONF_GAIN): vol.All(cv.int_, cv.one_of(*GAINS)), | ||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, | ||||
| })) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema)) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     dout_pin = None | ||||
|     for dout_pin in gpio_input_pin_expression(config[CONF_DOUT_PIN]): | ||||
|         yield | ||||
|     sck_pin = None | ||||
|     for sck_pin in gpio_input_pin_expression(config[CONF_CLK_PIN]): | ||||
|         yield | ||||
|  | ||||
|     rhs = App.make_hx711_sensor(config[CONF_NAME], dout_pin, sck_pin, | ||||
|                                 config.get(CONF_UPDATE_INTERVAL)) | ||||
|     make = variable(config[CONF_MAKE_ID], rhs) | ||||
|     hx711 = make.Phx711 | ||||
|  | ||||
|     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' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return sensor.core_to_hass_config(data, config) | ||||
|   | ||||
| @@ -1,34 +1,46 @@ | ||||
| # coding=utf-8 | ||||
| import voluptuous as vol | ||||
|  | ||||
| from esphomeyaml.components import i2c, sensor | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.components import sensor | ||||
| from esphomeyaml.const import CONF_ADDRESS, CONF_CURRENT, CONF_ID, CONF_MAX_CURRENT, \ | ||||
|     CONF_MAX_VOLTAGE, CONF_NAME, CONF_POWER, CONF_UPDATE_INTERVAL, CONF_BUS_VOLTAGE, \ | ||||
|     CONF_SHUNT_VOLTAGE, CONF_SHUNT_RESISTANCE | ||||
| from esphomeyaml.helpers import App, Pvariable | ||||
| from esphomeyaml.const import CONF_ADDRESS, CONF_BUS_VOLTAGE, CONF_CURRENT, CONF_ID, \ | ||||
|     CONF_MAX_CURRENT, CONF_MAX_VOLTAGE, CONF_NAME, CONF_POWER, CONF_SHUNT_RESISTANCE, \ | ||||
|     CONF_SHUNT_VOLTAGE, CONF_UPDATE_INTERVAL | ||||
| from esphomeyaml.helpers import App, PollingComponent, Pvariable, setup_component | ||||
|  | ||||
| DEPENDENCIES = ['i2c'] | ||||
|  | ||||
| INA219Component = sensor.sensor_ns.INA219Component | ||||
| INA219VoltageSensor = sensor.sensor_ns.INA219VoltageSensor | ||||
| INA219CurrentSensor = sensor.sensor_ns.INA219CurrentSensor | ||||
| INA219PowerSensor = sensor.sensor_ns.INA219PowerSensor | ||||
| INA219Component = sensor.sensor_ns.class_('INA219Component', PollingComponent, i2c.I2CDevice) | ||||
| INA219VoltageSensor = sensor.sensor_ns.class_('INA219VoltageSensor', | ||||
|                                               sensor.EmptyPollingParentSensor) | ||||
| 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({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(INA219Component), | ||||
|     vol.Optional(CONF_ADDRESS, default=0x40): cv.i2c_address, | ||||
|     vol.Optional(CONF_BUS_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     vol.Optional(CONF_SHUNT_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     vol.Optional(CONF_CURRENT): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     vol.Optional(CONF_POWER): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     vol.Optional(CONF_BUS_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ | ||||
|         cv.GenerateID(): cv.declare_variable_id(INA219VoltageSensor), | ||||
|     })), | ||||
|     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.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_UPDATE_INTERVAL): cv.update_interval, | ||||
| }), cv.has_at_least_one_key(CONF_BUS_VOLTAGE, CONF_SHUNT_VOLTAGE, CONF_CURRENT, | ||||
|                             CONF_POWER)) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_least_one_key(*SENSOR_KEYS)) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
| @@ -48,6 +60,15 @@ def to_code(config): | ||||
|     if CONF_POWER in config: | ||||
|         conf = config[CONF_POWER] | ||||
|         sensor.register_sensor(ina.Pmake_power_sensor(conf[CONF_NAME]), conf) | ||||
|     setup_component(ina, config) | ||||
|  | ||||
|  | ||||
| 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 | ||||
| import voluptuous as vol | ||||
|  | ||||
| from esphomeyaml.components import i2c, sensor | ||||
| 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, \ | ||||
|     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'] | ||||
|  | ||||
| @@ -13,20 +13,31 @@ CONF_CHANNEL_1 = 'channel_1' | ||||
| CONF_CHANNEL_2 = 'channel_2' | ||||
| CONF_CHANNEL_3 = 'channel_3' | ||||
|  | ||||
| INA3221Component = sensor.sensor_ns.INA3221Component | ||||
| INA3221VoltageSensor = sensor.sensor_ns.INA3221VoltageSensor | ||||
| INA3221CurrentSensor = sensor.sensor_ns.INA3221CurrentSensor | ||||
| INA3221PowerSensor = sensor.sensor_ns.INA3221PowerSensor | ||||
| INA3221Component = sensor.sensor_ns.class_('INA3221Component', PollingComponent, i2c.I2CDevice) | ||||
| INA3221VoltageSensor = sensor.sensor_ns.class_('INA3221VoltageSensor', | ||||
|                                                sensor.EmptyPollingParentSensor) | ||||
| 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({ | ||||
|     vol.Optional(CONF_BUS_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     vol.Optional(CONF_SHUNT_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     vol.Optional(CONF_CURRENT): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     vol.Optional(CONF_POWER): cv.nameable(sensor.SENSOR_SCHEMA), | ||||
|     vol.Optional(CONF_BUS_VOLTAGE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ | ||||
|         cv.GenerateID(): cv.declare_variable_id(INA3221VoltageSensor), | ||||
|     })), | ||||
|     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.Range(min=0.0, max=32.0)), | ||||
| }), cv.has_at_least_one_key(CONF_BUS_VOLTAGE, CONF_SHUNT_VOLTAGE, CONF_CURRENT, | ||||
|                             CONF_POWER)) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_least_one_key(*SENSOR_KEYS)) | ||||
|  | ||||
| PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(INA3221Component), | ||||
| @@ -60,5 +71,19 @@ def to_code(config): | ||||
|             c = conf[CONF_POWER] | ||||
|             sensor.register_sensor(ina.Pmake_power_sensor(i, c[CONF_NAME]), c) | ||||
|  | ||||
|     setup_component(ina, config) | ||||
|  | ||||
|  | ||||
| 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 | ||||
| from esphomeyaml import pins | ||||
| from esphomeyaml.components import sensor | ||||
| from esphomeyaml.components import sensor, spi | ||||
| from esphomeyaml.components.spi import SPIComponent | ||||
| from esphomeyaml.const import CONF_CS_PIN, CONF_MAKE_ID, CONF_NAME, CONF_SPI_ID, \ | ||||
|     CONF_UPDATE_INTERVAL | ||||
| from esphomeyaml.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({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(MAX6675Sensor), | ||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeMAX6675Sensor), | ||||
|     cv.GenerateID(CONF_SPI_ID): cv.use_variable_id(SPIComponent), | ||||
|     vol.Required(CONF_CS_PIN): pins.gpio_output_pin_schema, | ||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, | ||||
| })) | ||||
| }).extend(cv.COMPONENT_SCHEMA.schema)) | ||||
|  | ||||
|  | ||||
| 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 | ||||
|     cs = None | ||||
|     for cs in gpio_output_pin_expression(config[CONF_CS_PIN]): | ||||
|         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)) | ||||
|     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' | ||||
|  | ||||
|  | ||||
| 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
		Reference in New Issue
	
	Block a user