Zum Inhalt

2021

Stromverbrauch mit dem Shelly 3EM und Home Assistant messen

Von unserem Stromversorger kam im Oktober eine Mitteilung zur Strompreisanpassung. Von derzeit 28,6 ct./kWh sollte es ab dem 01.12.21 aufsage und schreibe 42,52 ct./kWh gehen. Die Strommärkte spielen gerade verrückt und manch Anbieter hatte sich wohl etwas verkalkuliert. Der erste Schritt ist natürlich, sein Sonderkündigungsrecht zu nutzen und einen günstigeren Anbieter zu finden.

Der zweite Schritt besteht darin, Einsparpotenzial zu finden. Mit einem normalen Ferraris-Zähler ist es mühsam bis unmöglich, Verbraucher gezielt aufzuspüren – wer will schon die drehende Scheibe beobachten und die Zeit für 2-3 Umdrehungen stoppen? Auch DIY-Lösungen, wie ich sie hier vorgestellt habe, sind nicht genau genug, da sie auch nur die Zählerscheibe beobachten. Smartmeter sind zwar immer häufiger anzutreffen, allerdings ist der Zugriff darauf, um exakte Verbrauchsdaten auszulesen, oft nicht möglich.

Stromwandler auf den Zuleitungen im Verteiler. Der Pfeil muss in Richtung Versorger zeigen.

Mit dem Shelly 3EM bekommt man hingegen eine recht preiswerte Lösung, die mit wenig Aufwand sehr genaue Einblicke in die Verbräuche ermöglicht. Der Shelly 3EM besteht aus einem kleinen Modul, das auf die Hutschiene im Verteilerschrank gesteckt wird und nur eine Teilungseinheit Platz beansprucht. Der 3EM kann den Strom von 3 Phasen messen und nutzt dazu kontaktlose Stromwandler, die über die 3 Hauptzuleitungen geklappt werden. Die Anschlusskabel werden einfach am 3EM angesteckt, sind mit etwa 40 cm aber nicht sonderlich lang, sodass man hier vorher testen sollte, wo man das 3EM Modul montieren kann.

WICHTIGER HINWEIS: Arbeiten an Netzspannung sind lebensgefährlich und dürfen nur von Elektrofachkräften durchgeführt werden, weshalb es hier keine Hinweise, Hilfe und Anleitung zum Einbau gibt. Ihr gefährdet damit nicht nur euer Leben, sondern unter Umständen auch euren Versicherungsschutz. Wendet euch an einen Fachmann und lasst euch das Gerät fachmännisch in Betrieb nehmen!

Shelly 3EM Modul im Verteiler neben den LCN-Modulen

Zur Erfassung der Spannung der 3 Phasen, werden diese samt Neutralleiter entsprechenden am Shelly 3EM angeschlossen, der damit auch gleich mit Strom versorgt wird. Die Installation ist in weniger als 15 Minuten erledigt. Eine grüne LED zeigt die Betriebsbereitschaft und der 3EM öffnet einen WLAN-Access-Point. Mit der kostenlosen Shelly APP kann man den 3EM einrichten und ins heimische WLAN-Netz bringen.

Shelly Android App

Ist das geschehen, wird in der App schon der 3EM sowie aktuelle Verbrauchsdaten angezeigt. Jede Phase wird mit Spannung, aktuellem Strom und Leistungsfaktor dargestellt. Daraus wird auch die aktuelle Leistung in Watt und die Leistungsaufnahme aller 3 Phasen summiert dargestellt. Erstellt man ein Shelly-Konto, werden die Verbrauchsdaten auch in der Shelly-Cloud aufgezeichnet und können über lange Zeiträume dargestellt und ausgewertet werden. Über den Webbrowser und die IP-Adresse des 3EM kann man ebenfalls auf die Daten und Einstellungen des Shelly 3EM zugreifen.

Shelly 3EM in der Browseransicht

Der Shelly 3EM hat auch ein Relais eingebaut, mit dem sich Verbraucher bis 10 A Stromaufnahme oder ein Schütz schalten lassen. Die App sieht dazu auch programmierbare Schaltzeiten vor. Wer eine Photovoltaik-Anlage oder ähnliche Stromerzeuger betreibt, kann sich mit dem 3EM auch den erzeugten Strom messen und anzeigen lassen.

AngebotBrennenstuhl Primera-Line Energiemessgerät PM 231 E (Strommessgerät/Stromzähler Steckdose mit erhöhtem Berührungsschutz, Energiekostengerät mit 2 individuell einstellbaren Stromtarifen)Brennenstuhl Primera-Line Energiemessgerät PM 231 E (Strommessgerät/Stromzähler Steckdose mit erhöhtem Berührungsschutz, Energiekostengerät mit 2 individuell einstellbaren Stromtarifen)

  • Energiekostenmessgerät zur Messung von Spannung, Frequenz, Strom, Leistungsfaktor und Leistung
  • Stromzähler mit erhöhtem Berührungsschutz zur Berechnung des gesamten Energieverbrauchs und der Energiekosten – ideal zur Reduzierung Ihrer Stromkosten
  • Energiemessgerät mit 2 individuell einstellbaren Stromtarifen (Tag + Nacht)
  • Das Strommessgerät zeigt die Messzeit in Stunden und Minuten an
  • Primera-Line Energiemessgerät inkl. 3 Batterien LR44 zur Datenspeicherung bei Stromausfall 11,24 EUR −11% 9,98 EUR Amazon PrimeJetzt bei Amazon kaufenEve Energy (HomeKit) - Smarte Steckdose, misst Stromverbrauch, schaltet Geräte EIN/aus, Siri-Sprachsteuerung, Zeitschaltuhr, Fernzugriff, Keine Bridge nötig, TÜV-Zertifiziert, Thread, AppleEve Energy (HomeKit) – Smarte Steckdose, misst Stromverbrauch, schaltet Geräte EIN/aus, Siri-Sprachsteuerung, Zeitschaltuhr, Fernzugriff, Keine Bridge nötig, TÜV-Zertifiziert, Thread, Apple

  • Schalten Sie Lichter und Elektrogeräte über die App (iPhone, iPad, Mac), Siri oder die eingebaute Taste ein und aus

  • Richten Sie mühelos Programme ein, um Geräte automatisch ein- oder auszuschalten — unabhängig von Ihrem iPhone und Heimnetzwerk
  • Steuern Sie Ihre Geräte remote oder basierend auf Ihrer Präsenz über einen Hub (HomePod, HomePod mini oder Apple TV)
  • Energieeinsparung: Stromverbrauch beobachten, Kostenprognose auf Basis des persönlichen Strompreises erhalten und Geräte im unnötigen Standby-Modus ausschalten
  • Blitzschnell einsatzbereit dank schneller und einfacher Einrichtung ohne Gateway oder andere Zwischenbox; unterstützt Bluetooth und Thread; TÜV-zertifiziert Jetzt bei Amazon kaufenAngebotFRITZ!DECT 200 - Intelligente Steckdose für das Heimnetz, steuerbar zum Energie sparen, deutschsprachige VersionFRITZ!DECT 200 – Intelligente Steckdose für das Heimnetz, steuerbar zum Energie sparen, deutschsprachige Version

  • Intelligente Steckdose für Smart Home, schaltet automatisch oder manuell die Stromzufuhr angeschlossener Geräte (bis 2.300 Watt)

  • Energie sparen durch individuelles Schalten: einmalig, täglich, wochentäglich, rhythmisch, zufällig, je nach Zeitpunkt von Sonnenauf- und -untergang oder per Google-Kalender
  • Steuerbar per FRITZ!Fon via DECT, per PC, Smartphone oder Tablet über die Benutzeroberfläche der FRITZ!Box oder MyFRITZ!App
  • Misst den Energieverbrauch und zeigt Details zu Leistung, Verbrauch, Stromkosten sowie zur CO2-Bilanz und versendet diese auf Wunsch per Push-Mail
  • Aus FRITZ!DECT 200 wird FRITZ!Smart Energy 200: Hierbei handelt es sich nur um eine Produktumbenennung. Technisch sind die Produkte identisch, lediglich Name und Produktgehäuse können variieren. 42,77 EUR −6% 40,00 EURJetzt bei Amazon kaufenShelly 3EM TI Messgerät, 3 x 120 AShelly 3EM TI Messgerät, 3 x 120 A

  • Drei unabhängige Messkanäle bis zu 120 A, jeweils eine Schützkontrolle (oder Last bis zu 10 A).

  • 365 Tage interner Speicher, falls kein WLAN verfügbar ist.
  • Spannungsmessung und Alarmberichte konfigurierbar.
  • Inklusive 3 Spannungswandler, 120 A. Jetzt bei Amazon kaufen

Shelly 3EM mit Home Assistant nutzen

Hat man ohnehin Homeassistant im Einsatz, kann man den Verbrauch auch ganz praktisch darin anzeigen lassen und auswerten. Dazu ist dann keine Shelly-Cloud notwendig. Homeassistant besitzt bereits eine Integration für Shelly-Geräte. Hat man diese aktiviert, wird der 3EM automatisch gefunden und kann aktiviert werden.

Einbindung der Shelly-3EM-Entitäten im Energie-Dashboard

Homeassistant besitzt seit der Version 2021.8 ein Energie-Dashboard, das Auskunft über verbrauchte, als auch erzeugte Energie gibt. Die notwendigen Entitäten dazu legt die Shelly Integration automatisch an und man muss nur die Energy-Entitäten der 3 Phasen des Shelly auswählen.

Die Entitäten des Shelly 3EM in einer Homeassistant Karte

Hat man einen Stromerzeuger wie eine PV-Anlage (oder ein einfaches Balkonkraftwerk) im Einsatz, kann man die Energy-Return-Entitäten nutzen und bekommt damit auch die gewonnene Energie angezeigt und ausgewertet.

Auswertung der Shelly-Daten im Homeassistant Energie-Dashboard

Natürlich liegen auch Spannung, Strom, Leistungsfaktor und aktuelle Leistung pro Phase als Entitäten bereit und können angezeigt und ausgewertet werden. So sieht man hier schön, wenn Verbraucher ein- und ausschalten. Im Beispiel kann man die kurzen Aufheizungen unseres Quooker-Heißwasserhahns deutlich erkennen – und wie er über Nacht ausgeschaltet wird.

In der Verlaufsansicht von Homeassistant kann man dann auch längere Zeiträume detailliert anzeigen lassen. Im Screenshot erkennt man z. B. die kleinen Treppen, die auf die Kühlgefrierkombi zurückzuführen sind, welche an Phase 2 angeschlossen ist.

Der Kühlschrank ist eindeutig in dieser Auswertung der Phase 2 über 3 Tage zu erkennen

Die Shelly-Integration stellt keine Entität für den gesamten aktuellen Verbrauch zur Verfügung. Einen Sensor dafür kann man aber ganz einfach selbst erstellen. Dazu legt man eine neue Sensor-Entität, welche die aktuelle Leistung aller 3 Phasen summiert:

1
2
3
4
5
6
7
  - platform: template
    sensors:
      verbrauch_total:
        friendly_name: 'Verbrauch total'
        unit_of_measurement: "W"
        value_template: >-
          {{ (states('sensor.shellyem3_xyz_channel_a_power')|float + states('sensor.shellyem3_xyz_channel_b_power')|float + states('sensor.shellyem3_xyz_channel_c_power')|float)|round(0) }}

Die neue Entität verbrauch_total wird mit round(0) ohne Nachkommastellen in Watt ausgegeben.

Strategien zur Optimierung des Stromverbrauchs

Der Shelly 3EM misst den Verbrauch sehr detailliert und auch sehr kurze Ereignisse und Veränderungen im Verbrauch werden erfasst. Um nun aber herauszufinden, welche Veränderung welcher Verbraucher ist, muss man zunächst erst einmal wissen, auf welcher Phase welche Verbraucher laufen. Wenn die Verteilung gut dokumentiert ist, kann man sehen, welche Leitungsschutzschalter wofür zuständig ist und auf welcher Phase er liegt. Damit kann man die möglichen Verbraucher pro Phase schon einmal einkreisen.

Viele Verbraucher wie Fernsehgerät, Kühlschrank, Backofen, Geschirrspüler, Waschmaschine etc. lassen sich sehr einfach lokalisieren, da sie sehr charakteristische Muster und hohe Ströme und damit Spitzen im Verbrauch haben. Sparen kann man allerdings vor allem bei der Verringerung der Grundlast, also all der Verbraucher, die zwar alle recht wenig verbrauchen, das dafür über lange Zeiträume. Standby-Verbraucher wie AV-Receiver, Sat-Receiver, PCs aber auch Smarthome-Geräte wie Alexa oder Philips Hue Leuchten, können in der Masse nicht unerhebliche Verbräuche verursachen.

lelit-siebtraeger-maschine-home-assistant

Smarte Steckdose schalte die Siebträgermaschine automatisch an und wieder aus

Hier sollte man in einer Zeit (früh am Morgen oder in der Nacht) nach und nach alle Geräte vom Netz nehmen, nacheinander wieder aktivieren und den Verbrauch beobachten. Schnell findet man dann heraus, dass sich TV, Sat- und AV-Receiver zusammen mit einem Apple TV-Gerät zusammen 40 Watt im Standby-Betrieb gönnen und rund um die Uhr aus der Steckdose nuckeln. Der Laptop am Ladegerät nimmt sich ständig 10 Watt, weil er den Akku auf Trab hält und der Laserdrucker mit Netzwerkanschluss im Arbeitszimmer mag auch ausgeschaltet 10 Watt. Diese 60 Watt alleine, kosten bei 32 ct. Stromkosten pro Kilowattstunde im Jahr gut 168 Euro. Mit einer Hausautomation oder smarten Steckdosen, kann man diese Geräte bei Nichtgebrauch vom Netz nehmen und die Kosten für diese Steckdosen amortisieren sich schon nach wenigen Monaten.

Mein neuer ESPHome Multisensor mit Display für Home Assistant

Mein eigentliches Ziel war ein Gerät auf Basis eines Wemos Mini D1 und ESPHome, um mehrere 1-Wire Temperatursensoren auslesen zu können, die ich an den Vor- und Rückläufen unserer Heizungsanlage, sowie oben, in der Mitte und unten in unserem Pufferspeicher montiert habe. Die 1-Wire Sensoren vom Typ DS18B20 sind nicht nur preiswert und für diese Aufgabe hinreichend genau, sondern können auch gut verlängert werden und es lassen sich etwa 100 Sensoren an einer einzigen Datenleitung betreiben.

Bei mir geht es hingegen nur um 9 Sensoren: Fußbodenheizung Vorlauf/Rücklauf, Wandheizkörper Vorlauf/Rücklauf, wassergeführter Kamin Vorlauf/Rücklauf und eben die 3 Sensoren im Pufferspeicher.

Der fertig aufgebaute ESPHome Multisensor mit Display

Der fertig aufgebaute ESPHome Multisensor mit Display

Nun finde ich es aber immer schade, wenn man einen ESP für nur eine Aufgabe verbrät und die anderen Pins ungenutzt lässt. Also warum nicht gleich noch einen BME280 Sensor nutzen, um die Luftfeuchtigkeit und Temperatur im Technikraum zu messen? Dank des eingebauten Luftdrucksensors kann man dann auch gleich noch die absolute Luftfeuchtigkeit und den Taupunkt ausrechnen lassen.

Und wenn man schon die Daten hat, wäre doch ein Display ganz nett? Dazu hatte ich noch einige Nokia 5110 Displays vom PCD 8544 herumliegen. Mit seinen 84×48 Pixeln ist es für diese Aufgabe optimal geeignet. Mit der passenden Schriftart kann man 6 Zeilen zu 14 Zeichen gut lesbar darstellen. Man bekommt hier einfach mehr unter als bei einem zweizeiligen HD44780 Display und kann auch Grafiken einsetzen.

Zudem unterstützt die ESPHome Plattform bei diesem Display auch “Pages”, sodass man sehr einfach zwischen mehreren Seiten und Anzeigen durchblättern und somit jede Menge Informationen übersichtlich darstellen kann. Zum Blättern braucht es aber auch ein Bedienelement und hier habe ich mich für einen einfachen Taster entschieden, denn für einen Endlos-Encoder waren nicht mehr genug Pins vorhanden. Dafür kann das Display über Home Assistant in der Helligkeit gesteuert werden und ein WS2812 LED-Streifen mit 8 RGB-LEDs gibt Auskunft über verschiedene Betriebszustände.

Der Aufbau

Es ist immer eine gute Idee, solche umfangreicheren Projekte zunächst auf einem Breadboard aufzubauen und zu testen, bevor man sich an den Lötkolben wagt. Funktioniert der fliegende Aufbau wie gewünscht, kann man sich an die Umsetzung auf einer Platine machen.

Testaufbau auf einem Breadboard

Testaufbau auf einem Breadboard

Ich bin von jeher ein Fan von Streifenrasterplatinen. Damit habe ich schon mit 9 Jahren gebastelt, in meiner Ausbildung damit gearbeitet und ich mag die Streifenraster-Philosophie lieber als diese Lötzinnbäche auf Punktraster-Boards. Dabei verfolge auch noch die “reine Lehre”, nämlich dass Drahtbrücken nur in einer Richtung verlaufen. Wemos Mini, Display und BME280 Sensor werden gesteckt, sodass man sie auch schnell mal tauschen könnte.

Der grundlegende Aufbau und Schaltplan meines Multisensors mit Display

Für die Anbindung der 9 1-Wire Sensoren habe ich mich für 9-polige Federklemmblöcke entschieden. 3 Stück davon passen nebeneinander auf eine Europlatinenbreite und sind für die dünnen Adern der DS18B20 Sensoren ideal geeignet. Die Datenleitung der Sensoren muss mit einem 4,7 kOhm Widerstand auf High (3,3 Volt Betriebsspannung) gelegt werden und ein 10 uF Elko direkt an der Spannungsversorgung der Sensoren sorgt für einen stabileren Betrieb. Die 1-Wire Sensoren werden immer in der Reihenfolge DATA (Gelb), VCC (Rot), GND (Schwarz) von links nach rechts angeschlossen.

Der komplette Aufbau passte auf weniger als eine halbe Eurokarte und sieht meiner Meinung nach ganz ordentlich aus.

Natürlich könnte man auch eine richtige Platine gestalten und herstellen (lassen). Allerdings werde ich diesen Aufbau nur ein einziges Mal benötigen, sodass der Aufwand hier nicht gerechtfertigt ist und eine sauber aufgebaute Streifenrasterplatine ist ebenso zuverlässig.

Die Programmierung mit ESPHome

ESPHome ist eine grandiose Lösung für eigene Sensoren und Aktoren. Es basiert auf Arduino Bibliotheken, wird aber in der Hauptsache mit YAML eher konfiguriert, als programmiert. Trotzdem lassen sich auch komplexe Funktionen und Berechnungen damit umsetzen, in dem man mit sogenannten Lambdas auch C-Code innerhalb der YAML Konfiguration einsetzen kann. Was die Programmierung jedoch noch vereinfacht, ist die Integration der ESPHome Plattform direkt in Home Assistant. Hat man die ESPHome Integration in HA, kann man auf Flash-Tools etc. verzichten.

Dazu benötigt man nur den Chrome-Browser oder Edge (vermutlich gehen auch andere Browser, die auf Chromium basieren), denn diese bieten die Web Serial Schnittstelle. Damit verbindet man den ESP per USB mit dem Rechner, an dem man gerade sitzt und kann, öffnet die ESPHome Integration in HA im Browser und kann damit den ESP direkt flashen. Wichtig dabei ist nur, dass die Verbindung zu Home Assistant per SSL erfolgt.

ESPHome direkt aus Home Assistant über den Browser flashen

Hat man das erledigt, wird der neu angelegte und geflashte ESP in der ESPHome Oberfläche als “online” angezeigt und kann von da an direkt über die Weboberfläche programmiert werden. Auch die Logs des ESP werden darüber ausgegeben und ESPs können von dort aus auch upgedatet werden. Ich habe früher Tasmota und ESPeasy eingesetzt, aber ESPHome ist so viel einfacher, eleganter und flexibler in der Nutzung – besonders wenn man mehrere solcher Geräte im Einsatz hat. Die ESPHome Geräte können praktisch von überall aus programmiert werden, wo man Zugriff auf seinen Home Assistant Server hat.

Der Code für den Multisensor mit Display

Hier zunächst einmal der komplette Programmcode meines ESPHome Multisensors:

esphome:
  name: technik
  platform: ESP8266
  board: d1_mini

# Logging an RX/TX ausschalten, da diese Pins als GPIOs verwendet werden
logger:
  baud_rate: 0

#  Home Assistant API aktivieren
api:

ota:
  password: "Dein-OTA-Passwort"

wifi:
  ssid: "DEINE-SSID"
  password: "DEIN-WLAN-PASSWORT"

  # Fallback hotspot (captive portal) aktivieren, falls WLAN fehlt
  ap:
    ssid: "Technik Fallback Hotspot"
    password: "DEIN_PASSWORT"

captive_portal:

# GPIO Übersicht und Verbindungen
# D0 = RST Display
# D1 = I2C SCL BME280
# D2 = I2C SDA BME280
# D3 = DC Display
# D4 = 1Wire Data für DS18B20 Sensoren
# D5 = SPI CLK Display
# D6 = WS2812 LED Data
# D7 = CS/CE Display
# D8 = SPI MOSI Display Din
# RX = Backlight Display = GPIO3
# TX = Switch = GPIO1
# A1 = noch nicht im Einsatz


light:
    # WS2812 LED Infostrip
  - platform: fastled_clockless
    chipset: WS2812B
    id: light_fastled
    pin: D6
    num_leds: 8
    rgb_order: GRB
    name: "Infostrip"
    effects:
      - pulse:
  # LEDs definieren   
  - platform: partition
    name: "PL0"
    segments:
      - id: light_fastled
        from: 0
        to: 0
    effects:
      - pulse:
  - platform: partition
    name: "PL1"
    segments:
      - id: light_fastled
        from: 1
        to: 1
    effects:
      - pulse:
  - platform: partition
    name: "PL2"
    segments:
      - id: light_fastled
        from: 2
        to: 2
    effects:
      - pulse:
  - platform: partition
    name: "PL3"
    segments:
      - id: light_fastled
        from: 3
        to: 3
    effects:
      - pulse:
  - platform: partition
    name: "PL4"
    segments:
      - id: light_fastled
        from: 4
        to: 4
    effects:
      - pulse:
  - platform: partition
    name: "PL5"
    segments:
      - id: light_fastled
        from: 5
        to: 5
    effects:
      - pulse: 
  - platform: partition
    name: "PL6"
    segments:
      - id: light_fastled
        from: 6
        to: 6
    effects:
      - pulse: 
  - platform: partition
    name: "PL7"
    segments:
      - id: light_fastled
        from: 7
        to: 7
    effects:
      - pulse:      

# Displaybeleuchtung
  - platform: monochromatic
    name: "Technik Display"
    output: technik_display

output:
  - platform: esp8266_pwm
    id: technik_display
    pin: GPIO03
    inverted: true

# 1-Wire Sensoren 
dallas:
  - pin: D4

# I2C-Bus für BME280 
i2c:
  sda: D2
  scl: D1
  scan: true
  id: bus_a

# SPI-Bus für Display  
spi:
  clk_pin: D5
  mosi_pin: D8

# Statusdaten für den ESP holen
text_sensor:
  - platform: template
    name: Uptime Human Readable
    id: uptime_human
    icon: mdi:clock-start

  - platform: wifi_info
    ip_address:
      name: ESP IP Address
      id: my_ip
    ssid:
      name: ESP Connected SSID
      id: my_SSID
    bssid:
      name: ESP Connected BSSID
    mac_address:
      name: ESP Mac Wifi Address
      id: my_mac

# 1-Wire Sensoren einbinden
sensor:
  - platform: dallas
    address: 0x42030297792CC028
    resolution: 12
    name: "Vorlauf FBH"
    id: fbh_vl

  - platform: dallas
    address: 0x16030297794F1A28
    resolution: 12
    name: "Rücklauf FBH"
    id: fbh_rl

# BME280 Sensor     
  - platform: bme280
    temperature:
      name: "ESP1 Technik Temperatur"
      id: bme280_temperature
      oversampling: 16x
    pressure:
      name: "ESP1 Technik Luftdruck"
      id: bme280_pressure
    humidity:
      name: "ESP1 Technik Feuchte"
      id: bme280_humidity
    address: 0x76
    update_interval: 120s #längere Updateintervalle verhindern Erwärmung des Sensors
    iir_filter: 4x # Messwerte glätten

# WLAN-Signalstärke holen
  - platform: wifi_signal
    name: "Technik ESP Wifi Signal"
    update_interval: 30s
    id: wlan_signal

# Uptime des ESP auslesen und menschenlesbar formatieren
  - platform: uptime
    name: Uptime ESP Technik
    id: uptime_sensor
    update_interval: 60s
    on_raw_value:
      then:
        - text_sensor.template.publish:
            id: uptime_human
            state: !lambda |-
              int seconds = round(id(uptime_sensor).raw_state);
              int days = seconds / (24 * 3600);
              seconds = seconds % (24 * 3600);
              int hours = seconds / 3600;
              seconds = seconds % 3600;
              int minutes = seconds /  60;
              seconds = seconds % 60;
              return (
                (days ? String(days) + "d " : "") +
                (hours ? String(hours) + "h " : "") +
                (minutes ? String(minutes) + "m " : "") +
                (String(seconds) + "s")
              ).c_str();

# LCN-WIH Außentemperatursensor von HA holen
  - platform: homeassistant
    id: temp_aussen
    entity_id: sensor.wih_temp_aussen


# Luftdruck mit Höhenkorrektur auf 516 Meter berechnen

  - platform: template
    name: "Technik Luftdruck"
    update_interval: 60s
    lambda: |-
      const float STANDARD_ALTITUDE = 516; // in Meter
      return id(bme280_pressure).state / powf(1 - ((0.0065 * STANDARD_ALTITUDE) /
        (id(bme280_temperature).state + (0.0065 * STANDARD_ALTITUDE) + 273.15)), 5.257); // in hPa
    unit_of_measurement: 'hPa'

# Absolute Luftfeuchtigkeit in g/m3 berechnen    
  - platform: template
    name: "Technik Absolute Luftfeuchtigkeit"
    lambda: |-
      const float mw = 18.01528;    // molare Masse von Wasser g/mol
      const float r = 8.31447215;   // universelle Gas-Konstante J/mol/K
      return (6.112 * powf(2.718281828, (17.67 * id(bme280_temperature).state) /
        (id(bme280_temperature).state + 243.5)) * id(bme280_humidity).state * mw) /
        ((273.15 + id(bme280_temperature).state) * r); // in Gramm/m^3
    accuracy_decimals: 2
    update_interval: 60s
    icon: 'mdi:water'
    unit_of_measurement: 'g/m³'
    id: wsabs

# Taupunkt berechnen    
  - platform: template
    name: "Technik Taupunkt"
    lambda: 
      return (243.5*(log(id(bme280_humidity).state/100)+((17.67*id(bme280_temperature).state)/
      (243.5+id(bme280_temperature).state)))/(17.67-log(id(bme280_humidity).state/100)-
      ((17.67*id(bme280_temperature).state)/(243.5+id(bme280_temperature).state))));
    unit_of_measurement: °C
    icon: 'mdi:thermometer-alert'

# Uhrzeit von Home Assistant holen (für Uptime-Berechnung)
time:
  - platform: homeassistant
    id: homeassistant_time      

# Display-Fonts definieren
font:
  - file: "fonts/hd44780.ttf"
    id: font_a
    size: 8
  - file: "fonts/VCR_OSD_MONO.ttf"
    id: font_b
    size: 20

# Icons definieren
image:
  - file: "icons/water-percent.gif"
    id: water_percent
  - file: "icons/thermometer.gif"
    id: thermometer
  - file: "icons/sm_sad.gif"
    id: sad
    resize: 22x24
  - file: "icons/sm_neutral.gif"
    id: neutral 
    resize: 22x24
  - file: "icons/sm_happy.gif"
    id: happy
    resize: 22x24

# Nokia 5110 Display    
display:
  - platform: pcd8544
    id: my_display
    reset_pin: D0   
    cs_pin: D7
    dc_pin: D3                       
    contrast: 0x3f # Wichtig: zu hohe Werte zeigen schwarzes Display!

    # Mehrere Display-Seiten 
    pages:
      - id: page1
        lambda: |-
          it.image(0, 0, id(thermometer));
          it.printf(14, 0, id(font_b), "%.1f°C", id(bme280_temperature).state);
          it.image(0, 20, id(water_percent));
          it.printf(14, 20, id(font_b), "%.0f", id(bme280_humidity).state);
          it.printf(38, 22, id(font_a), "%.1f", id(wsabs).state);
          it.print(38, 30, id(font_a), "g/m3");
          if ((id(bme280_humidity).state <= 55)) {
            it.image(63, 18, id(happy));
          }

          if ((id(bme280_humidity).state >= 56) and (id(bme280_humidity).state <= 68))    {
            it.image(63, 18, id(neutral));
          }    
          if ((id(bme280_humidity).state >= 69))    {
            it.image(63, 18, id(sad));
          }      

          it.strftime(0, 40, id(font_a), "%H:%M-%d.%m.%y", id(homeassistant_time).now());



      - id: page2
        lambda: |-
          it.print(0, 0, id(font_a), "   HK1 - FBH"); 
          it.print(0, 6, id(font_a), "______________"); 
          it.printf(0, 18, id(font_a), "FBH VL:%.1f C", id(fbh_vl).state);
          it.printf(0, 28, id(font_a), "FBH RL:%.1f C", id(fbh_rl).state);
          it.printf(0, 38, id(font_a), "Aussen:%.1f C", id(temp_aussen).state);

      - id: page3
        lambda: |-
          it.print(0, 0, id(font_a), "  HK2 - Wand"); 
          it.print(0, 6, id(font_a), "______________"); 
          it.printf(0, 18, id(font_a), "HK VL:%.1f C", id(fbh_vl).state);
          it.printf(0, 28, id(font_a), "HK RL:%.1f C", id(fbh_rl).state);
          it.printf(0, 38, id(font_a), "Aussen:%.1f C", id(temp_aussen).state);
      - id: page4
        lambda: |-
          it.print(0, 0, id(font_a), " HK3 - Kamin"); 
          it.print(0, 6, id(font_a), "______________"); 
          it.printf(0, 18, id(font_a), "KAM VL:%.1f C", id(fbh_vl).state);
          it.printf(0, 28, id(font_a), "KAM RL:%.1f C", id(fbh_rl).state);
          it.printf(0, 38, id(font_a), "Aussen:%.1f C", id(temp_aussen).state);
      - id: page5
        lambda: |-
          it.print(0, 0, id(font_a), "    Puffer"); 
          it.print(0, 6, id(font_a), "______________"); 
          it.printf(0, 18, id(font_a), "Oben:  %.1f C", id(fbh_vl).state);
          it.printf(0, 28, id(font_a), "Mitte: %.1f C", id(fbh_rl).state);
          it.printf(0, 38, id(font_a), "Unten: %.1f C", id(fbh_rl).state);

      - id: page6
        lambda: |-
          it.print(0, 0, id(font_a), "Name: Technik"); 
          it.print(0, 6, id(font_a), "______________"); 
          it.printf(0, 16, id(font_a), "Up:%s", id(uptime_human).state.c_str()); 
          it.printf(0, 24, id(font_a), "%s", id(my_ip).state.c_str()); 
          it.printf(0, 32, id(font_a), "%s", id(my_mac).state.c_str());
          it.printf(0, 40, id(font_a), "WLAN: %.0f dBm", id(wlan_signal).state);

# Taster zum wechseln der Display-Pages          
binary_sensor:
  - platform: gpio
    pin: 
      number: GPIO01
      mode: INPUT_PULLUP # internen Pullup einschalten - spart einen Widerstand :-)
      inverted: True
    name: "Technik Taster"
    on_press:
      then: 
        - display.page.show_next: my_display
        - component.update: my_display

# Status des ESP an HA mitteilen (verbunden oder nicht)
  - platform: status
    name: "ESP Technik"

Da ich die serielle Schnittstelle des ESP nicht benötige, schalte ich das Loggen dafür in Zeile 8 aus. Damit kann ich die beiden Pins als normale GPIOs nutzen.

Die wichtigsten Konfigurationen und Funktionen im Detail

Viel im Code sind Standardfunktionen, die man ganz einfach nachlesen kann. Ich möchte hier die interessanteren Teile kurz einzeln erklären.

light:
    # WS2812 LED Infostrip
  - platform: fastled_clockless
    chipset: WS2812B
    id: light_fastled
    pin: D6
    num_leds: 8
    rgb_order: GRB
    name: "Infostrip"
    effects:
      - pulse:
  # LEDs definieren   
  - platform: partition
    name: "PL0"
    segments:
      - id: light_fastled
        from: 0
        to: 0
    effects:
      - pulse:

...

Hier wird der WS2812 LED-Stripe mit 8 RGB-LEDs eingerichtet. Für jedes LED wird die Platform: partition angelegt. Damit kann jedes LED später individuell angesprochen werden. Aktuell ist dafür noch kein weiterer Code enthalten und die Nutzung dieser Funktion, wird erst später hinzukommen. So könnte man darüber etwa anzeigen, wenn man Lüften sollte oder wenn der Brenner der Heizung aktiv ist.

# Displaybeleuchtung
  - platform: monochromatic
    name: "Technik Display"
    output: technik_display

output:
  - platform: esp8266_pwm
    id: technik_display
    pin: GPIO03
    inverted: true

Die Displaybeleuchtung ist an dem früheren RX-Pin angeschlossen, der nun auf GPIO03 hört. Damit kann das Display von HA aus gesteuert und gedimmt werden.

dallas:
  - pin: D4

# 1-Wire Sensoren einbinden
sensor:
  - platform: dallas
    address: 0x42030297792CC028
    resolution: 12
    name: "Vorlauf FBH"
    id: fbh_vl

  - platform: dallas
    address: 0x16030297794F1A28
    resolution: 12
    name: "Rücklauf FBH"
    id: fbh_rl

...

Die DS18D20 1-Wire Temperatursensoren werden hier definiert. Dazu benötigt man die eindeutige ID des jeweiligen Sensors. Entweder schließt man dazu jeden Sensor einmal einzeln an, notiert sich die ID und markiert sie am Sensor oder man schließt alle Sensoren gleichzeitig an, erwärmt jeden Sensor kurz und sieht im Log nach, welche ID gerade eine höhere Temperatur anzeigt.

# Uptime des ESP auslesen und menschenlesbar formatieren
  - platform: uptime
    name: Uptime ESP Technik
    id: uptime_sensor
    update_interval: 60s
    on_raw_value:
      then:
        - text_sensor.template.publish:
            id: uptime_human
            state: !lambda |-
              int seconds = round(id(uptime_sensor).raw_state);
              int days = seconds / (24 * 3600);
              seconds = seconds % (24 * 3600);
              int hours = seconds / 3600;
              seconds = seconds % 3600;
              int minutes = seconds /  60;
              seconds = seconds % 60;
              return (
                (days ? String(days) + "d " : "") +
                (hours ? String(hours) + "h " : "") +
                (minutes ? String(minutes) + "m " : "") +
                (String(seconds) + "s")
              ).c_str();

Hier wird die Zeit, die der ESP online ist, in ein menschenlesbares Format umgewandelt, sodass man es später schön im Display und in der HA Oberfläche anzeigen lassen kann.

1
2
3
4
# LCN-WIH Außentemperatursensor von HA holen
  - platform: homeassistant
    id: temp_aussen
    entity_id: sensor.wih_temp_aussen

Natürlich kann man auch Sensoren aus HA holen. Hier lese ich den Außentemperatursensor meiner LCN-WIH Wetterstation aus, um die Werte im Display anzeigen zu lassen.

# Luftdruck mit Höhenkorrektur auf 516 Meter berechnen

  - platform: template
    name: "Technik Luftdruck"
    update_interval: 60s
    lambda: |-
      const float STANDARD_ALTITUDE = 516; // Höhe über Null am Einsatzort in Meter
      return id(bme280_pressure).state / powf(1 - ((0.0065 * STANDARD_ALTITUDE) /
        (id(bme280_temperature).state + (0.0065 * STANDARD_ALTITUDE) + 273.15)), 5.257); // in hPa
    unit_of_measurement: 'hPa'

# Absolute Luftfeuchtigkeit in g/m3 berechnen    
  - platform: template
    name: "Technik Absolute Luftfeuchtigkeit"
    lambda: |-
      const float mw = 18.01528;    // molare Masse von Wasser g/mol
      const float r = 8.31447215;   // universelle Gas-Konstante J/mol/K
      return (6.112 * powf(2.718281828, (17.67 * id(bme280_temperature).state) /
        (id(bme280_temperature).state + 243.5)) * id(bme280_humidity).state * mw) /
        ((273.15 + id(bme280_temperature).state) * r); // in Gramm/m^3
    accuracy_decimals: 2
    update_interval: 60s
    icon: 'mdi:water'
    unit_of_measurement: 'g/m³'
    id: wsabs

# Taupunkt berechnen    
  - platform: template
    name: "Technik Taupunkt"
    lambda: 
      return (243.5*(log(id(bme280_humidity).state/100)+((17.67*id(bme280_temperature).state)/
      (243.5+id(bme280_temperature).state)))/(17.67-log(id(bme280_humidity).state/100)-
      ((17.67*id(bme280_temperature).state)/(243.5+id(bme280_temperature).state))));
    unit_of_measurement: °C
    icon: 'mdi:thermometer-alert'

Hier wieder ein Einsatz für die Lambdas und etwas C-Code zur Berechnung der absoluten Luftfeuchtigkeit etc. Mit lambda: |- teilt man mit, dass alles, was danach kommt und eingerückt ist, als C-Code interpretiert wird. Die Formeln dafür stammen aus dem Internet. Beim Luftdruck ist darauf zu achten, dass man die richtige Höhenangabe einträgt. Der Luftdruck, den der BME280 direkt ausgibt, ist nicht höhenkompensiert.

Das Nokia 5110 Display – Fonts, Icons und Darstellung

1
2
3
4
5
6
7
8
# Display-Fonts definieren
font:
  - file: "fonts/hd44780.ttf"
    id: font_a
    size: 8
  - file: "fonts/VCR_OSD_MONO.ttf"
    id: font_b
    size: 20

Für das Nokia 5110 PCD8544 Display müssen Schriftarten definiert werden. Grundsätzlich kann man jeden TrueType-Font (.ttf) dafür nutzen. Allerdings klappt das nur für große Texte und auch hier sieht nicht jeder Font gut aus. Für die kleinstmögliche leserliche Darstellung sind 7×5 (Pixel) Fonts ideal. So findet man z. B. bei wfonts.com die hd44780.ttf Schriftart, welche klar lesbar ist und 6 Zeilen zu 14 Zeichen erlaubt. Für großen Text habe ich mich für VCR_OSD_MONO.ttf bei dafont.com entschieden.

Fonts-Verzeichnis unter esphome im VScode Editor

Die Fonts lädt man in ein Verzeichnis unterhalb des esphome Verzeichnisses. Das geht ganz einfach per VSCode Integration in HA. Einfach einen Ordner fonts (der Name ist egal) anlegen, rechten Mausklick darauf und Upload auswählen.

# Icons definieren
image:
  - file: "icons/water-percent.gif"
    id: water_percent
  - file: "icons/thermometer.gif"
    id: thermometer
  - file: "icons/sm_sad.gif"
    id: sad
    resize: 22x24
  - file: "icons/sm_neutral.gif"
    id: neutral 
    resize: 22x24
  - file: "icons/sm_happy.gif"
    id: happy
    resize: 22x24

Ich habe für den Haupt-Screen meines ESP einige Icons eingebaut. Ein Thermometer, Wassertropfen und 3 Smilies, die Auskunft über die Luftfeuchtigkeit geben. Auch hier legt man sich wieder ein Verzeichnis unterhalb von esphome an – in meinem Fall icons – und lädt die entsprechenden Grafiken hoch. Ich hatte allerdings nur mit GIF-Dateien Erfolg. PNGs, egal ob mit oder ohne Alphakanal, zeigten immer nur einen schwarzen Block an.

Das Hauptmenü meines Multisensors

# Nokia 5110 Display    
display:
  - platform: pcd8544
    id: my_display
    reset_pin: D0   
    cs_pin: D7
    dc_pin: D3                       
    contrast: 0x3f # Wichtig: zu hohe Werte zeigen schwarzes Display!

    # Mehrere Display-Seiten 
    pages:
      - id: page1
        lambda: |-
          it.image(0, 0, id(thermometer));
          it.printf(14, 0, id(font_b), "%.1f°C", id(bme280_temperature).state);
          it.image(0, 20, id(water_percent));
          it.printf(14, 20, id(font_b), "%.0f", id(bme280_humidity).state);
          it.printf(38, 22, id(font_a), "%.1f", id(wsabs).state);
          it.print(38, 30, id(font_a), "g/m3");
          if ((id(bme280_humidity).state <= 55)) {
            it.image(63, 18, id(happy));
          }

          if ((id(bme280_humidity).state >= 56) and (id(bme280_humidity).state <= 68))    {
            it.image(63, 18, id(neutral));
          }    
          if ((id(bme280_humidity).state >= 69))    {
            it.image(63, 18, id(sad));
          }      

          it.strftime(0, 40, id(font_a), "%H:%M-%d.%m.%y", id(homeassistant_time).now());

Nun wird das Display konfiguriert. Wichtig ist die contrast Einstellung. In der offiziellen Dokumentation wird hier der Wert contrast: 0x7f angegeben. Damit erhält man aber nur ein komplett schwarz gefülltes Display und glaubt erst einmal an einen Verkabelungsfehler. Tatsächlich handelt es sich aber nur um einen viel zu hohen Kontrast. Mit contrast: 0x3f wird die Schrift meiner Ansicht nach ideal dargestellt.

Bei den print– und image-Anweisungen bedeutet printf(14,20 … ), dass die Schrift 14 Pixel nach rechts und 20 Pixel nach unten, ausgehend von der linken oberen Ecke der Anzeige dargestellt werden soll.

Vor- und Rücklauf der Fußbodenheitung sowie Außentemperatur

Mit pages: und id: page1 nutze ich die Möglichkeit, Inhalte auf mehrere Displayseiten zu verteilen. Page1 ist mein Hauptscreen, der beim Start erscheint und Raumtemperatur sowie Luftfeuchtigkeit groß mit einem Icon davor darstellt. Neben der Luftfeuchtigkeit zeige ich noch kleiner die absolute Luftfeuchtigkeit an. Daneben, je nach Luftfeuchte, einen passenden Smilie und darunter die aktuelle Uhrzeit und das Datum.

Mit it.printf(14, 0, id(font_b), “%.1f°C”, id(bme280_temperature).state); wird die Temperatur im C-Stil auf eine Nachkommastelle formatiert (%.1f).

Mit den if-Anweisungen werden die Smilies nach einem Schwellwert geändert und zu guter Letzt die Uhrzeit angezeigt.

# Taster zum wechseln der Display-Pages          
binary_sensor:
  - platform: gpio
    pin: 
      number: GPIO01
      mode: INPUT_PULLUP # internen Pullup einschalten - spart einen Widerstand :-)
      inverted: True
    name: "Technik Taster"
    on_press:
      then: 
        - display.page.show_next: my_display
        - component.update: my_display

Hier wird der Taster am GPIO01 abgefragt. Mit INPUT_PULLUP kann man den internen Pullup aktivieren und man spart sich damit die externe Beschaltung mit einem Widerstand, der für einen definierten Logikpegel sorgt. Wenn der Taster gedrückt wird, sorgen die beiden letzten Zeilen dafür, dass die Seiten (Pages) nacheinander durchgeschaltet und anzeigt werden.

Eine Seite mit Systeminformationen

Tipps

Zum BME280 Sensor gibt es im Netz viele Diskussionen. Ursprünglich wurde der Sensor von Bosch entwickelt. Geht man nach dem Datenblatt der Firma Bosch, müssen die Sensoren in einem speziellen Prozess verlötet und dann bei definierten Bedingungen getrocknet und eingebrannt werden.

Bei den günstigen China-Sensoren kann man nicht wirklich sicher sagen, ob es sich um Bosch-Typen oder Kopien handelt und der Verarbeitungsprozess wird ganz sicher nicht eingehalten. Daher wird immer davon gesprochen, dass diese China-Varianten ungenau wären. Achtet man jedoch darauf, dass der Sensor möglichst weit von Wärmequellen wie dem ESP8266 entfernt montiert wird und die Zuleitungen möglichst lang (und dünn) sind, liefert der BME280 nach meinen Erfahrungen und auch Vergleichsmessungen mit gesättigten Salzlösungen (siehe auch: https://nachbelichtet.com/guenstige-xiaomi-mijia-ble-sensoren-mit-home-assistant-nutzen/) sehr genaue Werte.

Häufig ist auch die Erwartung an einen Messwert schlichtweg Unsinn. Es geht nicht darum, den besten und genausten Messwert zu erhalten, sondern den Messwert, der zur Anwendung passt. Die Lufttemperatur unterscheidet sich selbst in kleinen Räumen und je nach Messhöhe und Position im Raum nicht selten um 2 °C. Gleiches gilt für die Luftfeuchtigkeit. Sind also 22,7 °C richtiger als 23,4 °C? Nein! Denn verzichtet man auf die Nachkommastelle, kämen für diesen Einsatz vollkommen ausreichende 23 Grad als Messwert heraus.

Aqara Multisensoren für Temperatur, Luftfeuchtigkeit und Luftdruck

Aqara Multisensoren für Temperatur, Luftfeuchtigkeit und Luftdruck

Doch selbst hier sagt der Messwert noch nichts darüber aus, ob man sich bei dieser Temperatur auch wohlfühlt. Das Wohlfühlklima wird über die Temperatur, die Luftfeuchtigkeit und die Luftbewegung definiert. So nimmt die gefühlte Temperatur bei steigender Luftfeuchtigkeit zu und umgekehrt. 21 °C Lufttemperatur fühlen sich bei 55 % rel. Luftfeuchte schon wie 23 °C und bei 75 % wie 26 °C an. Daher fühlt sich auch recht warme, aber trockene Heizungsluft im Winter gar nicht so muggelich an, wie man oft erwarten würde. Kommt dann auch noch eine leichte Luftbewegung hinzu, können sich 23 °C wie 20 °C anfühlen.

Die DS18B20 Sensoren sollte man alle in einen Eimer Wasser mit hängen, dessen Temperatur mit einem vertrauenswürdigen Thermometer gemessen hat. So kann man die Sensoren nach Genauigkeit und Abweichung selektieren. Bei der Messung von Vor- und Rücklauf einer Niedrigtemperaturheizungen, macht 1 °C Abweichung schon etwas aus. Wenn dann die Rücklauftemperatur höher ist als der Vorlauf, kann man keine vernünftige Steuerung darauf aufbauen. Daher sollten beide Sensoren die gleichen relativen Messwerte liefern. Abweichungen vom tatsächlichen Messwert kann man dann ggf. auch noch per Software kompensieren.

Bauteile und Kosten

Das gesamte Projekt kostet weniger als 10 Euro. Die 5110 Displays bekommt man für weniger als 2 Euro bei diversen China-Versendern (auf die neuen Regelungen beim Versand aus China achten – siehe HIER !). Ein ESP Wemos Mini kostet auch nur 2 Euro. Bestellt man ihn aus Deutschland, muss man etwa 4,50 Euro rechnen. BME280 Sensor, Platine und die Klemmen sind für weitere 3-4 Euro zu haben.

Nicht in den Kosten enthalten sind die DS18B20 1-Wire Sensoren. Hier bekommt man 10 Stück für unter 20 Euro. Auf Basis dieses Grund-Codes kann man viele universelle Smarthome-Sensoren mit Display günstig herstellen. Da man sowohl einen I2C- als auch einen SPI-Bus zur Verfügung hat, kann man problemlos noch weitere Sensoren einbinden und damit den Funktionsumfang nach den eigenen Wünschen und Anforderungen erweitern.

Automationen mit mehreren Schaltzeiten in Home Assistant erstellen

Ich kann es nicht oft genug wiederholen: Eine App auf dem Smartphone, die eine Lampe oder was auch immer schalten kann, macht noch lange kein Smarthome, denn das ist nur ein verlagerter Schalter. Da jeder Hersteller seine eigene App hat, ist das sogar noch viel umständlicher. Smarthome-Hubs wie Home Assistant verbinden die unterschiedlichsten Systeme und Anwendungen unter einer Oberfläche und sorgen für wirklich smarte Funktionen.

Baustelle vor dem Bürofenster – die große Terrasse wird neu gepflastert

Wir haben seit über 6 Wochen eine Baustelle rund ums Haus, da wir unsere Terrasse, Einfahrten etc. erneuern lassen. Dabei kam auch heraus, dass die Fallrohre unserer Dachrinnen nicht mehr okay sind und ausgetauscht werden müssen. Unser Haus sieht zwar wie ein moderner Neubau aus, steht aber seit 1965.

Die Regenwasserzisterne

Und das 2,5 Meter tiefe Loch dafür.

Da gab es noch Rohre aus Ton und die sind irgendwann einmal kaputt. Da sowieso alles aufgerissen und der Bagger schon da war, war der Aufwand dafür überschaubar, daher haben wir uns auch gleich noch eine Regenwasserzisterne einbuddeln lassen, die das gesamte Regenwasser der großen Dach-Südseite auffangen kann. Durch die starken Regenfälle der letzten Tage ist die auch schon bis oben hin voll – immerhin 5.000 Liter. Zwei weitere Behälter (auf dem Bild oben rechts) waren schon von den Vorbesitzern hier und wurden versetzt. Auch diese fassen noch einmal gut 3.000 Liter und werden vom Garagendach gespeist.

Diese neue angelegte Fläche muss bewässert werden

Da dieses Regenwasser natürlich auch genutzt werden muss, installieren wir gerade eine automatische Bewässerung mit Versenkregnern und Wasserentnahmedosen von Gardena rund ums Haus. Dieses Jahr werden wir das zwar nicht mehr komplett umsetzen, aber es entstanden ein paar zusätzliche Flächen, die wir gerade frisch angesät haben und feucht gehalten werden wollen. Eine Tauchdruckpumpe war schon vorhanden und ein einfacher Regner sorgt mit einer ZigBee-Steckdose von Osram und einer Home Assistant Automation gerade dafür, dass der Grassamen die besten Voraussetzungen erhält.

Lohnt sich eine Regenwasserzisterne?

Eine Regenwasserzisterne ist eine tolle Sache, da man das Regenwasser in Trockenzeiten nicht nur für die Gartenbewässerung, sondern auch auf Reinigungsarbeiten etc. nutzen kann. Zwar war der Sommer dieses Jahr sehr nass, die letzten beiden Jahre aber extrem trocken, sodass eine Bewässerung notwendig wird, wenn man einen grünen Garten möchte. Eine Brunnenbohrung ist bei uns aus geografischen Gründen nicht wirtschaftlich möglich.

Die Kosten für eine Regenwasserzisterne sind allerdings erheblich. Eine Flachzisterne mit 5.000 Litern Kapazität und Vorfilter kostet in guter Qualität (unsere kauften wir bei der BayWa) 2.500 Euro. Für Aushubarbeiten, Kies und Sand, Einbau, Anschluss bzw. Erweiterung der Rohre, Tauchdruckpumpe usw. kommt mindestens noch einmal der gleiche Betrag hinzu.

Regenwasser vom Dach im Vorfilter der Zisterne

In unserer Region muss man mit 15 Liter pro Quadratmeter und Woche rechnen. Die zu bewässernde Fläche beträgt bei uns ca. 500 qm und muss im Schnitt 16 Wochen bewässert werden. 15 l * 500 qm *16 Wochen = 120.000 Liter = 120 qm Wasser pro Saison. Bei uns gibt es keinen gesonderten Tarif für Gartenwasser, daher würden wir hier 580 Euro pro Jahr nur für die Gartenbewässerung ausgeben, wenn wir diese optimal machen möchten. Die Zisterne würde sich damit nach gut 10 Jahren rechnen. Da bei uns Bagger etc. ohnehin schon da waren, fällt die Rechnung deutlich besser aus.

Betrachtet man die Entwicklung der Temperaturen durch den Klimawandel, dürfte der Wasserbedarf in den nächsten Jahren jedoch deutlich steigen und dann wird man froh sein, wenn man auf günstiges Regenwasser zurückgreifen kann. Sicher steigen dann nämlich auch die Kosten für Leitungswasser.

Mehrere Schaltzeiten in Home Assistant einstellen

Damit Rasen gut anwachsen kann, soll man ihn besser öfter, dafür kürzer bewässern. Tagsüber jede Stunde für 2-3 Minuten ist nach meinen Recherchen wohl optimal. Außerdem soll die Bewässerung ausgesetzt werden, wenn es regnet oder an diesem Tag schon mehr als 3 mm Niederschlag gegeben hat. Da wir mit unserer LCN-WIH bereits einen Regensensor auf dem Dach haben, kann man diesen auch gleich dafür einsetzen. Über die FineOffset Wetterstation (die unter zig Markennamen wie Bresser, Saintlogic oder dnt angeboten wird), ihren Niederschlagsmesser und WeeWX bekomme ich außerdem die stündliche und tägliche Regenmenge berichtet.

Fine Offset WH1080 Wetterstation

Die Wetterstation auf unserem Dach

Der geplante Ablauf ist also:

  • Schalte die Pumpe über die ZigBee Steckdose jede volle Stunde für 2 Minuten ein
  • aber nur wenn es aktuell nicht regnet
  • oder es heute schon mehr als 3 mm Niederschlag (= 3 Liter pro Quadratmeter) gab

Meine Osram ZigBee Steckdose heißt bei mir übrigens “Springer”, da sie immer dann zum Einsatz kommt, wenn ich vorübergehend eine bestimmte Funktion benötige.

Eine Automation mit einer einzigen Schaltzeit und den genannten Bedingungen lässt sich im visuellen Editor für Automationen zusammenklicken.

Home Assistant Automation mit mehreren Schaltzeiten

Automation anlegen und Namen geben

Home Assistant Automation mit mehreren Schaltzeiten

Mehrere Schaltzeiten als Auslöser der Automation als Liste in YAML

Home Assistant Automation mit mehreren Schaltzeiten

Erste Bedingung: Es darf gerade nicht regnen (vom LCN-Regensensor auf dem Dach)

Home Assistant Automation mit mehreren Schaltzeiten

Zweite Bedingung: Es darf nicht mehr als 0,3 cm Niederschlag gehabt haben – vom Regenmesser der FineOffset Wetterstation und WeeWX

Wenn alles zutrifft, wird der Dienst “switch.turn_on” gestartet und die ZigBee-Steckdose “Springer” aktiviert. Nach einer Verzögerung von 2 Minuten …

… wird der Dienst “switch.turn_off” aufgerufen, der die Steckdose und damit die Pumpe wieder ausschaltet

Möchte man jedoch mehrere Schaltzeiten, muss man etwas YAML-Code einfügen. Praktischerweise gibt es in HA für den “Time” Auslöser die Möglichkeit mehrere Zeiten als Liste anzugeben. Für die Aufgabe der Gartenbewässerung ist das ideal, da man hier selten andere Einstellungen benötigen wird.

alias: Bewässerung
description: ''
trigger:
  - platform: time
    at:
      - '7:00'
      - '8:00'
      - '9:00'
      - '10:00'
      - '11:00'
      - '12:00'
      - '13:00'
      - '14:00'
      - '15:00'
      - '16:00'
      - '17:00'
      - '18:00'
      - '19:00'
      - '20:00'
condition:
  - condition: state
    entity_id: binary_sensor.wih_regen
    state: 'off'
  - condition: numeric_state
    entity_id: sensor.weewx_niederschlag_heute_cm
    below: '0.3'
action:
  - service: switch.turn_on
    target:
      entity_id: switch.springer
  - delay:
      hours: 0
      minutes: 2
      seconds: 0
      milliseconds: 0
  - service: switch.turn_off
    target:
      entity_id: switch.springer
mode: single

Ihr könnt die grundsätzliche Automation erst einmal über den visuellen Editor anlegen, da diese sehr komfortabel bei der Auswahl der Entitäten wie Schalter und Sensoren ist. Danach klickt ihr oben rechts in der Automation auf die drei Pünktchen und wählt “Als YAML bearbeiten” aus. Damit lassen sich die Schaltzeiten wie oben dargestellt erweitern. Nachdem die Automatisierung gespeichert wurde, muss man unter Einstellungen -> Serversteuerung die Automationen neu laden, damit diese auch aktiv werden.

Frontend und Einstellung der Bewässerungsdauer über Helfer

Im Lovelace Frontend kann man einen Schalter für die Automation einbauen, mit dem man sie bei Bedarf auch deaktivieren kann. Ich habe auch einen Schalter für meine “Springer” Steckdose, damit ich diese auch manuell schalten kann.

Ein Schalter, um die Automation deaktivieren zu können.

Damit könnte man auch eine automatische Deaktivierung der Bewässerung realisieren, wenn die Kamera Personen vor dem Hochbeet erkennt, damit diese nicht nass werden – mit Frigate und einer eigenen Zone für das Hochbeet wäre das kein Problem.

Außerdem wäre es praktisch, wenn man die Bewässerungsdauer im Frontend einstellen könnte. Dazu legt man sich unter Einstellungen -> Helfer einen Schieberegler an, mit dem man die Bewässerungsdauer in Minuten bestimmen kann.

Ein Helfer, um die Bewässerungsdauer individuell anpassen zu können. Minimal kann 1 Minute eingestellt werden, maximal 30 Minuten.

Um den Helfer mit der Zeiteinstellung in die Automation einbinden kann, bedarf es wieder etwas YAML, das die fest-codierte Verzögerungseinstellung ersetzt:

delay:
  minutes: '{{ states(''input_number.bewasserungsdauer'') | int  }}'

Damit erfolgt die Einstellung der Bewässerungsdauer über den Helfer und kann im Frontend verändert werden

Den Helfer für die Bewässerungsdauer könnte man nun auch über den Dienst input_number manipulieren. So wäre eine weitere Automation denkbar, welche die Bewässerungsdauer in Abhängigkeit der Außentemperatur verlängert oder je nach Bodenfeuchte verkürzt – oder oder oder …

Welche Sensoren und Bedingungen ihr einfügt, bleibt euch natürlich selbst überlassen. Vielleicht habt ihr einen Bodenfeuchte-Sensor über ESPHome eingebunden (eine kleine Bauanleitung dazu folgt demnächst) oder wertet die Daten eines Wetterdienstes aus? Mit einem Füllstandssensor für die Zisterne könnte man die Bewässerungszeit verringern oder ganz abschalten etc. Es gibt jede Menge Möglichkeiten und natürlich beschränkt sich die Anwendung mehrerer Schaltzeiten nicht nur auf die Gartenbewässerung 😉

NAS- und Netzwerklaufwerke mit Home Assistant einbinden

Viele von euch haben große Mediensammlungen auf NAS-Laufwerken. Leider gibt es in Home Assistant bislang noch keinen einfachen und direkten Weg, Windows-/Samba-Netzlaufwerke zu verbinden und die Daten daraus in Home Assistant verfügbar zu machen. Mit ein paar kleinen Einstellungen geht es aber relativ einfach und schnell.

Zunächst solltet ihr die gewünschten Freigaben auf eurem NAS oder File-Server einrichten und sicherstellen, dass diese von anderen Geräten aus erreichbar sind. Das hängt natürlich von euren Systemen ab und weil es so viele Möglichkeiten gibt, kann das nicht Teil der Anleitung sein.

Die eigentliche Anbindung des Netzwerk-Shares an Home Assistant geht über den Umweg eines Shell-Commands. Damit kann man Linux-Befehle aus Home Assistant heraus ausführen. In diesem Fall ist der mount Befehl, mit dem wir das Netzlaufwerk verbinden.

In eurer configuration.yaml tragt ihr Folgendes ein:

shell_command:
  mount_music_folder: mkdir -p /media/musik;mount -v -t cifs -o vers=1.0,noserverino,user=media,password=media123,domain=WORKGROUP,sec=ntlm //192.168.178.2/media/musik /media/musik

Zerlegen wir mal den gesamten Befehl:

shell_command: sagt Home Assistant einfach, dass diesen Linux-Befehl als Service zur Verfügung stehen soll. Services kann man dann in Automationen und Skripts verwenden. Dazu später noch mehr.

mount_music_folder – ist ein beliebiger Name für den neuen Service. Man könnte es auch musiklaufwerk_verbinden nennen oder Ähnliches.

mkdir -p – legt zunächst ein Verzeichnis in Home Assistant an, das bei erfolgreichem mount-Befehl den Inhalt des Netzlaufwerks wiederspiegelt. Das -p sagt, dass der Befehl keinen Fehler ausgeben soll, wenn das Verzeichnis schon vorhanden ist.

/media/musik: Damit Home Assistant die Daten auch in seinem Medien-Verzeichnis erkennt, müssen wir das Netzlaufwerk in diesem mounten. Ich möchte, dass meine Musik im Unterverzeichnis /media/musik verbunden wird

mount – v -t cifs -o vers=1.0, noserverino – der eigentliche Mountbefehl, der Samba/Windows-Shares mit der Samba-Version 1.0 verbindet. Die Version 1.0 (vers=1.0) ist meist am unproblematischsten, aber auch am langsamsten. Andere Werte wären vers=2.0 oder vers=3.0. Siehe auch: mount.cifs › Wiki › ubuntuusers.de

user=media,password=media123,domain=WORKGROUP,sec=ntlm – beim user wird ein Username angegeben, der Zugriffserlaubnis auf euer Netzlaufwerk hat und mit password=media123 das zugehörige Passwort. sec=ntlm definiert die Hashing-Methode des Passworts.

//192.168.178.2/media/musik – ist der UNC-Pfad zu eurem NAS oder Server, in dem die gewünschten Daten liegen und dieser wird im anfangs erwähnten und angelegten Verzeichnis /media/musik in Home Assistant gemountet

Ihr solltet auf jeden Fall vorher probieren, ob ihr mit dem Netzwerk- oder UNC-Pfad und dem zugehörigen User/Passwort Zugriff auf euer Netzlaufwerk bekommt. Man kann das auch von der Home Assistant Shell mit dem kompletten Befehl testen. Verläuft das positiv, steht dem Einsatz nichts mehr im Wege.

Damit wird das Verzeichnis aber noch nicht gemountet. Damit das überhaupt geschieht, muss der Service mount_musik_folder – oder wie ihr ihn auch immer genannt habt, ausgeführt werden, und zwar am besten immer dann, wenn Home Assistant neu startet.

Home Assistant Entwickler Werkzeuge

Den neuen Service in den Entwickler-Tools testen

Zunächst könnt ihr den Service in den Entwickler-Tools -> Dienste testen, indem ihr nach dem Dienst, in meinem Fall mount_music_folder sucht und dann Dienst ausführen auswählt. Nun sollte der Inhalt eures Netzlaufwerks in Home Assistant im Medien Browser zu finden sein.

Home Assistant Medien-Browser

Die Verzeichnisse des NAS-Laufwerks im Media-Browser von Home Assistant

Nun müssen wir Home Assistant nur noch beibringen, diesen Dienst auch beim Neustart auszuführen. Dazu legen wir eine Automatisierung an:

Zunächst vergeben wir einen Namen für die Automatisierung. Bei mir heißt sie Mount Unraid NAS

Home Assistant Automatisierung anlegen

Der Auslöser für die Automatisierung ist der Start von Home Assistant. Und als Aktionstyp soll unser Service mount_music_folder ausgeführt werden.

Home Assistant Aktionen - Services ausführen

Ich habe mehrere Laufwerke, die beim Start eingebunden werden sollen. Diese kann man einfach nacheinander angeben, muss sie aber vorher in der configuration.yaml genau so definieren, wie in unserem Beispiel, also in der Form:

1
2
3
4
shell_command:
  mount_music_folder: ...
  mount_video_folder: ...
  mount_photos_folder: ...

Nun noch die Automatisierung speichern und ab jetzt werden bei jedem Start von Home Assistant eure Netzlaufwerke in Home Assistant verfügbar gemacht.

KI-gesteuerte Überwachungskameras mit Home Assistant, Frigate und Google Coral

Wir haben ums Haus herum 4 Kameras im Einsatz. Ich habe im Lauf der Zeit unterschiedliche Systeme ausprobiert, darunter Motion Eye, iSpy, Zoneminder und Shinobi. Keine der Lösungen überzeugte mich so richtig, zumal alle mit den gleichen “dummen” Überwachungsfunktionen arbeiteten und damit jede Menge unwichtiger Bewegungen erkannten. Zudem waren sie ziemlich CPU-Hungrig. Das ist bei meinem System zwar kein Problem, da meine ganzen NAS- und Smarthome-Funktionen auf einem HP Microserver mit Intel XEON E3 1230 CPU laufen und der hat genügend Leistungsreserven, aber für die gebotene Funktionalität war es einfach zu viel. Die Bewegungserkennung kam auch kaum über die meiner HIKVision Kameras hinaus.

HIKVision IP-Kameras für den Außenbereich (Modell DS-2CD2342WD)

Frigate Überwachungssoftware mit KI-Funktion

Mit Frigate gibt es seit einiger Zeit eine Überwachungssoftware für Kameras, die tief in Home Assistant integriert ist und per KI (über Tensor Flow) den Bildinhalt analysiert. Dabei kann Frigate z. B. zwischen Personen, Katzen, Autos, LKWs und vielen anderen Objekten unterscheiden. Gleichzeitig können die Ereignisse als Sensoren in Home Assistant genutzt werden und damit entsprechend Funktionen wie z. B. Außenlicht etc. steuern. Frigate kann ganz einfach über den Supervisor installiert werden und wird damit nahtlos in Home Assistant integriert.

Da hat Frigate mich erwischt …

Die Einrichtung erfolgt per YAML-Konfigurationsdatei, in der die Kameras und deren Funktionen konfiguriert werden. Idealerweise passen dabei die zu erkennenden Objekte in ein Quadrat von 300×300 Pixeln Größe. Eine sehr hohe Kamera-Auflösung ist daher nicht unbedingt besser. Für die exakte Bilderkennung genügt auch eine Bildwiederholrate von 5 fps.

Eine beispielhafte Konfiguration sieht z. B. so aus:

  einfahrt:
    ffmpeg:
      inputs:
        - path: rtsp://user:passwort@MEINEKAMERAIP/Streaming/Channels/101
          roles: 
            - detect
            - clips
            - rtmp

    width: 1280
    height: 720
    fps: 5
    objects:
      track:
        - person
        - cat
        - dog
      filters:
        person:
          min_score: 0.6
          threshold: 0.5
        cat:
          min_score: 0.4
          threshold: 0.5
    motion:
      mask:
        - 0,679,167,543,467,205,751,158,1280,308,1280,0,0,0      
      contour_area: 80 

    clips:
      enabled: true
      pre_capture: 5

Im “Input” Bereich legt man die Adresse der Überwachungskamera und die gewünschten Funktionen fest. In diesem Fall sollen Objekte detektiert und bei Ereignissen Video-Clips davon aufgezeichnet werden. Gleichzeitig soll das Kamera-Bild als RTMP-Stream weitergereicht werden. Damit ist der Kamera-Stream über die standardisierte Adresse rtmp://HA-IP/live/kameraname erreich- und einbindbar.

Bei “Objects” legt man fest, welche Objekte erkannt werden sollen und mit “Filters” wird die Erkennungsschwelle eingestellt. Mit der “Mask” können Bereiche aus der Erkennung ausgeschlossen werden und mit “pre_capture” wird festgelegt, wie viele Sekunden vor dem Ereignis in der Aufzeichnung enthalten sein sollen. Für jede Kamera und für jeden Objekt-Typen lassen sich Aufbewahrungszeiten festlegen, nach denen die Clips und Bilder automatisch gelöscht werden. So kann man z. B. Clips von Personen 10 Tage aufheben, von Fahrzeugen aber nur 3 Tage.

Frigate mi meinen Kameras in Home Assistant

Auf die Ereignisse und Einstellungen von Frigate kann per MQTT zugegriffen werden. Es gibt jedoch auch eine Erweiterung frigate-hass-integration, die man einfach über HACS installieren kann und die komfortable Sensor-Entities, Switches und Binary-Sensoren (“Bewegung erkannt”) bereitstellt. Über die Switch-Entities kann man z. B. die Objekterkennung deaktivieren, wenn die Terrassentür geöffnet ist (einen entsprechenden Türsensor vorausgesetzt), damit man nicht ständig selbst erkannt und unnötig aufgezeichnet wird. Oder man pappt sich ein NFC-Tag an die Hauswand, welches man mit dem Smartphone scannt und das dann die Erkennung für diesen Bereich über eine entsprechende Automation für z. B. 1 Stunde deaktiviert.

Frigate Entities in Home Assistant

Frigate Sensoren und Switch-Entities in Home Assistant

Apropos Bereiche: In der Frigate Konfiguration kann man auch “Zones” definieren. Hat man z. B. einen Kamerabereich, in dem sich die Garageneinfahrt, der Hauseingang und der Briefkasten befinden, kann man für jeden dieser Bereiche Zonen definieren. Diese melden dann selektiv, wenn in dieser Zone eine Bewegung erkannt wurde.

Man kann auch Kameras einbinden, die statt einem RSTP-Stream einen MPEG-Stream liefern, was bei meiner WANTEC Monolith C IP/VoIP Türsprechanlage der Fall ist. Dazu muss der MPEG-Stream per FFMPG umgewandelt werden. Das sieht in meiner frigate.yml so aus:

  eingang:

    ffmpeg:

      inputs:

        - path: http://user:password@IP-WANTEC-KAMERA:8080/?action=stream
            roles:
            - detect
            - clips



      input_args:
              - -avoid_negative_ts
              - make_zero
              - -fflags
              - nobuffer
              - -flags
              - low_delay
              - -strict
              - experimental
              - -fflags
              - +genpts+discardcorrupt
              - -r
              - "5" # <---- adjust depending on your desired frame rate from the mjpeg image
              - -use_wallclock_as_timestamps
              - "1"

      output_args:
        detect: -f rawvideo -pix_fmt yuv420p
        clips: -f segment -segment_time 10 -segment_format mp4 -reset_timestamps 1 -strftime 1 -c:v libx264 -an


    width: 1280
    height: 720
    fps: 15
    clips:
      enabled: true


    objects:
      track:
        - person
        - cat
        - dog
      filters:
        person:
          min_score: 0.6
          threshold: 0.6


    motion:
      mask:
        - 0,406,0,380,0,306,0,0,545,0,544,277
      contour_area: 80

Damit wurde auch die Kamera der Türsprechanlage zur vollwertigen Überwachungskamera samt Objekterkennung und das ganz ohne irgendwelchen Cloud-Dienste.

Weniger CPU-Last und bessere Erkennung mit Google Coral

Das Besondere an Frigate ist auch, dass man neben GPUs (bei unterstützten Grafikkarten/Chips) auch den Google Coral USB-Accelerator einbinden kann. Das ist ein TPU (Tensor Processing Unit) in Form eines kleinen USB3 Dongles. Damit wird die CPU enorm entlastet und der kleine Google Coral analysiert über 100 Frames pro Sekunde, was gerade bei mehreren Kameras oder bei der Nutzung eines Raspberry Pi sehr hilfreich ist.

Google Coral TPU

Den Google Coral gibt es z. B. beim Elektronik-Versender Pollin für 69,99 € zzgl. Versand. Wenn ihr euch für den Pollin-Newsletter anmeldet, bekommt ihr einen 5 Euro Gutschein und spart damit die Versandkosten!

Eingebunden wird der Google Coral in der frigate.yml mit diesen Parametern:

1
2
3
4
detectors:
  coral:
    type: edgetpu
    device: usb

In der Praxis

Für die Einrichtung von Frigate muss man ein wenig die Dokumentation studieren, die in manchen Bereich auch noch einige Lücken hat. Weiter hilft hier wie immer das HA-Forum und das HA-Sub-Reddit. Meine 4 Kameras waren dann aber schnell eingebunden und funktionierten tadellos. Überhaupt ist die echte Objekterkennung (und Unterscheidung) ein Segen! Bewegte Äste oder Vögel führen so nicht mehr zu unerwünschten Aufzeichnungen und Benachrichtigungen. Die Erkennungsleistung ist sehr gut, auch wenn manche Katze als Hund erkannt wird 🙂

Einmal erkennt Frigate die Katze richtig …

und einmal wird sie zum Hund 🙂

Die Latenz bei der Objekterkennung liegt bei mir unter 1 Sekunde (was allerdings vermutlich auch am Google Coral liegt) und damit eignet sich Frigate und der entsprechende Switch auch dazu, einen dummen Bewegungsmelder zu ersetzen und nicht bei jeder Katze die Außenbeleuchtung anzuschalten. Die Erkennung funktioniert bei meinen HikVision Kameras mit deren IR-Beleuchtung und guten Bildqualität auch nachts, wenn es regnet.

Fazit

Frigate ist meiner Ansicht nach die derzeit beste kostenlose Software für Überwachungskameras. Noch wird fleißig entwickelt und manches muss man sich recht mühsam erarbeiten, aber das Ergebnis überzeugt schon jetzt vollends. Ich würde auf jeden Fall den Google Coral empfehlen, da man damit auch auf dem Raspi Frigate problemlos laufen lassen kann.

Zwar werden viele Objekte von Haus aus von Frigate unterstützt, darunter Giraffe, Zebra, Bananen und Zahnbürsten, aber richtig interessant wird Frigate dann, wenn es auch Personen unterscheiden kann. Ich sammle gerade Bilder von uns, um eigene Custom Models für Tensor Flow und Gesichtserkennung zu trainieren. Allerdings muss ich mit damit erst noch ausführlich beschäftigen, da das Thema momentan noch nicht auf der Feature-Liste von Frigate steht.