Smarthome-BlogSmarte Wetterstation
Smarte Wetterstation
Niederschlagsmenge, Temperatur, Luftfeuchtigkeit
Lesezeit: 13 min
Veröffentlicht: 2024.09.08
Letztes Update: 2024.10.24
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:
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:
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:
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:
Achtung: Achtet, bevor ihr das Kabel anlötet auf diesen Kabelweg, dieser ist notwendig, damit das Kabel aus dem Sensor geführt werden kann:
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:
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:
Hier meine etwas rustikale Ausführung derselben:
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:
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"
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.
Verwendete Produkte:
(Affiliate-Links)?
- Regenmesser: https://amzn.to/3XA13dS
- ESP8266 Pro mit Antenne: https://amzn.to/47gGiak
- Jumper Kabel: https://amzn.to/47koPhB
- Lötstation: https://amzn.to/4cociu5
- DHT22: https://amzn.to/3MDly3i