From 69d25e247b2e1fe194fe3636dfaf87dec8cf6a8a Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Sat, 24 Nov 2018 14:38:02 +0100 Subject: [PATCH] Update esphomeyaml-edge --- esphomeyaml-edge/Dockerfile | 87 ++++++++++++--- esphomeyaml-edge/README.md | 100 ++++++++++++++++++ esphomeyaml-edge/build.json | 16 +-- esphomeyaml-edge/config.json | 37 ++++--- esphomeyaml-edge/icon.png | Bin 0 -> 2892 bytes esphomeyaml-edge/logo.png | Bin 0 -> 8763 bytes .../rootfs/etc/cont-init.d/10-requirements.sh | 35 ++++++ .../rootfs/etc/cont-init.d/20-nginx.sh | 24 +++++ .../rootfs/etc/nginx/nginx-ssl.conf | 62 +++++++++++ esphomeyaml-edge/rootfs/etc/nginx/nginx.conf | 46 ++++++++ .../rootfs/etc/services.d/esphomeyaml/finish | 9 ++ .../rootfs/etc/services.d/esphomeyaml/run | 14 +++ .../rootfs/etc/services.d/nginx/finish | 9 ++ .../rootfs/etc/services.d/nginx/run | 10 ++ .../rootfs/opt/pio/platformio.ini | 12 +++ esphomeyaml-edge/screenshot.png | Bin 0 -> 51524 bytes 16 files changed, 424 insertions(+), 37 deletions(-) create mode 100644 esphomeyaml-edge/README.md create mode 100644 esphomeyaml-edge/icon.png create mode 100644 esphomeyaml-edge/logo.png create mode 100755 esphomeyaml-edge/rootfs/etc/cont-init.d/10-requirements.sh create mode 100755 esphomeyaml-edge/rootfs/etc/cont-init.d/20-nginx.sh create mode 100755 esphomeyaml-edge/rootfs/etc/nginx/nginx-ssl.conf create mode 100755 esphomeyaml-edge/rootfs/etc/nginx/nginx.conf create mode 100755 esphomeyaml-edge/rootfs/etc/services.d/esphomeyaml/finish create mode 100755 esphomeyaml-edge/rootfs/etc/services.d/esphomeyaml/run create mode 100755 esphomeyaml-edge/rootfs/etc/services.d/nginx/finish create mode 100755 esphomeyaml-edge/rootfs/etc/services.d/nginx/run create mode 100644 esphomeyaml-edge/rootfs/opt/pio/platformio.ini create mode 100644 esphomeyaml-edge/screenshot.png diff --git a/esphomeyaml-edge/Dockerfile b/esphomeyaml-edge/Dockerfile index 6c81bcaf29..7816df2907 100644 --- a/esphomeyaml-edge/Dockerfile +++ b/esphomeyaml-edge/Dockerfile @@ -1,24 +1,81 @@ -# Dockerfile for HassIO edge add-on -ARG BUILD_FROM=homeassistant/amd64-base-ubuntu:latest +ARG BUILD_FROM=hassioaddons/ubuntu-base:2.2.0 +# hadolint ignore=DL3006 FROM ${BUILD_FROM} -RUN apt-get update && apt-get install -y --no-install-recommends \ +# Set shell +SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +# Copy root filesystem +COPY rootfs / + +# Setup base system +ARG BUILD_ARCH=amd64 + +# Copy root filesystem +COPY rootfs / + +RUN \ + # Temporarily move nginx.conf (otherwise dpkg fails) + mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bkp \ + # Install add-on dependencies + && apt-get update \ + && apt-get install -y --no-install-recommends \ + # Python for esphomeyaml python \ python-pip \ python-setuptools \ + # Python Pillow for display component python-pil \ + # Git for esphomelib downloads git \ - && 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 + # Ping for dashboard online/offline status + iputils-ping \ + # NGINX proxy + nginx \ + \ + && mv /etc/nginx/nginx.conf.bkp /etc/nginx/nginx.conf \ + \ + && pip2 install --no-cache-dir --no-binary :all: https://github.com/OttoWinter/esphomeyaml/archive/dev.zip \ + \ + # tzlocal for automatic timezone detection, requests for HassIO API + && pip2 install --no-cache-dir --no-binary :all: tzlocal \ + \ + # Change some platformio settings + && platformio settings set enable_telemetry No \ + && platformio settings set check_libraries_interval 1000000 \ + && platformio settings set check_platformio_interval 1000000 \ + && platformio settings set check_platforms_interval 1000000 \ + \ + # Build an empty platformio project to force platformio to install all fw build dependencies + # The return-code will be non-zero since there's nothing to build. + && (platformio run -d /opt/pio; echo "Done") \ + \ + # Cleanup + && rm -fr \ + /tmp/* \ + /var/{cache,log}/* \ + /var/lib/apt/lists/* \ + /opt/pio/ -COPY platformio.ini /pio/platformio.ini -RUN platformio run -d /pio; rm -rf /pio +# Build arugments +ARG BUILD_DATE +ARG BUILD_REF +ARG BUILD_VERSION -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"] +# Labels +LABEL \ + io.hass.name="esphomeyaml" \ + io.hass.description="Manage and program ESP8266/ESP32 microcontrollers through YAML configuration files" \ + io.hass.arch="${BUILD_ARCH}" \ + io.hass.type="addon" \ + io.hass.version=${BUILD_VERSION} \ + maintainer="Otto Winter " \ + org.label-schema.description="Manage and program ESP8266/ESP32 microcontrollers through YAML configuration files" \ + org.label-schema.build-date=${BUILD_DATE} \ + org.label-schema.name="esphomeyaml" \ + org.label-schema.schema-version="1.0" \ + org.label-schema.url="https://esphomelib.com" \ + org.label-schema.usage="https://github.com/OttoWinter/esphomeyaml/tree/dev/esphomeyaml-edge/README.md" \ + org.label-schema.vcs-ref=${BUILD_REF} \ + org.label-schema.vcs-url="https://github.com/OttoWinter/esphomeyaml" \ + org.label-schema.vendor="esphomeyaml" diff --git a/esphomeyaml-edge/README.md b/esphomeyaml-edge/README.md new file mode 100644 index 0000000000..bf395f50ca --- /dev/null +++ b/esphomeyaml-edge/README.md @@ -0,0 +1,100 @@ +# Esphomeyaml HassIO Add-On + +![esphomeyaml logo][logo.png] + +## WARNING! THIS IS AN EDGE VERSION! + +You're viewing the edge (latest build) of the esphomeyaml add-on. This +contains the latest source code with all the latest features. However, the +code in this version of the add-on is unstable and might break at any moment. + +It is intended for: + +- people who want to test the latest features. +- people who can manually re-flash their node via USB if something breaks. +- Developers + +## About + +This add-on allows you to manage and program your ESP8266 and ESP32 based microcontrollers +directly through HassIO **with no programming experience required**. All you need to do +is write YAML configuration files; the rest (over-the-air updates, compiling) is all +handled by esphomeyaml. + +[Click here for the full documentation][docs] + +![esphomeyaml dashboard screenshot][screenshot.png] + +## Installation + +To install this HassIO add-on you need to add the esphomeyaml add-on repository +first: + +1. [Add esphomeyaml's HassIO add-ons repository][https://github.com/OttoWinter/esphomeyaml] to your HassIO instance. You can do this by navigating to the "Add-on Store" tab in the HassIO panel and then entering https://github.com/OttoWinter/esphomeyaml in the "Add new repository by URL" field. +2. Now scroll down to the bottom of the page and select the "esphomeyaml-edge" add-on. +3. Press install to download the add-on and unpack it on your machine. This can take some time. +4. Optional: If you're using SSL certificates and want to encrypt your communication to this add-on, please enter `true` into the `ssl` field and set the `fullchain` and `certfile` options accordingly. +5. Start the add-on, check the logs of the add-on to see if everything went well. +6. Click "OPEN WEB UI" to open the esphomeyaml dashboard. You will be asked for your Home Assistant credentials - esphomeyaml uses HassIO's authentication system to log you in. + +**NOTE**: Installation on RPis running in 64-bit mode is currently not possible. Please use the 32-bit variant of HassOS instead. + +## Docker status + +![Supports armhf Architecture][armhf-shield] +![Supports amd64 Architecture][amd64-shield] +![Supports i386 Architecture][i386-shield] + +[![Docker Layers][layers-shield]][microbadger] +[![Docker Pulls][pulls-shield]][dockerhub] + +## Configuration + +**Note**: _Remember to restart the add-on when the configuration is changed._ + +Example add-on configuration: + +```json +{ + "ssl": false, + "certfile": "fullchain.pem", + "keyfile": "privkey.pem" +} +``` + +### Option: `ssl` + +Enables/Disables encrypted SSL (HTTPS) connections to the web server of this add-on. Set it to `true` to encrypt communications, `false` otherwise. Please note that if you set this to `true` you must also specify a `certfile` and `keyfile`. + +### Option: `certfile` + +The certificate file to use for SSL. + +**Note**: _The file MUST be stored in `/ssl/`, which is the default for Hass.io_ + +### Option: `keyfile` + +The private key file to use for SSL. + +**Note**: _The file MUST be stored in `/ssl/`, which is the default for Hass.io_ + +### Option: `leave_front_door_open` + +Adding this option to the add-on configuration allows you to disable +authentication by setting it to `true`. + +## Embedding into Home Assistant + +It is possible to embed the esphomeyaml dashboard directly into +Home Assistant, allowing you to access your ESP nodes through +the Home Assistant frontend using the `panel_iframe` component. + +Example configuration: + +```yaml +panel_iframe: + esphomeyaml: + title: esphomeyaml Dashboard + icon: mdi:code-brackets + url: https://addres.to.your.hass.io:6052 +``` diff --git a/esphomeyaml-edge/build.json b/esphomeyaml-edge/build.json index f60fa4f7fe..eb0295384a 100644 --- a/esphomeyaml-edge/build.json +++ b/esphomeyaml-edge/build.json @@ -1,10 +1,10 @@ { - "squash": false, - "build_from": { - "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": {} + "squash": false, + "build_from": { + "aarch64": "hassioaddons/ubuntu-base-aarch64:2.2.0", + "amd64": "hassioaddons/ubuntu-base-amd64:2.2.0", + "armhf": "hassioaddons/ubuntu-base-armhf:2.2.0", + "i386": "hassioaddons/ubuntu-base-i386:2.2.0" + }, + "args": {} } diff --git a/esphomeyaml-edge/config.json b/esphomeyaml-edge/config.json index 951d7d56cc..afdb500c6f 100644 --- a/esphomeyaml-edge/config.json +++ b/esphomeyaml-edge/config.json @@ -2,32 +2,41 @@ "name": "esphomeyaml-edge", "version": "dev", "slug": "esphomeyaml-edge", - "description": "Development build of the esphomeyaml HassIO add-on.", - "url": "https://esphomelib.com/esphomeyaml/index.html", - "startup": "application", + "description": "Development Version! Manage and program ESP8266/ESP32 microcontrollers through YAML configuration files", + "url": "https://github.com/OttoWinter/esphomeyaml/tree/dev/esphomeyaml-edge/README.md", "webui": "http://[HOST]:[PORT:6052]", - "boot": "auto", - "ports": { - "6052/tcp": 6052, - "6053/tcp": 6053 - }, + "startup": "application", "arch": [ "aarch64", "amd64", "armhf", "i386" ], - "auto_uart": true, + "hassio_api": true, + "auth_api": true, + "services": [ + "mqtt:want" + ], + "hassio_role": "default", + "homeassistant_api": false, + "host_network": false, + "boot": "auto", + "ports": { + "6052/tcp": 6052 + }, "map": [ + "ssl", "config:rw" ], "options": { - "password": "" + "ssl": false, + "certfile": "fullchain.pem", + "keyfile": "privkey.pem" }, "schema": { - "password": "str?" - }, - "environment": { - "ESPHOMEYAML_OTA_HOST_PORT": "6053" + "ssl": "bool", + "certfile": "str", + "keyfile": "str", + "leave_front_door_open": "bool?" } } diff --git a/esphomeyaml-edge/icon.png b/esphomeyaml-edge/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6018ac5fc759ba525ed66fbd1482dbe4448e46bb GIT binary patch literal 2892 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 C$R%I^ literal 0 HcmV?d00001 diff --git a/esphomeyaml-edge/logo.png b/esphomeyaml-edge/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cd37247307d32fce33fc7b6b1926d89b1316013a GIT binary patch literal 8763 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 R9~?cfR1`GiYh*3M{|~nq&&U7( literal 0 HcmV?d00001 diff --git a/esphomeyaml-edge/rootfs/etc/cont-init.d/10-requirements.sh b/esphomeyaml-edge/rootfs/etc/cont-init.d/10-requirements.sh new file mode 100755 index 0000000000..3461cc024c --- /dev/null +++ b/esphomeyaml-edge/rootfs/etc/cont-init.d/10-requirements.sh @@ -0,0 +1,35 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: esphomeyaml +# This files check if all user configuration requirements are met +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +# Check SSL requirements, if enabled +if hass.config.true 'ssl'; then + if ! hass.config.has_value 'certfile'; then + hass.die 'SSL is enabled, but no certfile was specified.' + fi + + if ! hass.config.has_value 'keyfile'; then + hass.die 'SSL is enabled, but no keyfile was specified' + fi + + if ! hass.file_exists "/ssl/$(hass.config.get 'certfile')"; then + if ! hass.file_exists "/ssl/$(hass.config.get 'keyfile')"; then + # Both files are missing, let's print a friendlier error message + text = "You enabled encrypted connections using the \"ssl\": true option. + However, the SSL files \"$(hass.config.get 'certfile')\" and \"$(hass.config.get 'keyfile')\" + were not found. If you're using HassIO on your local network and don't want + to encrypt connections to the esphomeyaml dashboard, you can manually disable + SSL by setting \"ssl\" to false." + hass.die "${text}" + fi + hass.die 'The configured certfile is not found' + fi + + if ! hass.file_exists "/ssl/$(hass.config.get 'keyfile')"; then + hass.die 'The configured keyfile is not found' + fi +fi diff --git a/esphomeyaml-edge/rootfs/etc/cont-init.d/20-nginx.sh b/esphomeyaml-edge/rootfs/etc/cont-init.d/20-nginx.sh new file mode 100755 index 0000000000..768fb71bf1 --- /dev/null +++ b/esphomeyaml-edge/rootfs/etc/cont-init.d/20-nginx.sh @@ -0,0 +1,24 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: esphomeyaml +# Configures NGINX for use with esphomeyaml +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +declare certfile +declare keyfile + +mkdir -p /var/log/nginx + +# Enable SSL +if hass.config.true 'ssl'; then + rm /etc/nginx/nginx.conf + mv /etc/nginx/nginx-ssl.conf /etc/nginx/nginx.conf + + certfile=$(hass.config.get 'certfile') + keyfile=$(hass.config.get 'keyfile') + + sed -i "s/%%certfile%%/${certfile}/g" /etc/nginx/nginx.conf + sed -i "s/%%keyfile%%/${keyfile}/g" /etc/nginx/nginx.conf +fi diff --git a/esphomeyaml-edge/rootfs/etc/nginx/nginx-ssl.conf b/esphomeyaml-edge/rootfs/etc/nginx/nginx-ssl.conf new file mode 100755 index 0000000000..81484f5b6d --- /dev/null +++ b/esphomeyaml-edge/rootfs/etc/nginx/nginx-ssl.conf @@ -0,0 +1,62 @@ +worker_processes 1; +pid /var/run/nginx.pid; +error_log stderr; + +events { + worker_connections 1024; +} + +http { + access_log stdout; + include mime.types; + default_type application/octet-stream; + sendfile on; + keepalive_timeout 65; + + upstream esphomeyaml { + ip_hash; + server 127.0.0.1:80; + } + map $http_upgrade $connection_upgrade { + default upgrade; + '' close; + } + + server { + server_name hassio.local; + listen 6052 default_server ssl; + root /dev/null; + + ssl_certificate /ssl/%%certfile%%; + ssl_certificate_key /ssl/%%keyfile%%; + ssl_protocols TLSv1.2; + ssl_prefer_server_ciphers on; + ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA; + ssl_ecdh_curve secp384r1; + ssl_session_timeout 10m; + ssl_session_cache shared:SSL:10m; + ssl_session_tickets off; + ssl_stapling on; + ssl_stapling_verify on; + + # Redirect http requests to https on the same port. + # https://rageagainstshell.com/2016/11/redirect-http-to-https-on-the-same-port-in-nginx/ + error_page 497 https://$http_host$request_uri; + + location / { + proxy_redirect off; + proxy_pass http://esphomeyaml; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Authorization ""; + + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_set_header X-NginX-Proxy true; + } + } +} diff --git a/esphomeyaml-edge/rootfs/etc/nginx/nginx.conf b/esphomeyaml-edge/rootfs/etc/nginx/nginx.conf new file mode 100755 index 0000000000..203e1ac035 --- /dev/null +++ b/esphomeyaml-edge/rootfs/etc/nginx/nginx.conf @@ -0,0 +1,46 @@ +worker_processes 1; +pid /var/run/nginx.pid; +error_log stderr; + +events { + worker_connections 1024; +} + +http { + access_log stdout; + include mime.types; + default_type application/octet-stream; + sendfile on; + keepalive_timeout 65; + + upstream esphomeyaml { + ip_hash; + server 127.0.0.1:80; + } + map $http_upgrade $connection_upgrade { + default upgrade; + '' close; + } + + server { + server_name hassio.local; + listen 6052 default_server; + root /dev/null; + + location / { + proxy_redirect off; + proxy_pass http://esphomeyaml; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Authorization ""; + + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_set_header X-NginX-Proxy true; + } + } +} diff --git a/esphomeyaml-edge/rootfs/etc/services.d/esphomeyaml/finish b/esphomeyaml-edge/rootfs/etc/services.d/esphomeyaml/finish new file mode 100755 index 0000000000..4d0e9a35ff --- /dev/null +++ b/esphomeyaml-edge/rootfs/etc/services.d/esphomeyaml/finish @@ -0,0 +1,9 @@ +#!/usr/bin/execlineb -S0 +# ============================================================================== +# Community Hass.io Add-ons: esphomeyaml +# Take down the S6 supervision tree when esphomeyaml fails +# ============================================================================== +if -n { s6-test $# -ne 0 } +if -n { s6-test ${1} -eq 256 } + +s6-svscanctl -t /var/run/s6/services diff --git a/esphomeyaml-edge/rootfs/etc/services.d/esphomeyaml/run b/esphomeyaml-edge/rootfs/etc/services.d/esphomeyaml/run new file mode 100755 index 0000000000..47b600d2f4 --- /dev/null +++ b/esphomeyaml-edge/rootfs/etc/services.d/esphomeyaml/run @@ -0,0 +1,14 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: esphomeyaml +# Runs the esphomeyaml dashboard +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +if hass.config.true 'leave_front_door_open'; then + export DISABLE_HA_AUTHENTICATION=true +fi + +hass.log.info "Starting esphomeyaml dashboard..." +exec esphomeyaml /config/esphomeyaml dashboard --port 80 --hassio diff --git a/esphomeyaml-edge/rootfs/etc/services.d/nginx/finish b/esphomeyaml-edge/rootfs/etc/services.d/nginx/finish new file mode 100755 index 0000000000..e0c2ac25ef --- /dev/null +++ b/esphomeyaml-edge/rootfs/etc/services.d/nginx/finish @@ -0,0 +1,9 @@ +#!/usr/bin/execlineb -S0 +# ============================================================================== +# Community Hass.io Add-ons: esphomeyaml +# Take down the S6 supervision tree when NGINX fails +# ============================================================================== +if -n { s6-test $# -ne 0 } +if -n { s6-test ${1} -eq 256 } + +s6-svscanctl -t /var/run/s6/services diff --git a/esphomeyaml-edge/rootfs/etc/services.d/nginx/run b/esphomeyaml-edge/rootfs/etc/services.d/nginx/run new file mode 100755 index 0000000000..51c18ab9a9 --- /dev/null +++ b/esphomeyaml-edge/rootfs/etc/services.d/nginx/run @@ -0,0 +1,10 @@ +#!/usr/bin/with-contenv bash +# ============================================================================== +# Community Hass.io Add-ons: esphomeyaml +# Runs the NGINX proxy +# ============================================================================== +# shellcheck disable=SC1091 +source /usr/lib/hassio-addons/base.sh + +hass.log.info "Starting NGINX..." +exec nginx -g "daemon off;" diff --git a/esphomeyaml-edge/rootfs/opt/pio/platformio.ini b/esphomeyaml-edge/rootfs/opt/pio/platformio.ini new file mode 100644 index 0000000000..7f6ab6851d --- /dev/null +++ b/esphomeyaml-edge/rootfs/opt/pio/platformio.ini @@ -0,0 +1,12 @@ +; This file allows the docker build file to install the required platformio +; platforms + +[env:espressif8266] +platform = espressif8266 +board = nodemcuv2 +framework = arduino + +[env:espressif32] +platform = espressif32 +board = nodemcu-32s +framework = arduino diff --git a/esphomeyaml-edge/screenshot.png b/esphomeyaml-edge/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..193e01589ba6e56cf3dd4f94b6a959c25d9d611f GIT binary patch literal 51524 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 rr3@ofYtdGu711WE