Smarthome-BlogSmarte Wetterstation

Smarte Wetterstation

Niederschlagsmenge, Temperatur, Luftfeuchtigkeit

Lesezeit: 13 min

Veröffentlicht: 2024.09.08

Letztes Update: 2024.09.25

Niederschlagsmengen Sensor an Balkongeländer

Das Ziel dieses Projektes war der Bau einer smarten Wetterstation für meinen Balkon.
Folgende Werte wollte ich messen:

  • Niederschlagsmenge
  • Temperatur
  • Luftfeuchtigkeit

Die Messung der Temperatur & Luftfeuchtigkeit findet über einen DHT22-Sensor statt. Wie das funktioniert, habe ich bereits in diesem Artikel erklärt:
Luftfeuchtigkeit- & Temperatursensor DHT22

Falls ihr Hilfe bei der Einrichtung eures ESP in ESPHome für Homeassistant braucht, könnt ihr hier nachlesen: ESPHome mit Web Installer flashen

In diesem Artikel geht es hauptsächlich um die Messung der Niederschlagsmenge. Diese erfolgt mit folgendem Sensor:
MS-WH-SP-RG Regenmesser (Affiliate-Link)

Darin eingebaut ist eine kleine Wippe, welche, sobald diese mit Wasser voll ist, kippt. Die dadurch entstehenden Impulse können wir messen und auswerten.
Dies soll am selben ESP stattfinden, welcher auch die Temperatur- & Luftfeuchtigkeitsmessung durchführt.

Empfang optimieren

Das erste Problem, welches für dieses Projekt zu lösen war, ist der geringe WLAN-Empfang auf meinem Balkon. Aus diesem Grund habe ich mir dafür einen ESP8266 Pro mit externer Antenne (Affiliate-Link) ausgesucht.

Auf der Platine befindet sich ein kleiner Anschluss für die externe Antenne, im Werkszustand verwendet der ESP jedoch eine kleine Keramikantenne, welche sich auf der Platine befindet. Um den Antennenanschluss zu "aktivieren", muss ein Widerstand entfernt und zwei weitere Pins miteinander verbunden werden:

ESP8266 Pro Anschluss für externe Antenne aktivieren

Anschließend kann die externe Antenne einfach angesteckt werden.

Da ich zum ersten Mal diesen ESP für ein Projekt genutzt habe, habe ich diesen zuerst neben einem gewöhnlichen ESP8266 D1 Mini auf dem Balkon platziert, um die Wirkung der Antenne vergleichen zu können.

Um die Stärke des WLAN-Signals als Entität in Homeassistant verfügbar zu machen, kann man folgenden Sensor in ESPHome definieren:

YAML

sensor:
  - platform: wifi_signal
    name: "Wifi Signal"
    update_interval: 60s
    icon: mdi:wifi

Hier der Verlauf der Signalstärken beider ESP's über einen Zeitraum von 2 Stunden:

Vergleich WLAN-Signalstärken D1 Mini und Pro mit Antenne

Zu erkennen ist, dass die externe Antenne etwa 6 dBm besseren Empfang bietet, als die in den D1 Mini integrierte Antenne.
Das klingt zwar nicht nach viel, es handelt sich aber um eine logarithmische Skala. Die Signalstärke ist bei 6 dBm Unterschied 4 Mal so hoch.

Auch in der praktischen Anwendung hatte ich den Eindruck, dass dieser Unterschied für meinen Standort entscheidend war. Die Übertragung von neuen Konfigurationen und Updates auf den D1 Mini hat in ESPHome immer wieder fehlgeschlagen, während diese beim Pro mit Antenne durchgehend stabil funktioniert haben.

Solltet ihr also einmal Probleme mit dem WLAN-Empfang bei einem Smarthome-Projekt mit einem ESP haben, kann es sich auszahlen, einen Blick auf den ESP8266 Pro mit externer Antenne zu werfen.

Niederschlagsmessung

Bei dem Sensor für die Messung der Niederschlagsmenge handelt es sich um eine kleine Wanne mit eingebauter Wippe:

Wippe des Niederschlagmessers

Füllt sich die Wippe mit Wasser, kippt diese und der Kontaktschalter schließt kurz.
Dieser Impuls kann an einem digitalen Eingang des ESP ausgewertet werden.

Für meinen Anwendungsfall war das Kabel des Sensors zu kurz.
Wie im Bild oben zu sehen, habe ich ihn deshalb geöffnet.
Darin enthalten ist eine einfache Platine mit einem Reed-Kontakt.
An diese kann man einfach ein neues Kabel mit der gewünschten Länge anlöten und anschließend die Einheit wieder zusammen bauen:

Platine des Niederschlagsmessers mit Reed-Kontakt

Achtung: Achtet, bevor ihr das Kabel anlötet auf diesen Kabelweg, dieser ist notwendig, damit das Kabel aus dem Sensor geführt werden kann:

Kabelweg aus der Regenmesser Wippe

Wenn die Wippe voll ist und kippt, schlägt sie auf diese kleine Plastiknase auf, was ich als etwas zu laut empfunden habe. Zur Abhilfe reicht ein kleiner tropfen Heißkleber auf die Nase:

Heißklebetopfen auf Plastiknase unter der Wippe

Berechnung Niederschlagsmenge

Für die Berechnung, wie viel Niederschlag nun tatsächlich stattgefunden hat, brauchen wir einen Wert, wie viel mm (Wassersäule) Niederschlag einmal wippen entspricht.

Schüttet man 100 ml Wasser in den Sensor, kann man 50 Kippungen zählen. Das entspricht also 2 ml oder 0,002 Liter pro Kippung.

Die Maße des Beckens des Sensors sind 4,9 cm x 10,9 cm, also 54,41 cm². Die Niederschlagsmenge in mm entspricht dem Wert von Liter pro Quadratmeter.
1 m² sind 10000 cm².
Somit ist das Verhältnis zur Fläche des Sensors 10000 / 54,41 = 187,230855645.

Diesen Faktor multipliziert man mit den 0,002 Litern pro Kippung, also:
0,002 × 187,230855645 = 0,374461711 Liter/m² (oder mm) pro Impuls.

Diesen Wert werden wir später für die Berechnung in Homeassistant benötigen.

Verkabelung

Die Verkabelung sieht folgendermaßen aus:

Schema Verkabelung smarte Wetterstation

Hier meine etwas rustikale Ausführung derselben:

Reale Verkabelung smarte Wetterstation

Anschließend habe ich alles kompakt in eine Klemmdose verpackt.
Kleine Bohrungen ermöglichen den Zugang für die Kabel und für die Antenne:

Einbau der Verkabelung in eine Klemmdose

Für die Abtrennung habe ich ein Stück Karton in die Dose geklebt.
Das soll verhindern, dass die Wärme, welche der ESP beim Betrieb erzeugt, die Messung des DHT22 beeinflusst.
Was auf den Bildern nicht zu sehen ist, ist der Deckel der Klemmdose.
Diesen habe ich auf der Seite des DHT22 ebenfalls mit Löchern versehen, damit der DHT22 direkt der Außenluft ausgesetzt ist.
Die Löcher für die Kabel habe ich abschließend noch mit Heißkleber abgedichtet, um den ESP vor Witterungseinflüssen zu schützen.

Programmierung Homeassistant

Zum einen soll in Homeassistant natürlich Temperatur, Luftfeuchtigkeit und Niederschlagsmenge verfügbar gemacht werden. Zusätzlich wollte ich noch Benachrichtigungen einrichten, wenn es zu regnen beginnt und wenn es wieder aufhört zu regnen.

Zuerst zur Konfiguration des ESP, folgendes habe ich in ESPHome definiert:

YAML

sensor:
  - platform: wifi_signal
    name: "Wifi Signal"
    update_interval: 60s
    icon: mdi:wifi

  # Luftfeuchtigkeit und Temperatur Sensor
  - platform: dht
    pin: D5
    model: DHT22
    temperature:
      name: "Draussen Temperatur"
      filters:
        - calibrate_linear:
           method: least_squares
           datapoints:
            - 23.3 -> 22.95
            - 27.9 -> 26.6
            - 38.7 -> 33.65
    humidity:
      name: "Draussen Luftfeuchtigkeit"
      filters:
        - calibrate_linear:
           method: least_squares
           datapoints:
            - 26 -> 36.3
            - 48 -> 38.5
            - 26 -> 28.5
    update_interval: 60s

binary_sensor:
  # Regen Wippe
  - platform: gpio
    pin: 
      number: D2
      mode: INPUT_PULLUP
    name: "Rain"

  - platform: status
    name: "Klima Draußen Status"

Zur Konfiguration des DHT22 für die Temperatur und Luftfeuchtigkeit an Pin D5 sowie die Kalibrierung mit dem calibrate_linear Filter habe ich bereits einen Artikel geschrieben: Luftfeuchtigkeit & Temperatur Sensor DHT22

Für D2 habe ich einen einfachen binary_sensor mit dem Namen Rain definiert. Dieser wird in Homeassistant den Status off oder on haben, je nachdem wie die Wippe des Sensors sich bewegt.
Damit die Messung korrekt funktioniert, ist es notwendig, mittels mode: INPUT_PULLUP den in den ESP integrierten Pull-Up Widerstand zu aktivieren.

Abschließend habe ich noch einen status Sensor aktiviert, welcher in Homeassistant anzeigt, ob der ESP verbunden ist.

Im nächsten Schritt definieren wir 2 Helfer-Variablen. Eine input_number mit der unit_of_measurement in mm für die gemessene Regenmenge und eine input_boolean für den Status, ob es derzeit regnet oder nicht:

YAML

input_number:
  rain_volume:
    name: "Rain Volume"
    initial: 0
    min: 0
    max: 10000
    unit_of_measurement: 'mm'

input_boolean:
  currently_raining:
    name: "Currently Raining"

Nun brauchen wir ein paar Automatisationen, die erste, um die Regenmenge zu erhöhen, wenn ein Impuls durch den Niederschlagsmesser erkannt wird:

YAML

alias: Regensenor Menge erhöhen
description: ""
trigger:
  - platform: state
    entity_id:
      - binary_sensor.klima_draussen_v2_rain
    from: "off"
    to: "on"
condition: []
action:
  - data_template:
      entity_id: input_number.rain_volume
      value: >-
        {{ (states('input_number.rain_volume') | float + 0.374461711) | round(2)
        }}
    action: input_number.set_value
  - if:
      - condition: state
        entity_id: input_boolean.currently_raining
        state: "off"
    then:
      - action: input_boolean.turn_on
        metadata: {}
        data: {}
        target:
          entity_id: input_boolean.currently_raining
      - action: notify.notify
        metadata: {}
        data:
          message: Es hat zu regnen begonnen
        enabled: true
mode: single

binary_sensor.klima_draussen_v2_rain ist die Entität der Wippe des ESP.
Wenn diese von off zu on wechselt, weil die Wippe gekippt ist, wird die Automatisation ausgelöst.

Anschließend wird die vorher definierte input_number.rain_volume um den Wert 0.374461711 erhöht, wie wir oben berechnet haben. Das Resultat wird mittels round(2) auf 2 Nachkommastellen gerundet.

Danach erfolgt eine if Abfrage, ob input_boolean.currently_raining auf off ist, es also derzeit noch nicht regnet. Ist das der Fall, wird eben dieser Wert auf on gesetzt und mittels notify.notify die Benachrichtigung "Es hat zu regnen begonnen" ausgesendet.

In der nächsten Automatisation geht es darum festzustellen, wann es zu regnen aufgehört hat:

YAML

alias: Regensensor Regen geendet
description: ""
trigger:
  - platform: template
    value_template: >
      {{ (as_timestamp(now()) -
      as_timestamp(states.binary_sensor.klima_draussen_v2_rain.last_changed)) >
      1800 }}
condition:
  - condition: state
    entity_id: input_boolean.currently_raining
    state: "on"
action:
  - target:
      entity_id: input_boolean.currently_raining
    action: input_boolean.turn_off
    data: {}
  - data:
      message: Es hat aufgehört zu regnen
    action: notify.notify
mode: single

Als Trigger nutzen wir ein Template, welches die Differenz zwischen as_timestamp(now()) und as_timestamp(states.binary_sensor.klima_draussen_v2_rain.last_changed) betrachtet, also wie viel Zeit vergangen ist, seitdem sich die Wippe des Regenmessers, das letzte Mal bewegt hat. Wenn dieser Wert über 1800 Sekunden, also 30 Minuten, liegt, wird die Automatisierung ausgelöst.

Als zusätzliche Bedingung wird abgefragt, ob input_boolean.currently_raining auf on ist, also ob es derzeit überhaupt regnet. Das verhindert, dass die Automatisierung läuft, nachdem der ESP neu gestartet wurde, weil in diesem Fall ja ebenfalls last_changed neu gesetzt wird, was aber nichts mit dem Regen zu tun hat.

Die Automatisierung setzt anschließend input_boolean.currently_raining auf off, es hat also aufgehört zu regnen. Mit notify.notify wird "Es hat aufgehört zu regnen" ausgesendet.

Abschließend brauchen wir noch eine Automatisierung, welche den Wert für die Niederschlagsmenge täglich zurücksetzt. Diese ist sehr einfach:

YAML

alias: Regensensor Mitternacht Reset
description: ""
trigger:
  - platform: time
    at: "00:00:00"
condition: []
action:
  - action: input_number.set_value
    metadata: {}
    data:
      value: 0
    target:
      entity_id: input_number.rain_volume
mode: single

Jeden Tag um 00:00 Uhr wird input_number.rain_volume wieder auf 0 gesetzt.

Falls ihr Fragen oder Verbesserungsvorschläge zu diesem Projekt habt, könnt ihr mich gerne kontaktieren, ich freue mich, von euch zu hören.

Keinen Beitrag mehr verpassen:

Feedback Me: