mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	Fix docker build
This commit is contained in:
		| @@ -107,3 +107,4 @@ config/ | |||||||
| examples/ | examples/ | ||||||
| Dockerfile | Dockerfile | ||||||
| .git/ | .git/ | ||||||
|  | tests/build/ | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -104,3 +104,4 @@ venv.bak/ | |||||||
| .mypy_cache/ | .mypy_cache/ | ||||||
|  |  | ||||||
| config/ | config/ | ||||||
|  | tests/build/ | ||||||
|   | |||||||
| @@ -5,6 +5,7 @@ variables: | |||||||
|  |  | ||||||
| stages: | stages: | ||||||
|   - lint |   - lint | ||||||
|  |   - test | ||||||
|   - build |   - build | ||||||
|   - deploy |   - deploy | ||||||
|  |  | ||||||
| @@ -14,7 +15,20 @@ stages: | |||||||
|     - python2.7 |     - python2.7 | ||||||
|     - esphomeyaml-lint |     - esphomeyaml-lint | ||||||
|  |  | ||||||
| .hassio-builder: &hassio-builder | .test: &test | ||||||
|  |   stage: test | ||||||
|  |   before_script: | ||||||
|  |     - pip install -e . | ||||||
|  |   tags: | ||||||
|  |     - python2.7 | ||||||
|  |     - esphomeyaml-test | ||||||
|  |   variables: | ||||||
|  |     TZ: UTC | ||||||
|  |   cache: | ||||||
|  |     paths: | ||||||
|  |       - tests/build | ||||||
|  |  | ||||||
|  | .docker-builder: &docker-builder | ||||||
|   before_script: |   before_script: | ||||||
|     - docker info |     - docker info | ||||||
|     - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY" |     - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY" | ||||||
| @@ -33,8 +47,13 @@ pylint: | |||||||
|   script: |   script: | ||||||
|     - pylint esphomeyaml |     - pylint esphomeyaml | ||||||
|  |  | ||||||
| .build: &build | test: | ||||||
|   <<: *hassio-builder |   <<: *test | ||||||
|  |   script: | ||||||
|  |     - esphomeyaml tests/test1.yaml compile | ||||||
|  |  | ||||||
|  | .build-hassio: &build-hassio | ||||||
|  |   <<: *docker-builder | ||||||
|   stage: build |   stage: build | ||||||
|   script: |   script: | ||||||
|     - | |     - | | ||||||
| @@ -49,10 +68,11 @@ pylint: | |||||||
|         "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:${CI_COMMIT_SHA}" |         "${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}:${CI_COMMIT_SHA}" | ||||||
|     - docker push "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:dev" |     - docker push "${CI_REGISTRY}/ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:dev" | ||||||
|  |   retry: 1 | ||||||
|  |  | ||||||
| # Generic deploy template | # Generic deploy template | ||||||
| .deploy: &deploy | .deploy: &deploy | ||||||
|   <<: *hassio-builder |   <<: *docker-builder | ||||||
|   stage: deploy |   stage: deploy | ||||||
|   script: |   script: | ||||||
|     - version=${CI_COMMIT_TAG:1} |     - version=${CI_COMMIT_TAG:1} | ||||||
| @@ -71,8 +91,20 @@ pylint: | |||||||
|     - docker push "ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:latest" |     - docker push "ottowinter/esphomeyaml-hassio-${ADDON_ARCH}:latest" | ||||||
|  |  | ||||||
| # Build jobs | # 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" | ||||||
|  |  | ||||||
| build:armhf: | build:armhf: | ||||||
|   <<: *build |   <<: *build-hassio | ||||||
|   variables: |   variables: | ||||||
|     ADDON_ARCH: armhf |     ADDON_ARCH: armhf | ||||||
|  |  | ||||||
| @@ -82,12 +114,12 @@ build:armhf: | |||||||
| #     ADDON_ARCH: aarch64 | #     ADDON_ARCH: aarch64 | ||||||
|  |  | ||||||
| build:i386: | build:i386: | ||||||
|   <<: *build |   <<: *build-hassio | ||||||
|   variables: |   variables: | ||||||
|     ADDON_ARCH: i386 |     ADDON_ARCH: i386 | ||||||
|  |  | ||||||
| build:amd64: | build:amd64: | ||||||
|   <<: *build |   <<: *build-hassio | ||||||
|   variables: |   variables: | ||||||
|     ADDON_ARCH: amd64 |     ADDON_ARCH: amd64 | ||||||
|  |  | ||||||
| @@ -119,7 +151,6 @@ deploy:i386: | |||||||
|   except: |   except: | ||||||
|     - /^(?!master).+@/ |     - /^(?!master).+@/ | ||||||
|  |  | ||||||
|  |  | ||||||
| deploy:amd64: | deploy:amd64: | ||||||
|   <<: *deploy |   <<: *deploy | ||||||
|   variables: |   variables: | ||||||
| @@ -129,3 +160,18 @@ deploy:amd64: | |||||||
|   except: |   except: | ||||||
|     - /^(?!master).+@/ |     - /^(?!master).+@/ | ||||||
|  |  | ||||||
|  | deploy:pypi: | ||||||
|  |   stage: deploy | ||||||
|  |   before_script: | ||||||
|  |     - pip install -e . | ||||||
|  |     - pip install twine | ||||||
|  |   script: | ||||||
|  |     - python setup.py sdist | ||||||
|  |     - twine upload dist/* | ||||||
|  |   tags: | ||||||
|  |     - python2.7 | ||||||
|  |     - esphomeyaml-test | ||||||
|  |   only: | ||||||
|  |     - /^v\d+\.\d+\.\d+(?:(?:(?:\+|\.)?[a-zA-Z0-9]+)*)?$/ | ||||||
|  |   except: | ||||||
|  |     - /^(?!master).+@/ | ||||||
|   | |||||||
| @@ -1,6 +1,10 @@ | |||||||
| FROM python:2.7 | FROM python:2.7 | ||||||
| MAINTAINER Otto Winter <contact@otto-winter.com> | MAINTAINER Otto Winter <contact@otto-winter.com> | ||||||
|  |  | ||||||
|  | RUN apt-get update && apt-get install -y \ | ||||||
|  |         python-pil \ | ||||||
|  |     && rm -rf /var/lib/apt/lists/* | ||||||
|  |  | ||||||
| ENV ESPHOMEYAML_OTA_HOST_PORT=6123 | ENV ESPHOMEYAML_OTA_HOST_PORT=6123 | ||||||
| EXPOSE 6123 | EXPOSE 6123 | ||||||
| VOLUME /config | VOLUME /config | ||||||
| @@ -16,7 +20,7 @@ RUN platformio settings set enable_telemetry No && \ | |||||||
|  |  | ||||||
| COPY . . | COPY . . | ||||||
| RUN pip install -e . && \ | RUN pip install -e . && \ | ||||||
|     pip install pillow tzlocal |     pip install tzlocal | ||||||
|  |  | ||||||
| WORKDIR /config | WORKDIR /config | ||||||
| ENTRYPOINT ["esphomeyaml"] | ENTRYPOINT ["esphomeyaml"] | ||||||
|   | |||||||
| @@ -5,6 +5,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ | |||||||
|         python \ |         python \ | ||||||
|         python-pip \ |         python-pip \ | ||||||
|         python-setuptools \ |         python-setuptools \ | ||||||
|  |         python-pil \ | ||||||
|         git \ |         git \ | ||||||
|     && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/*rm -rf /var/lib/apt/lists/* /tmp/* && \ |     && 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 && \ |     pip install --no-cache-dir --no-binary :all: platformio && \ | ||||||
| @@ -15,6 +16,6 @@ RUN platformio run -d /pio; rm -rf /pio | |||||||
|  |  | ||||||
| COPY . . | COPY . . | ||||||
| RUN pip install --no-cache-dir --no-binary :all: -e . && \ | RUN pip install --no-cache-dir --no-binary :all: -e . && \ | ||||||
|     pip install --no-cache-dir --no-binary :all: pillow tzlocal |     pip install --no-cache-dir --no-binary :all: tzlocal | ||||||
|  |  | ||||||
| CMD ["esphomeyaml", "/config/esphomeyaml", "dashboard"] | CMD ["esphomeyaml", "/config/esphomeyaml", "dashboard"] | ||||||
|   | |||||||
| @@ -7,6 +7,12 @@ RUN apk add --no-cache \ | |||||||
|         git \ |         git \ | ||||||
|         openssh \ |         openssh \ | ||||||
|         libc6-compat \ |         libc6-compat \ | ||||||
|  |         jpeg-dev \ | ||||||
|  |         zlib-dev \ | ||||||
|  |         freetype-dev \ | ||||||
|  |         lcms2-dev \ | ||||||
|  |         openjpeg-dev \ | ||||||
|  |         tiff-dev \ | ||||||
|     && \ |     && \ | ||||||
|     pip install --no-cache-dir --no-binary :all: platformio && \ |     pip install --no-cache-dir --no-binary :all: platformio && \ | ||||||
|     platformio settings set enable_telemetry No |     platformio settings set enable_telemetry No | ||||||
| @@ -16,6 +22,6 @@ RUN platformio run -d /pio; rm -rf /pio | |||||||
|  |  | ||||||
| COPY . . | COPY . . | ||||||
| RUN pip install --no-cache-dir --no-binary :all: -e . && \ | RUN pip install --no-cache-dir --no-binary :all: -e . && \ | ||||||
|     pip install --no-cache-dir --no-binary :all: pillow tzlocal |     pip install --no-cache-dir pilow tzlocal | ||||||
|  |  | ||||||
| CMD ["esphomeyaml", "/config/esphomeyaml", "dashboard"] | CMD ["esphomeyaml", "/config/esphomeyaml", "dashboard"] | ||||||
|   | |||||||
| @@ -5,6 +5,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ | |||||||
|         python \ |         python \ | ||||||
|         python-pip \ |         python-pip \ | ||||||
|         python-setuptools \ |         python-setuptools \ | ||||||
|  |         python-pil \ | ||||||
|         git \ |         git \ | ||||||
|     && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/*rm -rf /var/lib/apt/lists/* /tmp/* && \ |     && 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 && \ |     pip install --no-cache-dir --no-binary :all: platformio && \ | ||||||
| @@ -15,6 +16,6 @@ RUN platformio run -d /pio; rm -rf /pio | |||||||
|  |  | ||||||
| COPY . . | COPY . . | ||||||
| RUN pip install --no-cache-dir --no-binary :all: -e . && \ | RUN pip install --no-cache-dir --no-binary :all: -e . && \ | ||||||
|     pip install --no-cache-dir --no-binary :all: pillow tzlocal |     pip install --no-cache-dir --no-binary :all: tzlocal | ||||||
|  |  | ||||||
| CMD ["esphomeyaml", "/config/esphomeyaml", "dashboard"] | CMD ["esphomeyaml", "/config/esphomeyaml", "dashboard"] | ||||||
|   | |||||||
							
								
								
									
										19
									
								
								docker/Dockerfile.test
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								docker/Dockerfile.test
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | 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 requirements.txt /requirements.txt | ||||||
|  |  | ||||||
|  | RUN pip install --no-cache-dir -r /requirements.txt && \ | ||||||
|  |     pip install --no-cache-dir tzlocal pillow | ||||||
| @@ -16,10 +16,21 @@ ARG BUILD_FROM | |||||||
| # * disable platformio telemetry on install | # * disable platformio telemetry on install | ||||||
| RUN /bin/bash -c "if [[ '$BUILD_FROM' = *\"ubuntu\"* ]]; then \ | RUN /bin/bash -c "if [[ '$BUILD_FROM' = *\"ubuntu\"* ]]; then \ | ||||||
|       apt-get update && apt-get install -y --no-install-recommends \ |       apt-get update && apt-get install -y --no-install-recommends \ | ||||||
|         python python-pip python-setuptools git && \ |         python python-pip python-setuptools python-pil git && \ | ||||||
|       rm -rf /var/lib/apt/lists/* /tmp/*; \ |       rm -rf /var/lib/apt/lists/* /tmp/*; \ | ||||||
|     else \ |     else \ | ||||||
|        apk add --no-cache python2 py2-pip git openssh libc6-compat; \ |        apk add --no-cache \ | ||||||
|  |           python2 \ | ||||||
|  |           py2-pip \ | ||||||
|  |           git \ | ||||||
|  |           openssh \ | ||||||
|  |           libc6-compat \ | ||||||
|  |           jpeg-dev \ | ||||||
|  |           zlib-dev \ | ||||||
|  |           freetype-dev \ | ||||||
|  |           lcms2-dev \ | ||||||
|  |           openjpeg-dev \ | ||||||
|  |           tiff-dev; \ | ||||||
|     fi" && \ |     fi" && \ | ||||||
|     pip install --no-cache-dir platformio && \ |     pip install --no-cache-dir platformio && \ | ||||||
|     platformio settings set enable_telemetry No |     platformio settings set enable_telemetry No | ||||||
|   | |||||||
| @@ -6,13 +6,13 @@ from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns, RawExpressio | |||||||
|  |  | ||||||
| ESP_PLATFORMS = [ESP_PLATFORM_ESP32] | ESP_PLATFORMS = [ESP_PLATFORM_ESP32] | ||||||
|  |  | ||||||
| ESP32BLETracker = esphomelib_ns.ESP32BLETracker | ESP32BLEBeacon = esphomelib_ns.ESP32BLEBeacon | ||||||
|  |  | ||||||
| CONF_MAJOR = 'major' | CONF_MAJOR = 'major' | ||||||
| CONF_MINOR = 'minor' | CONF_MINOR = 'minor' | ||||||
|  |  | ||||||
| CONFIG_SCHEMA = vol.Schema({ | CONFIG_SCHEMA = vol.Schema({ | ||||||
|     cv.GenerateID(): cv.declare_variable_id(ESP32BLETracker), |     cv.GenerateID(): cv.declare_variable_id(ESP32BLEBeacon), | ||||||
|     vol.Required(CONF_TYPE): vol.All(vol.Upper, cv.one_of('IBEACON')), |     vol.Required(CONF_TYPE): vol.All(vol.Upper, cv.one_of('IBEACON')), | ||||||
|     vol.Required(CONF_UUID): cv.uuid, |     vol.Required(CONF_UUID): cv.uuid, | ||||||
|     vol.Optional(CONF_MAJOR): cv.uint16_t, |     vol.Optional(CONF_MAJOR): cv.uint16_t, | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ | |||||||
|  |  | ||||||
|     vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float, |     vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float, | ||||||
|     vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds, | ||||||
|     vol.Optional(CONF_EFFECTS): light.validate_effects(light.RGB_EFFECTS), |     vol.Optional(CONF_EFFECTS): light.validate_effects(light.MONOCHROMATIC_EFFECTS), | ||||||
| }), validate_cold_white_colder) | }), validate_cold_white_colder) | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ from esphomeyaml.const import CONF_BIRTH_MESSAGE, CONF_BROKER, CONF_CLIENT_ID, C | |||||||
|     CONF_DISCOVERY_PREFIX, CONF_DISCOVERY_RETAIN, CONF_ID, CONF_KEEPALIVE, CONF_LOG_TOPIC, \ |     CONF_DISCOVERY_PREFIX, CONF_DISCOVERY_RETAIN, CONF_ID, CONF_KEEPALIVE, CONF_LOG_TOPIC, \ | ||||||
|     CONF_ON_MESSAGE, CONF_PASSWORD, CONF_PAYLOAD, CONF_PORT, CONF_QOS, CONF_RETAIN, \ |     CONF_ON_MESSAGE, CONF_PASSWORD, CONF_PAYLOAD, CONF_PORT, CONF_QOS, CONF_RETAIN, \ | ||||||
|     CONF_SSL_FINGERPRINTS, CONF_TOPIC, CONF_TOPIC_PREFIX, CONF_TRIGGER_ID, CONF_USERNAME, \ |     CONF_SSL_FINGERPRINTS, CONF_TOPIC, CONF_TOPIC_PREFIX, CONF_TRIGGER_ID, CONF_USERNAME, \ | ||||||
|     CONF_WILL_MESSAGE, CONF_REBOOT_TIMEOUT |     CONF_WILL_MESSAGE, CONF_REBOOT_TIMEOUT, CONF_SHUTDOWN_MESSAGE | ||||||
| from esphomeyaml.helpers import App, ArrayInitializer, Pvariable, RawExpression, \ | from esphomeyaml.helpers import App, ArrayInitializer, Pvariable, RawExpression, \ | ||||||
|     StructInitializer, \ |     StructInitializer, \ | ||||||
|     TemplateArguments, add, esphomelib_ns, optional, std_string |     TemplateArguments, add, esphomelib_ns, optional, std_string | ||||||
| @@ -66,6 +66,7 @@ CONFIG_SCHEMA = vol.Schema({ | |||||||
|     vol.Optional(CONF_DISCOVERY_PREFIX): cv.publish_topic, |     vol.Optional(CONF_DISCOVERY_PREFIX): cv.publish_topic, | ||||||
|     vol.Optional(CONF_BIRTH_MESSAGE): MQTT_MESSAGE_SCHEMA, |     vol.Optional(CONF_BIRTH_MESSAGE): MQTT_MESSAGE_SCHEMA, | ||||||
|     vol.Optional(CONF_WILL_MESSAGE): MQTT_MESSAGE_SCHEMA, |     vol.Optional(CONF_WILL_MESSAGE): MQTT_MESSAGE_SCHEMA, | ||||||
|  |     vol.Optional(CONF_SHUTDOWN_MESSAGE): MQTT_MESSAGE_SCHEMA, | ||||||
|     vol.Optional(CONF_TOPIC_PREFIX): cv.publish_topic, |     vol.Optional(CONF_TOPIC_PREFIX): cv.publish_topic, | ||||||
|     vol.Optional(CONF_LOG_TOPIC): MQTT_MESSAGE_TEMPLATE_SCHEMA, |     vol.Optional(CONF_LOG_TOPIC): MQTT_MESSAGE_TEMPLATE_SCHEMA, | ||||||
|     vol.Optional(CONF_SSL_FINGERPRINTS): vol.All(cv.only_on_esp8266, |     vol.Optional(CONF_SSL_FINGERPRINTS): vol.All(cv.only_on_esp8266, | ||||||
| @@ -117,6 +118,12 @@ def to_code(config): | |||||||
|             add(mqtt.disable_last_will()) |             add(mqtt.disable_last_will()) | ||||||
|         else: |         else: | ||||||
|             add(mqtt.set_last_will(exp_mqtt_message(will_message))) |             add(mqtt.set_last_will(exp_mqtt_message(will_message))) | ||||||
|  |     if CONF_SHUTDOWN_MESSAGE in config: | ||||||
|  |         shutdown_message = config[CONF_SHUTDOWN_MESSAGE] | ||||||
|  |         if not shutdown_message: | ||||||
|  |             add(mqtt.disable_shutdown_message()) | ||||||
|  |         else: | ||||||
|  |             add(mqtt.set_shutdown_message(exp_mqtt_message(shutdown_message))) | ||||||
|     if CONF_CLIENT_ID in config: |     if CONF_CLIENT_ID in config: | ||||||
|         add(mqtt.set_client_id(config[CONF_CLIENT_ID])) |         add(mqtt.set_client_id(config[CONF_CLIENT_ID])) | ||||||
|     if CONF_LOG_TOPIC in config: |     if CONF_LOG_TOPIC in config: | ||||||
|   | |||||||
| @@ -43,10 +43,10 @@ def to_code(config): | |||||||
|         conf = config[CONF_VOLTAGE] |         conf = config[CONF_VOLTAGE] | ||||||
|         sensor.register_sensor(hlw.make_voltage_sensor(conf[CONF_NAME]), conf) |         sensor.register_sensor(hlw.make_voltage_sensor(conf[CONF_NAME]), conf) | ||||||
|     if CONF_CURRENT in config: |     if CONF_CURRENT in config: | ||||||
|         conf = config[CONF_VOLTAGE] |         conf = config[CONF_CURRENT] | ||||||
|         sensor.register_sensor(hlw.make_current_sensor(conf[CONF_NAME]), conf) |         sensor.register_sensor(hlw.make_current_sensor(conf[CONF_NAME]), conf) | ||||||
|     if CONF_POWER in config: |     if CONF_POWER in config: | ||||||
|         conf = config[CONF_VOLTAGE] |         conf = config[CONF_POWER] | ||||||
|         sensor.register_sensor(hlw.make_power_sensor(conf[CONF_NAME]), conf) |         sensor.register_sensor(hlw.make_power_sensor(conf[CONF_NAME]), conf) | ||||||
|     if CONF_CURRENT_RESISTOR in config: |     if CONF_CURRENT_RESISTOR in config: | ||||||
|         add(hlw.set_current_resistor(config[CONF_CURRENT_RESISTOR])) |         add(hlw.set_current_resistor(config[CONF_CURRENT_RESISTOR])) | ||||||
|   | |||||||
| @@ -33,7 +33,7 @@ def validate_range(value): | |||||||
|     value = cv.string(value) |     value = cv.string(value) | ||||||
|     if value.endswith(u'µT') or value.endswith('uT'): |     if value.endswith(u'µT') or value.endswith('uT'): | ||||||
|         value = value[:-2] |         value = value[:-2] | ||||||
|     return cv.one_of(*HMC5883L_RANGES)(value) |     return cv.one_of(*HMC5883L_RANGES)(int(value)) | ||||||
|  |  | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({ | ||||||
|   | |||||||
| @@ -38,7 +38,7 @@ def to_code(config): | |||||||
|     make = variable(config[CONF_MAKE_ID], rhs) |     make = variable(config[CONF_MAKE_ID], rhs) | ||||||
|  |  | ||||||
|     if CONF_GAIN in config: |     if CONF_GAIN in config: | ||||||
|         add(make.Phx711.set_gain(GAINS[CONF_GAIN])) |         add(make.Phx711.set_gain(GAINS[config[CONF_GAIN]])) | ||||||
|  |  | ||||||
|     sensor.setup_sensor(make.Phx711, make.Pmqtt, config) |     sensor.setup_sensor(make.Phx711, make.Pmqtt, config) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -48,10 +48,34 @@ def _tz_dst_str(dt): | |||||||
| def detect_tz(): | def detect_tz(): | ||||||
|     try: |     try: | ||||||
|         import tzlocal |         import tzlocal | ||||||
|  |         import pytz | ||||||
|     except ImportError: |     except ImportError: | ||||||
|         raise vol.Invalid("No timezone specified and 'tzlocal' not installed. To automatically " |         raise vol.Invalid("No timezone specified and 'tzlocal' not installed. To automatically " | ||||||
|                           "detect the timezone please install tzlocal (pip2 install tzlocal)") |                           "detect the timezone please install tzlocal (pip2 install tzlocal)") | ||||||
|  |     try: | ||||||
|         tz = tzlocal.get_localzone() |         tz = tzlocal.get_localzone() | ||||||
|  |     except pytz.exceptions.UnknownTimeZoneError: | ||||||
|  |         _LOGGER.warning("Could not auto-detect timezone. Using UTC...") | ||||||
|  |         return 'UTC' | ||||||
|  |  | ||||||
|  |     def _dst(dt, is_dst): | ||||||
|  |         try: | ||||||
|  |             return tz.dst(dt, is_dst=is_dst) | ||||||
|  |         except TypeError:  # stupid pytz... | ||||||
|  |             return tz.dst(dt) | ||||||
|  |  | ||||||
|  |     def _tzname(dt, is_dst): | ||||||
|  |         try: | ||||||
|  |             return tz.tzname(dt, is_dst=is_dst) | ||||||
|  |         except TypeError:  # stupid pytz... | ||||||
|  |             return tz.tzname(dt) | ||||||
|  |  | ||||||
|  |     def _utcoffset(dt, is_dst): | ||||||
|  |         try: | ||||||
|  |             return tz.utcoffset(dt, is_dst=is_dst) | ||||||
|  |         except TypeError:  # stupid pytz... | ||||||
|  |             return tz.utcoffset(dt) | ||||||
|  |  | ||||||
|     dst_begins = None |     dst_begins = None | ||||||
|     dst_tzname = None |     dst_tzname = None | ||||||
|     dst_utcoffset = None |     dst_utcoffset = None | ||||||
| @@ -64,17 +88,17 @@ def detect_tz(): | |||||||
|     dt = datetime.datetime(year=this_year, month=1, day=1) |     dt = datetime.datetime(year=this_year, month=1, day=1) | ||||||
|     last_dst = None |     last_dst = None | ||||||
|     while dt.year == this_year: |     while dt.year == this_year: | ||||||
|         current_dst = tz.dst(dt, is_dst=not last_dst) |         current_dst = _dst(dt, not last_dst) | ||||||
|         is_dst = bool(current_dst) |         is_dst = bool(current_dst) | ||||||
|         if is_dst != last_dst: |         if is_dst != last_dst: | ||||||
|             if is_dst: |             if is_dst: | ||||||
|                 dst_begins = dt |                 dst_begins = dt | ||||||
|                 dst_tzname = tz.tzname(dt, is_dst=True) |                 dst_tzname = _tzname(dt, True) | ||||||
|                 dst_utcoffset = tz.utcoffset(dt, is_dst=True) |                 dst_utcoffset = _utcoffset(dt, True) | ||||||
|             else: |             else: | ||||||
|                 dst_ends = dt + hour |                 dst_ends = dt + hour | ||||||
|                 norm_tzname = tz.tzname(dt, is_dst=False) |                 norm_tzname = _tzname(dt, False) | ||||||
|                 norm_utcoffset = tz.utcoffset(dt, is_dst=False) |                 norm_utcoffset = _utcoffset(dt, False) | ||||||
|             last_dst = is_dst |             last_dst = is_dst | ||||||
|         dt += hour |         dt += hour | ||||||
|  |  | ||||||
|   | |||||||
| @@ -99,6 +99,7 @@ CONF_LOGS = 'logs' | |||||||
| CONF_PORT = 'port' | CONF_PORT = 'port' | ||||||
| CONF_WILL_MESSAGE = 'will_message' | CONF_WILL_MESSAGE = 'will_message' | ||||||
| CONF_BIRTH_MESSAGE = 'birth_message' | CONF_BIRTH_MESSAGE = 'birth_message' | ||||||
|  | CONF_SHUTDOWN_MESSAGE = 'shutdown_message' | ||||||
| CONF_PAYLOAD = 'payload' | CONF_PAYLOAD = 'payload' | ||||||
| CONF_QOS = 'qos' | CONF_QOS = 'qos' | ||||||
| CONF_DISCOVERY_RETAIN = 'discovery_retain' | CONF_DISCOVERY_RETAIN = 'discovery_retain' | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								tests/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								tests/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | # Tests for esphomeyaml | ||||||
|  |  | ||||||
|  | This directory contains some tests for esphomeyaml. | ||||||
|  | At the moment, all the tests only work by simply executing | ||||||
|  | `esphomeyaml` over some YAML files that are made to test | ||||||
|  | all of esphomeyaml's features. | ||||||
|  |  | ||||||
|  | Of course this is all just very high-level and things like | ||||||
|  | unit tests would be much better. So if you have time and know | ||||||
|  | how to set up a unit testing framework for python, please do | ||||||
|  | give it a try. | ||||||
							
								
								
									
										925
									
								
								tests/test1.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										925
									
								
								tests/test1.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,925 @@ | |||||||
|  | esphomeyaml: | ||||||
|  |   name: test1 | ||||||
|  |   platform: ESP32 | ||||||
|  |   board: nodemcu-32s | ||||||
|  |   # Use latest esphomelib git version. TODO: Change this | ||||||
|  |   library_uri: 'https://github.com/OttoWinter/esphomelib.git' | ||||||
|  |   simplify: false | ||||||
|  |   use_build_flags: yes | ||||||
|  |   on_boot: | ||||||
|  |     priority: 150.0 | ||||||
|  |     then: | ||||||
|  |       - lambda: >- | ||||||
|  |           ESP_LOGD("main", "ON BOOT!"); | ||||||
|  |   on_shutdown: | ||||||
|  |     then: | ||||||
|  |       - lambda: >- | ||||||
|  |           ESP_LOGD("main", "ON SHUTDOWN!"); | ||||||
|  |   build_path: build | ||||||
|  |  | ||||||
|  | wifi: | ||||||
|  |   ssid: 'MySSID' | ||||||
|  |   password: 'password1' | ||||||
|  |   manual_ip: | ||||||
|  |     static_ip: 192.168.178.230 | ||||||
|  |     gateway: 192.168.178.1 | ||||||
|  |     subnet: 255.255.255.0 | ||||||
|  |     dns1: 1.1.1.1 | ||||||
|  |     dns2: 1.2.2.1 | ||||||
|  |   hostname: myverylonghostname | ||||||
|  |   domain: .local | ||||||
|  |   reboot_timeout: 120s | ||||||
|  |  | ||||||
|  | mqtt: | ||||||
|  |   broker: '192.168.178.84' | ||||||
|  |   port: 1883 | ||||||
|  |   username: 'debug' | ||||||
|  |   password: 'debug' | ||||||
|  |   client_id: someclient | ||||||
|  |   discovery: True | ||||||
|  |   discovery_retain: False | ||||||
|  |   discovery_prefix: discovery | ||||||
|  |   topic_prefix: helloworld | ||||||
|  |   log_topic: helloworld/hi | ||||||
|  |   birth_message: | ||||||
|  |   will_message: | ||||||
|  |   shutdown_message: | ||||||
|  |     topic: topic/to/send/to | ||||||
|  |     payload: hi | ||||||
|  |     qos: 2 | ||||||
|  |     retain: True | ||||||
|  |   keepalive: 60s | ||||||
|  |   reboot_timeout: 60s | ||||||
|  |   on_message: | ||||||
|  |     - topic: my/custom/topic | ||||||
|  |       qos: 0 | ||||||
|  |       then: | ||||||
|  |         - lambda: >- | ||||||
|  |             ESP_LOGD("main", "Got message %s", x); | ||||||
|  |     - topic: livingroom/ota_mode | ||||||
|  |       then: | ||||||
|  |       - deep_sleep.prevent: | ||||||
|  |           id: deep_sleep_1 | ||||||
|  |     - topic: livingroom/ota_mode | ||||||
|  |       then: | ||||||
|  |       - deep_sleep.enter: | ||||||
|  |           id: deep_sleep_1 | ||||||
|  |  | ||||||
|  | i2c: | ||||||
|  |   sda: 21 | ||||||
|  |   scl: 22 | ||||||
|  |   scan: True | ||||||
|  |   frequency: 100kHz | ||||||
|  |  | ||||||
|  | spi: | ||||||
|  |   clk_pin: GPIO21 | ||||||
|  |   mosi_pin: GPIO22 | ||||||
|  |   miso_pin: GPIO23 | ||||||
|  |  | ||||||
|  | uart: | ||||||
|  |   tx_pin: GPIO22 | ||||||
|  |   rx_pin: GPIO23 | ||||||
|  |   baud_rate: 115200 | ||||||
|  |  | ||||||
|  | ota: | ||||||
|  |   safe_mode: True | ||||||
|  |   password: 'superlongpasswordthatnoonewillknow' | ||||||
|  |   port: 3286 | ||||||
|  |  | ||||||
|  | logger: | ||||||
|  |   baud_rate: 0 | ||||||
|  |   level: VERBOSE | ||||||
|  |   logs: | ||||||
|  |     mqtt.component: DEBUG | ||||||
|  |     mqtt.client: ERROR | ||||||
|  |  | ||||||
|  | web_server: | ||||||
|  |   port: 8080 | ||||||
|  |   css_url: https://esphomelib.com/_static/webserver-v1.min.css | ||||||
|  |   js_url: https://esphomelib.com/_static/webserver-v1.min.js | ||||||
|  |  | ||||||
|  | power_supply: | ||||||
|  |   id: 'atx_power_supply' | ||||||
|  |   enable_time: 20ms | ||||||
|  |   keep_on_time: 10s | ||||||
|  |   pin: | ||||||
|  |     number: 13 | ||||||
|  |     inverted: true | ||||||
|  |  | ||||||
|  | deep_sleep: | ||||||
|  |   run_duration: 20s | ||||||
|  |   run_cycles: 500 | ||||||
|  |   sleep_duration: 50s | ||||||
|  |   wakeup_pin: GPIO39 | ||||||
|  |   wakeup_pin_mode: INVERT_WAKEUP | ||||||
|  |   id: deep_sleep_1 | ||||||
|  |  | ||||||
|  | ads1115: | ||||||
|  |   address: 0x48 | ||||||
|  |  | ||||||
|  | dallas: | ||||||
|  |   pin: GPIO23 | ||||||
|  |  | ||||||
|  | sensor: | ||||||
|  |   - platform: adc | ||||||
|  |     pin: A0 | ||||||
|  |     name: "Living Room Brightness" | ||||||
|  |     update_interval: '1:01' | ||||||
|  |     attenuation: 2.5db | ||||||
|  |     unit_of_measurement: "°C" | ||||||
|  |     icon: "mdi:water-percent" | ||||||
|  |     accuracy_decimals: 5 | ||||||
|  |     expire_after: 120s | ||||||
|  |     filters: | ||||||
|  |       - offset: 2.0 | ||||||
|  |       - multiply: 1.2 | ||||||
|  |       - filter_out: 42.0 | ||||||
|  |       - filter_nan: | ||||||
|  |       - sliding_window_moving_average: | ||||||
|  |           window_size: 15 | ||||||
|  |           send_every: 15 | ||||||
|  |       - exponential_moving_average: | ||||||
|  |           alpha: 0.1 | ||||||
|  |           send_every: 15 | ||||||
|  |       - throttle: 1s | ||||||
|  |       - heartbeat: 5s | ||||||
|  |       - debounce: 0.1s | ||||||
|  |       - delta: 5.0 | ||||||
|  |       - unique: | ||||||
|  |       - or: | ||||||
|  |         - throttle: 1s | ||||||
|  |         - delta: 5.0 | ||||||
|  |       - lambda: return x * (9.0/5.0) + 32.0; | ||||||
|  |     on_value: | ||||||
|  |       then: | ||||||
|  |         - lambda: >- | ||||||
|  |             ESP_LOGD("main", "Got value %f", x); | ||||||
|  |             id(my_sensor).push_new_value(42.0); | ||||||
|  |             ESP_LOGI("main", "Value of my sensor: %f", id(my_sensor).value); | ||||||
|  |             ESP_LOGI("main", "Raw Value of my sensor: %f", id(my_sensor).value); | ||||||
|  |     on_value_range: | ||||||
|  |       above: 5 | ||||||
|  |       below: 10 | ||||||
|  |       then: | ||||||
|  |         - lambda: >- | ||||||
|  |             ESP_LOGD("main", "Got value range %f", x); | ||||||
|  |     on_raw_value: | ||||||
|  |       - lambda: >- | ||||||
|  |           ESP_LOGD("main", "Got raw value %f", x); | ||||||
|  |       - mqtt.publish: | ||||||
|  |           topic: some/topic | ||||||
|  |           payload: Hello | ||||||
|  |           qos: 2 | ||||||
|  |           retain: True | ||||||
|  |   - platform: ads1115 | ||||||
|  |     multiplexer: 'A0_A1' | ||||||
|  |     gain: 1.024 | ||||||
|  |     id: my_sensor | ||||||
|  |     filters: | ||||||
|  |     state_topic: hi/me | ||||||
|  |     retain: false | ||||||
|  |     availability: | ||||||
|  |   - platform: bh1750 | ||||||
|  |     name: "Living Room Brightness 3" | ||||||
|  |     internal: true | ||||||
|  |     address: 0x23 | ||||||
|  |     resolution: 1.0 | ||||||
|  |     update_interval: 30s | ||||||
|  |     retain: False | ||||||
|  |     availability: | ||||||
|  |     state_topic: livingroom/custom_state_topic | ||||||
|  |   - platform: ble_rssi | ||||||
|  |     mac_address: AC:37:43:77:5F:4C | ||||||
|  |     name: "BLE Google Home Mini RSSI value" | ||||||
|  |   - platform: bme280 | ||||||
|  |     temperature: | ||||||
|  |       name: "Outside Temperature" | ||||||
|  |       oversampling: 16x | ||||||
|  |     pressure: | ||||||
|  |       name: "Outside Pressure" | ||||||
|  |       oversampling: none | ||||||
|  |     humidity: | ||||||
|  |       name: "Outside Humidity" | ||||||
|  |       oversampling: 8x | ||||||
|  |     address: 0x77 | ||||||
|  |     iir_filter: 16x | ||||||
|  |     update_interval: 15s | ||||||
|  |   - platform: bme680 | ||||||
|  |     temperature: | ||||||
|  |       name: "Outside Temperature" | ||||||
|  |       oversampling: 16x | ||||||
|  |     pressure: | ||||||
|  |       name: "Outside Pressure" | ||||||
|  |     humidity: | ||||||
|  |       name: "Outside Humidity" | ||||||
|  |     gas_resistance: | ||||||
|  |       name: "Outside Gas Sensor" | ||||||
|  |     address: 0x77 | ||||||
|  |     heater: | ||||||
|  |       temperature: 320 | ||||||
|  |       duration: 150ms | ||||||
|  |     update_interval: 15s | ||||||
|  |   - platform: bmp085 | ||||||
|  |     temperature: | ||||||
|  |       name: "Outside Temperature" | ||||||
|  |     pressure: | ||||||
|  |       name: "Outside Pressure" | ||||||
|  |       filters: | ||||||
|  |         - lambda: >- | ||||||
|  |             return x / powf(1.0 - (x / 44330.0), 5.255); | ||||||
|  |     update_interval: 15s | ||||||
|  |   - platform: bmp280 | ||||||
|  |     temperature: | ||||||
|  |       name: "Outside Temperature" | ||||||
|  |       oversampling: 16x | ||||||
|  |     pressure: | ||||||
|  |       name: "Outside Pressure" | ||||||
|  |     address: 0x77 | ||||||
|  |     update_interval: 15s | ||||||
|  |     iir_filter: 16x | ||||||
|  |   - platform: dallas | ||||||
|  |     address: 0x1C0000031EDD2A28 | ||||||
|  |     name: "Living Room Temperature" | ||||||
|  |     resolution: 9 | ||||||
|  |   - platform: dallas | ||||||
|  |     index: 1 | ||||||
|  |     name: "Living Room Temperature 2" | ||||||
|  |   - platform: dht | ||||||
|  |     pin: GPIO26 | ||||||
|  |     temperature: | ||||||
|  |       name: "Living Room Temperature 3" | ||||||
|  |     humidity: | ||||||
|  |       name: "Living Room Humidity 3" | ||||||
|  |     model: AM2302 | ||||||
|  |     update_interval: 15s | ||||||
|  |   - platform: dht12 | ||||||
|  |     temperature: | ||||||
|  |       name: "Living Room Temperature 4" | ||||||
|  |     humidity: | ||||||
|  |       name: "Living Room Humidity 4" | ||||||
|  |     update_interval: 15s | ||||||
|  |   - platform: duty_cycle | ||||||
|  |     pin: GPIO25 | ||||||
|  |     name: Duty Cycle Sensor | ||||||
|  |   - platform: esp32_hall | ||||||
|  |     name: "ESP32 Hall Sensor" | ||||||
|  |     update_interval: 15s | ||||||
|  |   - platform: hdc1080 | ||||||
|  |     temperature: | ||||||
|  |       name: "Living Room Temperature 5" | ||||||
|  |     humidity: | ||||||
|  |       name: "Living Room Pressure 5" | ||||||
|  |     update_interval: 15s | ||||||
|  |   - platform: hlw8012 | ||||||
|  |     sel_pin: 5 | ||||||
|  |     cf_pin: 14 | ||||||
|  |     cf1_pin: 13 | ||||||
|  |     current: | ||||||
|  |       name: "HLW8012 Current" | ||||||
|  |     voltage: | ||||||
|  |       name: "HLW8012 Voltage" | ||||||
|  |     power: | ||||||
|  |       name: "HLW8012 Power" | ||||||
|  |     update_interval: 15s | ||||||
|  |     current_resistor: 0.001 ohm | ||||||
|  |     voltage_divider: 2351 | ||||||
|  |     change_mode_every: 16 | ||||||
|  |   - platform: hmc5883l | ||||||
|  |     address: 0x68 | ||||||
|  |     field_strength_x: | ||||||
|  |       name: "HMC5883L Field Strength X" | ||||||
|  |     field_strength_y: | ||||||
|  |       name: "HMC5883L Field Strength Y" | ||||||
|  |     field_strength_z: | ||||||
|  |       name: "HMC5883L Field Strength Z" | ||||||
|  |     heading: | ||||||
|  |       name: "HMC5883L Heading" | ||||||
|  |     range: 130uT | ||||||
|  |     update_interval: 15s | ||||||
|  |   - platform: hx711 | ||||||
|  |     name: "HX711 Value" | ||||||
|  |     dout_pin: GPIO23 | ||||||
|  |     clk_pin: GPIO24 | ||||||
|  |     gain: 128 | ||||||
|  |     update_interval: 15s | ||||||
|  |   - platform: ina219 | ||||||
|  |     address: 0x40 | ||||||
|  |     shunt_resistance: 0.1 ohm | ||||||
|  |     current: | ||||||
|  |       name: "INA219 Current" | ||||||
|  |     power: | ||||||
|  |       name: "INA219 Power" | ||||||
|  |     bus_voltage: | ||||||
|  |       name: "INA219 Bus Voltage" | ||||||
|  |     shunt_voltage: | ||||||
|  |       name: "INA219 Shunt Voltage" | ||||||
|  |     max_voltage: 32.0V | ||||||
|  |     max_current: 3.2A | ||||||
|  |     update_interval: 15s | ||||||
|  |   - platform: ina3221 | ||||||
|  |     address: 0x40 | ||||||
|  |     channel_1: | ||||||
|  |       shunt_resistance: 0.1 ohm | ||||||
|  |       current: | ||||||
|  |         name: "INA3221 Channel 1 Current" | ||||||
|  |       power: | ||||||
|  |         name: "INA3221 Channel 1 Power" | ||||||
|  |       bus_voltage: | ||||||
|  |         name: "INA3221 Channel 1 Bus Voltage" | ||||||
|  |       shunt_voltage: | ||||||
|  |         name: "INA3221 Channel 1 Shunt Voltage" | ||||||
|  |     update_interval: 15s | ||||||
|  |   - platform: htu21d | ||||||
|  |     temperature: | ||||||
|  |       name: "Living Room Temperature 6" | ||||||
|  |     humidity: | ||||||
|  |       name: "Living Room Humidity 6" | ||||||
|  |     update_interval: 15s | ||||||
|  |   - platform: max6675 | ||||||
|  |     name: "Living Room Temperature" | ||||||
|  |     cs_pin: GPIO23 | ||||||
|  |     update_interval: 15s | ||||||
|  |   - platform: mhz19 | ||||||
|  |     co2: | ||||||
|  |       name: "MH-Z19 CO2 Value" | ||||||
|  |     temperature: | ||||||
|  |       name: "MH-Z19 Temperature" | ||||||
|  |     update_interval: 15s | ||||||
|  |   - platform: mpu6050 | ||||||
|  |     address: 0x68 | ||||||
|  |     accel_x: | ||||||
|  |       name: "MPU6050 Accel X" | ||||||
|  |     accel_y: | ||||||
|  |       name: "MPU6050 Accel Y" | ||||||
|  |     accel_z: | ||||||
|  |       name: "MPU6050 Accel z" | ||||||
|  |     gyro_x: | ||||||
|  |       name: "MPU6050 Gyro X" | ||||||
|  |     gyro_y: | ||||||
|  |       name: "MPU6050 Gyro Y" | ||||||
|  |     gyro_z: | ||||||
|  |       name: "MPU6050 Gyro z" | ||||||
|  |     temperature: | ||||||
|  |       name: "MPU6050 Temperature" | ||||||
|  |   - platform: ms5611 | ||||||
|  |     temperature: | ||||||
|  |       name: "Outside Temperature" | ||||||
|  |     pressure: | ||||||
|  |       name: "Outside Pressure" | ||||||
|  |     address: 0x77 | ||||||
|  |     update_interval: 15s | ||||||
|  |   - platform: pulse_counter | ||||||
|  |     name: "Pulse Counter" | ||||||
|  |     pin: GPIO12 | ||||||
|  |     count_mode: | ||||||
|  |       rising_edge: INCREMENT | ||||||
|  |       falling_edge: DECREMENT | ||||||
|  |     internal_filter: 13us | ||||||
|  |     update_interval: 15s | ||||||
|  |   - platform: rotary_encoder | ||||||
|  |     name: "Rotary Encoder" | ||||||
|  |     pin_a: GPIO23 | ||||||
|  |     pin_b: GPIO24 | ||||||
|  |     pin_reset: GPIO25 | ||||||
|  |     filters: | ||||||
|  |       - or: | ||||||
|  |         - debounce: 0.1s | ||||||
|  |         - delta: 10 | ||||||
|  |   - platform: sht3xd | ||||||
|  |     temperature: | ||||||
|  |       name: "Living Room Temperature 8" | ||||||
|  |     humidity: | ||||||
|  |       name: "Living Room Humidity 8" | ||||||
|  |     address: 0x44 | ||||||
|  |     update_interval: 15s | ||||||
|  |   - platform: template | ||||||
|  |     name: "Template Sensor" | ||||||
|  |     lambda: >- | ||||||
|  |       if (id(ultrasonic_sensor1).value > 1) { | ||||||
|  |         return 42.0; | ||||||
|  |       } else { | ||||||
|  |         return {}; | ||||||
|  |       } | ||||||
|  |     update_interval: 15s | ||||||
|  |   - platform: tsl2561 | ||||||
|  |     name: "TSL2561 Ambient Light" | ||||||
|  |     address: 0x39 | ||||||
|  |     update_interval: 15s | ||||||
|  |     is_cs_package: true | ||||||
|  |     integration_time: 402ms | ||||||
|  |     gain: 16x | ||||||
|  |   - platform: ultrasonic | ||||||
|  |     trigger_pin: GPIO24 | ||||||
|  |     echo_pin: | ||||||
|  |       number: GPIO23 | ||||||
|  |       inverted: true | ||||||
|  |     name: "Ultrasonic Sensor" | ||||||
|  |     timeout_meter: 5.5 | ||||||
|  |     id: ultrasonic_sensor1 | ||||||
|  |   - platform: uptime | ||||||
|  |     name: Uptime Sensor | ||||||
|  |   - platform: wifi_signal | ||||||
|  |     name: "WiFi Signal Sensor" | ||||||
|  |     update_interval: 15s | ||||||
|  |   - platform: xiaomi_miflora | ||||||
|  |     mac_address: 94:2B:FF:5C:91:61 | ||||||
|  |     temperature: | ||||||
|  |       name: "Xiaomi MiFlora Temperature" | ||||||
|  |     moisture: | ||||||
|  |       name: "Xiaomi MiFlora Moisture" | ||||||
|  |     illuminance: | ||||||
|  |       name: "Xiaomi MiFlora Illuminance" | ||||||
|  |     conductivity: | ||||||
|  |       name: "Xiaomi MiFlora Soil Conductivity" | ||||||
|  |     battery_level: | ||||||
|  |       name: "Xiaomi MiFlora Battery Level" | ||||||
|  |   - platform: xiaomi_mijia | ||||||
|  |     mac_address: 7A:80:8E:19:36:BA | ||||||
|  |     temperature: | ||||||
|  |       name: "Xiaomi MiJia Temperature" | ||||||
|  |     humidity: | ||||||
|  |       name: "Xiaomi MiJia Humidity" | ||||||
|  |     battery_level: | ||||||
|  |       name: "Xiaomi MiJia Battery Level" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | esp32_touch: | ||||||
|  |   setup_mode: False | ||||||
|  |   iir_filter: 10ms | ||||||
|  |   sleep_duration: 27ms | ||||||
|  |   measurement_duration: 8ms | ||||||
|  |   low_voltage_reference: 0.5V | ||||||
|  |   high_voltage_reference: 2.7V | ||||||
|  |   voltage_attenuation: 1.5V | ||||||
|  |  | ||||||
|  | binary_sensor: | ||||||
|  |   - platform: gpio | ||||||
|  |     pin: GPIO9 | ||||||
|  |     name: "Living Room Window" | ||||||
|  |     device_class: window | ||||||
|  |     filters: | ||||||
|  |       - invert: | ||||||
|  |       - delayed_on: 40ms | ||||||
|  |       - delayed_off: 40ms | ||||||
|  |     on_press: | ||||||
|  |       then: | ||||||
|  |         - lambda: >- | ||||||
|  |             ESP_LOGD("main", "Pressed"); | ||||||
|  |     on_release: | ||||||
|  |       then: | ||||||
|  |         - lambda: >- | ||||||
|  |             ESP_LOGD("main", "Released"); | ||||||
|  |     on_click: | ||||||
|  |       - min_length: 50ms | ||||||
|  |         max_length: 350ms | ||||||
|  |         then: | ||||||
|  |           - lambda: >- | ||||||
|  |               ESP_LOGD("main", "Clicked"); | ||||||
|  |       - then: | ||||||
|  |           - lambda: >- | ||||||
|  |               ESP_LOGD("main", "Clicked"); | ||||||
|  |     on_double_click: | ||||||
|  |       - min_length: 50ms | ||||||
|  |         max_length: 350ms | ||||||
|  |         then: | ||||||
|  |          - lambda: >- | ||||||
|  |              ESP_LOGD("main", "Double Clicked"); | ||||||
|  |       - then: | ||||||
|  |          - lambda: >- | ||||||
|  |              ESP_LOGD("main", "Double Clicked"); | ||||||
|  |     id: binary_sensor1 | ||||||
|  |   - platform: status | ||||||
|  |     name: "Living Room Status" | ||||||
|  |   - platform: esp32_ble_tracker | ||||||
|  |     mac_address: AC:37:43:77:5F:4C | ||||||
|  |     name: "ESP32 BLE Tracker Google Home Mini" | ||||||
|  |   - platform: esp32_touch | ||||||
|  |     name: "ESP32 Touch Pad GPIO27" | ||||||
|  |     pin: GPIO27 | ||||||
|  |     threshold: 1000 | ||||||
|  |   - platform: nextion | ||||||
|  |     page_id: 0 | ||||||
|  |     component_id: 2 | ||||||
|  |     name: "Nextion Component 2 Touch" | ||||||
|  |   - platform: template | ||||||
|  |     name: "Garage Door Open" | ||||||
|  |     lambda: >- | ||||||
|  |       if (isnan(id(my_sensor).value)) { | ||||||
|  |         // isnan checks if the ultrasonic sensor echo | ||||||
|  |         // has timed out, resulting in a NaN (not a number) state | ||||||
|  |         // in that case, return {} to indicate that we don't know. | ||||||
|  |         return {}; | ||||||
|  |       } else if (id(my_sensor).value > 30) { | ||||||
|  |         // Garage Door is open. | ||||||
|  |         return true; | ||||||
|  |       } else { | ||||||
|  |         // Garage Door is closed. | ||||||
|  |         return false; | ||||||
|  |       } | ||||||
|  |   - platform: pn532 | ||||||
|  |     uid: 74-10-37-94 | ||||||
|  |     name: "PN532 NFC Tag" | ||||||
|  |   - platform: rdm6300 | ||||||
|  |     uid: 7616525 | ||||||
|  |     name: "RDM6300 NFC Tag" | ||||||
|  |   - platform: gpio | ||||||
|  |     name: "PCF binary sensor" | ||||||
|  |     pin: | ||||||
|  |       pcf8574: pcf8574_hub | ||||||
|  |       number: 1 | ||||||
|  |       mode: INPUT | ||||||
|  |       inverted: True | ||||||
|  |  | ||||||
|  | pca9685: | ||||||
|  |   frequency: 500 | ||||||
|  |   address: 0x0 | ||||||
|  |  | ||||||
|  | output: | ||||||
|  |   - platform: gpio | ||||||
|  |     pin: GPIO26 | ||||||
|  |     id: gpio_26 | ||||||
|  |     power_supply: atx_power_supply | ||||||
|  |     inverted: False | ||||||
|  |   - platform: ledc | ||||||
|  |     pin: 19 | ||||||
|  |     id: gpio_19 | ||||||
|  |     frequency: 1500Hz | ||||||
|  |     bit_depth: 8 | ||||||
|  |     channel: 14 | ||||||
|  |     max_power: 0.5 | ||||||
|  |   - platform: pca9685 | ||||||
|  |     id: pca_0 | ||||||
|  |     channel: 0 | ||||||
|  |   - platform: pca9685 | ||||||
|  |     id: pca_1 | ||||||
|  |     channel: 1 | ||||||
|  |   - platform: pca9685 | ||||||
|  |     id: pca_2 | ||||||
|  |     channel: 2 | ||||||
|  |   - platform: pca9685 | ||||||
|  |     id: pca_3 | ||||||
|  |     channel: 3 | ||||||
|  |   - platform: pca9685 | ||||||
|  |     id: pca_4 | ||||||
|  |     channel: 4 | ||||||
|  |   - platform: pca9685 | ||||||
|  |     id: pca_5 | ||||||
|  |     channel: 5 | ||||||
|  |   - platform: pca9685 | ||||||
|  |     id: pca_6 | ||||||
|  |     channel: 6 | ||||||
|  |   - platform: pca9685 | ||||||
|  |     id: pca_7 | ||||||
|  |     channel: 7 | ||||||
|  |   - platform: gpio | ||||||
|  |     id: id2 | ||||||
|  |     pin: | ||||||
|  |       pcf8574: pcf8574_hub | ||||||
|  |       number: 0 | ||||||
|  |       mode: OUTPUT | ||||||
|  |       inverted: False | ||||||
|  |  | ||||||
|  | light: | ||||||
|  |   - platform: binary | ||||||
|  |     name: "Desk Lamp" | ||||||
|  |     output: gpio_26 | ||||||
|  |     effects: | ||||||
|  |       - strobe: | ||||||
|  |       - strobe: | ||||||
|  |           name: "My Strobe" | ||||||
|  |           colors: | ||||||
|  |             - state: True | ||||||
|  |               duration: 250ms | ||||||
|  |             - state: False | ||||||
|  |               duration: 250ms | ||||||
|  |   - platform: monochromatic | ||||||
|  |     name: "Kitchen Lights" | ||||||
|  |     id: kitchen | ||||||
|  |     output: gpio_19 | ||||||
|  |     gamma_correct: 2.8 | ||||||
|  |     default_transition_length: 2s | ||||||
|  |     effects: | ||||||
|  |       - strobe: | ||||||
|  |       - flicker: | ||||||
|  |       - flicker: | ||||||
|  |           name: "My Flicker" | ||||||
|  |           alpha: 98% | ||||||
|  |           intensity: 1.5% | ||||||
|  |       - lambda: | ||||||
|  |           name: My Custom Effect | ||||||
|  |           update_interval: 1s | ||||||
|  |           lambda: |- | ||||||
|  |             static int state = 0; | ||||||
|  |             state += 1; | ||||||
|  |             if (state == 4) | ||||||
|  |               state = 0; | ||||||
|  |   - platform: rgb | ||||||
|  |     name: "Living Room Lights" | ||||||
|  |     red: pca_0 | ||||||
|  |     green: pca_1 | ||||||
|  |     blue: pca_2 | ||||||
|  |   - platform: rgbw | ||||||
|  |     name: "Living Room Lights 2" | ||||||
|  |     red: pca_3 | ||||||
|  |     green: pca_4 | ||||||
|  |     blue: pca_5 | ||||||
|  |     white: pca_6 | ||||||
|  |   - platform: rgbww | ||||||
|  |     name: "Living Room Lights 2" | ||||||
|  |     red: pca_3 | ||||||
|  |     green: pca_4 | ||||||
|  |     blue: pca_5 | ||||||
|  |     cold_white: pca_6 | ||||||
|  |     warm_white: pca_6 | ||||||
|  |     cold_white_color_temperature: 153 mireds | ||||||
|  |     warm_white_color_temperature: 500 mireds | ||||||
|  |   - platform: cwww | ||||||
|  |     name: "Living Room Lights 2" | ||||||
|  |     cold_white: pca_6 | ||||||
|  |     warm_white: pca_6 | ||||||
|  |     cold_white_color_temperature: 153 mireds | ||||||
|  |     warm_white_color_temperature: 500 mireds | ||||||
|  |   - platform: fastled_clockless | ||||||
|  |     chipset: WS2811 | ||||||
|  |     pin: GPIO23 | ||||||
|  |     num_leds: 60 | ||||||
|  |     rgb_order: BRG | ||||||
|  |     max_refresh_rate: 20ms | ||||||
|  |     power_supply: atx_power_supply | ||||||
|  |     name: "FastLED WS2811 Light" | ||||||
|  |     effects: | ||||||
|  |     - fastled_color_wipe: | ||||||
|  |     - fastled_color_wipe: | ||||||
|  |         name: Color Wipe Effect With Custom Values | ||||||
|  |         colors: | ||||||
|  |         - red: 100% | ||||||
|  |           green: 100% | ||||||
|  |           blue: 100% | ||||||
|  |           num_leds: 1 | ||||||
|  |         - red: 0% | ||||||
|  |           green: 0% | ||||||
|  |           blue: 0% | ||||||
|  |           num_leds: 1 | ||||||
|  |         add_led_interval: 100ms | ||||||
|  |         reverse: False | ||||||
|  |     - fastled_scan: | ||||||
|  |     - fastled_scan: | ||||||
|  |         name: Scan Effect With Custom Values | ||||||
|  |         move_interval: 100ms | ||||||
|  |     - fastled_twinkle: | ||||||
|  |     - fastled_twinkle: | ||||||
|  |         name: Twinkle Effect With Custom Values | ||||||
|  |         twinkle_probability: 5% | ||||||
|  |         progress_interval: 4ms | ||||||
|  |     - fastled_random_twinkle: | ||||||
|  |     - fastled_random_twinkle: | ||||||
|  |         name: Random Twinkle Effect With Custom Values | ||||||
|  |         twinkle_probability: 5% | ||||||
|  |         progress_interval: 32ms | ||||||
|  |     - fastled_fireworks: | ||||||
|  |     - fastled_fireworks: | ||||||
|  |         name: Fireworks Effect With Custom Values | ||||||
|  |         update_interval: 32ms | ||||||
|  |         spark_probability: 10% | ||||||
|  |         use_random_color: false | ||||||
|  |         fade_out_rate: 120 | ||||||
|  |     - fastled_flicker: | ||||||
|  |     - fastled_flicker: | ||||||
|  |         name: Flicker Effect With Custom Values | ||||||
|  |         update_interval: 16ms | ||||||
|  |         intensity: 5% | ||||||
|  |   - platform: fastled_spi | ||||||
|  |     chipset: WS2801 | ||||||
|  |     data_pin: GPIO23 | ||||||
|  |     clock_pin: GPIO22 | ||||||
|  |     num_leds: 60 | ||||||
|  |     rgb_order: BRG | ||||||
|  |     name: "FastLED SPI Light" | ||||||
|  |  | ||||||
|  | remote_transmitter: | ||||||
|  |   - pin: 32 | ||||||
|  |  | ||||||
|  | switch: | ||||||
|  |   - platform: gpio | ||||||
|  |     pin: GPIO25 | ||||||
|  |     name: "Living Room Dehumidifier" | ||||||
|  |     icon: "mdi:restart" | ||||||
|  |     inverted: True | ||||||
|  |     command_topic: custom_command_topic | ||||||
|  |   - platform: remote_transmitter | ||||||
|  |     name: "Panasonic TV Off" | ||||||
|  |     nec: | ||||||
|  |       address: 0x4242 | ||||||
|  |       command: 0x8484 | ||||||
|  |     repeat: 25 | ||||||
|  |   - platform: remote_transmitter | ||||||
|  |     name: "Panasonic TV Off" | ||||||
|  |     lg: | ||||||
|  |       data: 4294967295 | ||||||
|  |       nbits: 28 | ||||||
|  |     repeat: 25 | ||||||
|  |   - platform: remote_transmitter | ||||||
|  |     name: "Panasonic TV Off" | ||||||
|  |     sony: | ||||||
|  |       data: 0xABCDEF | ||||||
|  |       nbits: 12 | ||||||
|  |     repeat: 25 | ||||||
|  |   - platform: remote_transmitter | ||||||
|  |     name: "Panasonic TV Off" | ||||||
|  |     panasonic: | ||||||
|  |       address: 0x4004 | ||||||
|  |       command: 0x1000BCD | ||||||
|  |     repeat: 25 | ||||||
|  |   - platform: remote_transmitter | ||||||
|  |     name: "Panasonic TV Off" | ||||||
|  |     rc_switch_raw: | ||||||
|  |       code: '001010011001111101011011' | ||||||
|  |       protocol: 1 | ||||||
|  |     repeat: 25 | ||||||
|  |   - platform: remote_transmitter | ||||||
|  |     name: "Panasonic TV Off" | ||||||
|  |     rc_switch_type_a: | ||||||
|  |       group: '11001' | ||||||
|  |       device: '01000' | ||||||
|  |       state: True | ||||||
|  |       protocol: | ||||||
|  |         pulse_length: 175 | ||||||
|  |         sync: [1, 31] | ||||||
|  |         zero: [1, 3] | ||||||
|  |         one: [3, 1] | ||||||
|  |         inverted: False | ||||||
|  |     repeat: 25 | ||||||
|  |   - platform: remote_transmitter | ||||||
|  |     name: "Panasonic TV Off" | ||||||
|  |     rc_switch_type_b: | ||||||
|  |       address: 4 | ||||||
|  |       channel: 2 | ||||||
|  |       state: True | ||||||
|  |   - platform: remote_transmitter | ||||||
|  |     name: "Panasonic TV Off" | ||||||
|  |     rc_switch_type_c: | ||||||
|  |       family: 'a' | ||||||
|  |       group: 1 | ||||||
|  |       device: 2 | ||||||
|  |       state: True | ||||||
|  |   - platform: remote_transmitter | ||||||
|  |     name: "Panasonic TV Off" | ||||||
|  |     id: living_room_lights_on | ||||||
|  |     rc_switch_type_d: | ||||||
|  |       group: 'a' | ||||||
|  |       device: 2 | ||||||
|  |       state: True | ||||||
|  |   - platform: remote_transmitter | ||||||
|  |     name: "Panasonic TV Off" | ||||||
|  |     id: living_room_lights_off | ||||||
|  |     raw: | ||||||
|  |       carrier_frequency: 35kHz | ||||||
|  |       data: | ||||||
|  |       - 1000 | ||||||
|  |       - -1000 | ||||||
|  |   - platform: template | ||||||
|  |     name: Living Room Lights | ||||||
|  |     optimistic: True | ||||||
|  |     turn_on_action: | ||||||
|  |     - switch.turn_on: living_room_lights_on | ||||||
|  |     turn_off_action: | ||||||
|  |     - switch.turn_on: living_room_lights_off | ||||||
|  |   - platform: restart | ||||||
|  |     name: "Living Room Restart" | ||||||
|  |   - platform: shutdown | ||||||
|  |     name: "Living Room Shutdown" | ||||||
|  |   - platform: output | ||||||
|  |     name: "Generic Output" | ||||||
|  |     output: pca_6 | ||||||
|  |   - platform: template | ||||||
|  |     name: "Template Switch" | ||||||
|  |     id: my_switch | ||||||
|  |     lambda: |- | ||||||
|  |       if (id(binary_sensor1).value) { | ||||||
|  |         return true; | ||||||
|  |       } else { | ||||||
|  |         return {}; | ||||||
|  |       } | ||||||
|  |       id(my_switch).publish_state(false); | ||||||
|  |       id(my_switch).publish_state(true); | ||||||
|  |       if (id(my_switch).value) { | ||||||
|  |         // Switch is ON, do something here | ||||||
|  |         id(my_switch).write_state(false); | ||||||
|  |         id(my_switch).write_state(true); | ||||||
|  |       } else { | ||||||
|  |         // Switch is OFF, do something else here | ||||||
|  |       } | ||||||
|  |     optimistic: true | ||||||
|  |   - platform: uart | ||||||
|  |     name: "UART String Output" | ||||||
|  |     data: 'DataToSend' | ||||||
|  |   - platform: uart | ||||||
|  |     name: "UART Bytes Output" | ||||||
|  |     data: [0xDE, 0xAD, 0xBE, 0xEF] | ||||||
|  |  | ||||||
|  | fan: | ||||||
|  |   - platform: binary | ||||||
|  |     output: gpio_26 | ||||||
|  |     name: "Living Room Fan 1" | ||||||
|  |   - platform: speed | ||||||
|  |     output: pca_6 | ||||||
|  |     name: "Living Room Fan 2" | ||||||
|  |     speed: | ||||||
|  |       low: 0.45 | ||||||
|  |       medium: 0.75 | ||||||
|  |       high: 1.0 | ||||||
|  |  | ||||||
|  | display: | ||||||
|  | - platform: lcd_gpio | ||||||
|  |   dimensions: 18x4 | ||||||
|  |   data_pins: | ||||||
|  |   - GPIO19 | ||||||
|  |   - GPIO20 | ||||||
|  |   - GPIO21 | ||||||
|  |   - GPIO22 | ||||||
|  |   enable_pin: GPIO23 | ||||||
|  |   rs_pin: GPIO24 | ||||||
|  |   lambda: |- | ||||||
|  |     it.print("Hello World!"); | ||||||
|  | - platform: lcd_pcf8574 | ||||||
|  |   dimensions: 18x4 | ||||||
|  |   address: 0x3F | ||||||
|  |   lambda: |- | ||||||
|  |     it.print("Hello World!"); | ||||||
|  | - platform: max7219 | ||||||
|  |   cs_pin: GPIO23 | ||||||
|  |   num_chips: 1 | ||||||
|  |   lambda: |- | ||||||
|  |     it.print("01234567"); | ||||||
|  | - platform: nextion | ||||||
|  |   lambda: |- | ||||||
|  |     it.set_component_value("gauge", 50); | ||||||
|  |     it.set_component_text("textview", "Hello World!"); | ||||||
|  | - platform: ssd1306_i2c | ||||||
|  |   model: "SSD1306 128x64" | ||||||
|  |   reset_pin: GPIO23 | ||||||
|  |   address: 0x3C | ||||||
|  |   lambda: |- | ||||||
|  |     it.rectangle(0, 0, it.get_width(), it.get_height()); | ||||||
|  | - platform: ssd1306_spi | ||||||
|  |   model: "SSD1306 128x64" | ||||||
|  |   cs_pin: GPIO23 | ||||||
|  |   dc_pin: GPIO23 | ||||||
|  |   reset_pin: GPIO23 | ||||||
|  |   lambda: |- | ||||||
|  |     it.rectangle(0, 0, it.get_width(), it.get_height()); | ||||||
|  | - platform: waveshare_epaper | ||||||
|  |   cs_pin: GPIO23 | ||||||
|  |   dc_pin: GPIO23 | ||||||
|  |   busy_pin: GPIO23 | ||||||
|  |   reset_pin: GPIO23 | ||||||
|  |   model: 2.90in | ||||||
|  |   full_update_every: 30 | ||||||
|  |   lambda: |- | ||||||
|  |     it.rectangle(0, 0, it.get_width(), it.get_height()); | ||||||
|  |  | ||||||
|  | remote_receiver: | ||||||
|  |   pin: GPIO32 | ||||||
|  |   dump: all | ||||||
|  |  | ||||||
|  | esp32_ble_tracker: | ||||||
|  |   scan_interval: 300s | ||||||
|  |  | ||||||
|  | esp32_ble_beacon: | ||||||
|  |   type: iBeacon | ||||||
|  |   uuid: 'c29ce823-e67a-4e71-bff2-abaa32e77a98' | ||||||
|  |  | ||||||
|  | status_led: | ||||||
|  |   pin: GPIO2 | ||||||
|  |  | ||||||
|  | pn532: | ||||||
|  |   cs_pin: GPIO23 | ||||||
|  |   update_interval: 1s | ||||||
|  |  | ||||||
|  | rdm6300: | ||||||
|  |  | ||||||
|  | time: | ||||||
|  | - platform: sntp | ||||||
|  |   id: sntp_time | ||||||
|  |   servers: | ||||||
|  |   - 0.pool.ntp.org | ||||||
|  |   - 1.pool.ntp.org | ||||||
|  |   - 2.pool.ntp.org | ||||||
|  |  | ||||||
|  | cover: | ||||||
|  |   - platform: template | ||||||
|  |     name: "Template Cover" | ||||||
|  |     lambda: >- | ||||||
|  |       if (id(binary_sensor1).value) { | ||||||
|  |         return cover::COVER_OPEN; | ||||||
|  |       } else { | ||||||
|  |         return {}; | ||||||
|  |       } | ||||||
|  |     optimistic: true | ||||||
|  |  | ||||||
|  | debug: | ||||||
|  |  | ||||||
|  | pcf8574: | ||||||
|  |   - id: 'pcf8574_hub' | ||||||
|  |     address: 0x21 | ||||||
|  |     pcf8575: False | ||||||
		Reference in New Issue
	
	Block a user