diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml new file mode 100644 index 0000000..327019d --- /dev/null +++ b/.github/workflows/docker-image.yml @@ -0,0 +1,58 @@ +name: Docker Image Homehub + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + build-and-push-image: + runs-on: ubuntu-latest + # Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job. + permissions: + contents: read + packages: write + attestations: write + id-token: write + # + steps: + - name: Checkout repository + uses: actions/checkout@v4 + # Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here. + - name: Log in to the Container registry + uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + # This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` "meta" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels. + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + # This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages. + # It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see "[Usage](https://github.com/docker/build-push-action#usage)" in the README of the `docker/build-push-action` repository. + # It uses the `tags` and `labels` parameters to tag and label the image with the output from the "meta" step. + - name: Build and push Docker image + id: push + uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + + # This step generates an artifact attestation for the image, which is an unforgeable statement about where and how it was built. It increases supply chain security for people who consume the image. For more information, see "[AUTOTITLE](/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds)." + - name: Generate artifact attestation + uses: actions/attest-build-provenance@v1 + with: + subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}} + subject-digest: ${{ steps.push.outputs.digest }} + push-to-registry: true + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..15fa12a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,24 @@ +FROM alpine:latest +LABEL description="Alpine based image with apache2 and php8 for HomeHub." + +# Setup apache and php +RUN apk --no-cache --update \ + add apache2 \ + curl \ + php83-apache2 \ + php83-curl \ + php83-xml \ + php83-simplexml \ + php83-mbstring \ + php83-ctype \ + && mkdir /htdocs + +COPY ./ /htdocs/ +COPY docker-entrypoint.sh / +RUN chmod +x /docker-entrypoint.sh + +EXPOSE 80 + +HEALTHCHECK CMD wget -q --no-cache --spider localhost + +ENTRYPOINT ["/docker-entrypoint.sh"] diff --git a/README.md b/README.md index 992d286..e3dfada 100644 --- a/README.md +++ b/README.md @@ -55,5 +55,31 @@ Bei folgenden Komponenten lässt sich durch Angabe von ``"showtime":"true"`` die - Program - SysVar +## Docker Integration +``` +docker run \ +-d \ +--name=HomeHub \ +--restart unless-stopped \ +-p 8080:80 \ +-e TZ=Europe/Berlin \ +-v /FOLDER/OF/YOUR/CONFIG:/htdocs/config \ +ghcr.io/etofi/homehub_docker:master +``` + +Verfügbare Parameters im Detail: + +| Parameter | Optional | Beispiel | Erklärung | +| ---- | --- | --- | --- | +| `TIMEZONE` | yes | Europe/Berlin | Timezone im Container | +| `-p` | no | 80:8080 | Zuweisung des Apache2 Port innerhalb dieses Containers auf den Docker-Host Port (Bridge Mode). Mit dieser Konfiguration kann HomeHub dann über Port 8080 des Docker-Hosts erreicht werden, z. B. 192.168.178.100:8080| + +Volumes: + +| Volume | Erklärung | +| ---- | --- | +| `/FOLDER/OF/YOUR/CONFIG` | Das Verzeichnis /htdocs/config, in dem die HomeHub-Einstellungen gespeichert werden sollen. Dieser Ordner befindet sich auf dem PC, auf dem Docker ausgeführt wird und die Dateien aus dem Verzeichnis config werden dort abgelegt. Sie werden dann automatisch an die HomeHub-Docker-Instanz weitergeleitet. | + + ## Lizenzen HomeHub nutzt [jQuery](https://jquery.com/license/), [Chartjs](Chartjs.org), [knx-uf-iconset](https://github.com/OpenAutomationProject/knx-uf-iconset), [Bootstrap](https://getbootstrap.com/) diff --git a/components/HmIP-eTRV-3.php b/components/HmIP-eTRV-3.php new file mode 100644 index 0000000..0da9ef7 --- /dev/null +++ b/components/HmIP-eTRV-3.php @@ -0,0 +1,75 @@ +' + . '
' + . '
' . $component['name'] . '
' + . '
' + . '' + . '' + . '' + . '' + . '' + . '' + . '' + . '
' + . '
' + . '
' + . '
+
' + . '
Temperatur: ' + . '
' + . '' + . '' + . '' + . '' + . '
' + . '   Heizprofil: ' + . '
' + . '' + . '' + . '' + . '
' + . '   Kühlprofil: ' + . '
' + . '' + . '' + . '' + . '
' + . '
' + . '
' + . '
' + . '
' + . '' + . '' + . '
' + . '
' + . '
' + . ''; + } +} diff --git a/components/HmIP-eTRV-F.php b/components/HmIP-eTRV-F.php index e9b1664..3ba7721 100644 --- a/components/HmIP-eTRV-F.php +++ b/components/HmIP-eTRV-F.php @@ -33,7 +33,7 @@ function HmIP_eTRV_F($component) { . '' . '' . '' - . '   Profil: ' + . '   Heizprofil: ' . '
' . '' - . '
' - . '' + . '' + . '   Kühlprofil: ' + . '
' + . '' + . '' + . '' + . '
' + . '' . '' . '
' . '
' diff --git a/config/mapping.json b/config/mapping.json index d861fb8..e6f8ef3 100644 --- a/config/mapping.json +++ b/config/mapping.json @@ -481,6 +481,10 @@ "name": "HmIP-eTRV-F", "icon": "sani_heating.png" }, + { + "name": "HmIP-eTRV-3", + "icon": "sani_heating.png" + }, { "name": "HmIP-eTRV-2I9F", "icon": "sani_heating.png" diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100644 index 0000000..51ed8b4 --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +# Exit on non defined variables and on non zero exit codes +set -eu + +SERVER_ADMIN="${SERVER_ADMIN:-you@example.com}" +HTTP_SERVER_NAME="${HTTP_SERVER_NAME:-www.example.com}" +HTTPS_SERVER_NAME="${HTTPS_SERVER_NAME:-www.example.com}" +LOG_LEVEL="${LOG_LEVEL:-info}" +TZ="${TZ:-UTC}" +PHP_MEMORY_LIMIT="${PHP_MEMORY_LIMIT:-256M}" + +echo 'Updating configurations' + +# Change Server Admin, Name, Document Root and Startpage +sed -i "s/ServerAdmin\ you@example.com/ServerAdmin\ ${SERVER_ADMIN}/" /etc/apache2/httpd.conf +sed -i "s/#ServerName\ www.example.com:80/ServerName\ ${HTTP_SERVER_NAME}/" /etc/apache2/httpd.conf +sed -i 's#^DocumentRoot ".*#DocumentRoot "/htdocs"#g' /etc/apache2/httpd.conf +sed -i 's#Directory "/var/www/localhost/htdocs"#Directory "/htdocs"#g' /etc/apache2/httpd.conf +sed -i 's#AllowOverride None#AllowOverride All#' /etc/apache2/httpd.conf +sed -i 's#DirectoryIndex index.html#DirectoryIndex index.php#' /etc/apache2/httpd.conf + +# Change TransferLog after ErrorLog +sed -i 's#^ErrorLog .*#ErrorLog "/dev/stderr"\nTransferLog "/dev/stdout"#g' /etc/apache2/httpd.conf +sed -i 's#CustomLog .* combined#CustomLog "/dev/stdout" combined#g' /etc/apache2/httpd.conf + +# Re-define LogLevel +sed -i "s#^LogLevel .*#LogLevel ${LOG_LEVEL}#g" /etc/apache2/httpd.conf + +# Enable commonly used apache modules +sed -i 's/#LoadModule\ rewrite_module/LoadModule\ rewrite_module/' /etc/apache2/httpd.conf +sed -i 's/#LoadModule\ deflate_module/LoadModule\ deflate_module/' /etc/apache2/httpd.conf +sed -i 's/#LoadModule\ expires_module/LoadModule\ expires_module/' /etc/apache2/httpd.conf + +# Modify php memory limit and timezone +sed -i "s/memory_limit = .*/memory_limit = ${PHP_MEMORY_LIMIT}/" /etc/php83/php.ini +sed -i "s#^;date.timezone =\$#date.timezone = \"${TZ}\"#" /etc/php83/php.ini + +echo 'Running Apache' + +httpd -D FOREGROUND diff --git a/js/script.js.php b/js/script.js.php index 8937809..9ee71d5 100644 --- a/js/script.js.php +++ b/js/script.js.php @@ -729,8 +729,7 @@ case 'HmIP-eTRV-E-S': case 'HmIP-eTRV-CL': case 'HmIP-eTRV-C': - case 'HmIP-eTRV-C-2': - case 'HmIP-eTRV-F': + case 'HmIP-eTRV-C-2': switch (datapoint) { case 'ACTUAL_TEMPERATURE': $('[data-id="' + ise_id + '"]').html(' ' + (Math.round(value * 10) / 10).toFixed(1) + ' °C    '); @@ -771,6 +770,49 @@ $('[data-id="' + ise_id + '"]').html(value); } break; + case 'HmIP-eTRV-F': + case 'HmIP-eTRV-3': + switch (datapoint) { + case 'ACTUAL_TEMPERATURE': + $('[data-id="' + ise_id + '"]').html(' ' + (Math.round(value * 10) / 10).toFixed(1) + ' °C    '); + break; + case 'SET_POINT_MODE': + if (value === '0') { + $('[data-id="' + ise_id + '"]').html(''); + $('[data-id="' + ise_id + '"]').attr('data-set-id', parseInt(ise_id)-10); //MANU_MODE + $('[data-id="' + ise_id + '"]').attr('data-set-value', '1'); + } else { + $('[data-id="' + ise_id + '"]').html(''); + $('[data-id="' + ise_id + '"]').attr('data-set-id', parseInt(ise_id)-10); //AUTO_MODE + $('[data-id="' + ise_id + '"]').attr('data-set-value', '0'); + } + break; + case 'ACTIVE_PROFILE': + if (value < 4) $('[data-id="' + ise_id + '"]').html(value + ' '); + else $('[data-id="' + ise_id + '"]').html(value + ' '); + break; + case 'SET_POINT_TEMPERATURE': + $('[data-id="' + ise_id + '"]').html(' ' + (Math.round(value * 10) / 10).toFixed(1) + ' °C'); + break; + case 'LEVEL': + $('[data-id="' + ise_id + '"]').html('     ' + (Math.round(value * 1000) / 10) + ' %'); + break; + case 'WINDOW_STATE': + if (value === '0') { + $('[data-id="' + ise_id + '"]').html(''); + } else { + $('[data-id="' + ise_id + '"]').html(''); + } + break; + case 'LOW_BAT': + if (value === 'true') { + $('[data-id="' + ise_id + '"]').html(''); + } + break; + default: + $('[data-id="' + ise_id + '"]').html(value); + } + break; case 'HmIP-FALMOT-C12': switch (datapoint) { case 'LEVEL':