Dies ist eine alte Version des Dokuments!


Mini Wetterstation Standalone und FHEM

Die Mini Wetterstation ist ein Eigenbau-Produkt, welche über 5 Messfunktionen verfügt und diese auch zur Weiterverarbeitung zur Verfügung stellt.

Die Mini Wetterstation wird im heimischen Wifi-Netzwerk integriert und verfügt über eine sehr umfangreichen und einfach zu bedienendes Webinterface, in dem man sämtliche Messwerte ablesen und Konfigurieren kann.
Bei Bedarf sendet die Mini Wetterstation die erfassen Messwerte an eine Hausautomation (z.B. FHEM) was hier auch eingehend beschrieben wird.
Sie kann aber auch autark, also Standalone ohne Hausautomation verwendet werden.

Die Stromversorgung erfolgt über einen 5V Micro-USB-Anschluß. Hierzu kann ein eigenes Netzteil verwendet werden, oder auch ein in der Nähe befindlicher USB-Anschluß.
Weiterhin ist es möglich die Stromversorgung über eine Powerbank oder ein Battery-Pack zu realisieren.

Im Standalone Betrieb wird eine feste Stromversorgung empfohlen, da die Mini Wetterstation dann permanent Online ist und eine Powerbank in ca. 2-5 Tagen leer ist.
Im Sommer könnte eine Solar-Powerbank die Lebenszeit etwas erhöhen, dennoch ist ein fester Anschluß aus komfortgründen dringend zu empfehlen.

Im SleepMode Betrieb wacht die Mini Wetterstation alle 60 bis 4294 Sekunden (einstellbar), also max. alle 71 Minuten auf und sendet ihre Messwete an die Hausautomation.
Anschließend legt sie sich wieder schlafen und spart so viel Strom, sodass die Energie einer Powerbank um ein vielfaches länger reicht.



Bauanleitung (nur bei Bausatz-Kauf)

Wer einen Bausatz erworben hat, folgt zunächst dieser Bauanleitung und kommt später an die Stelle zurück für die Inbetriebnahme.
:-P Bauanleitung (Zugangsdaten siehe per E-Mail erhaltene Rechnung)

WiFi-Verbindung

Wenn die Mini Wetterstation sich nicht in das konfigurierte WiFI Netzwerk einwählen kann, fällt sie in den Access-Point Modus zurück und meldet sich mit der SSID namens WS, WS_1 oder beim Bausatz mit ESP_Easy_0.
Am Besten in diesem Zustand mit dem Smartphone zu dieser SSID connecten und man wird sofort zur Konfigurationsoberfläche weitergeleitet. Falls nicht, dann bitte nachfolgende IP-Adresse im Browser eingeben.

SSID : WS, WS_1, ESP_Easy_0
PASSWORT : configesp
WEBSERVER: http://192.168.4.1

Auf dem Webserver angelangt, wechselt man auf den Reiter Config und trägt die SSID des heimischen WiFi und dessen WPA Key (Kennwort) ein.
Anschließend nach unten scrollen und mittels des Buttons Submit die Konfiguration speichern. Danach muss die Mini-Wetterstation neu gestartet werden.
Im heimischen Router sollte man dann die Wetterstation mit dessen zugewiesener IP-Adresse finden.




Webinterface

An unserem Computer oder natürlich auch auf dem Smartphone oder Tablet können wir nun bequem das Webinterface der Mini Wetterstation im Browser aufrufen (dazu die zugewiesene IP-Adresse verwenden).

Gerätename und Admin Passwort

Das Webinterface ist per default nicht mit einem Kennwort geschützt, kann aber unter dem Reiter Config gesetzt werden. Auch der Name der Mini Wetterstation kann hier gesetzt werden.
Dieser Name ist aber nur für die Kommunikation mit einer Hausautomation von Bedeutung. Der Name wird dort vor den jeweiligen Sensor-Namen gesetzt. z.B. ESPEasy_WS_Regensensor.



Messwerte

Die Messwerte werden auf dem Reiter Devices angezeigt. Dort kann man mittels dem Button Edit auch den Interval angeben und den Senor ein/ausschalten, sowie die Übermittlung an die Hausautomation aktivieren.
Auch die Readings Ausgaben in FHEM werden dort vorgegeben und sind anfangs mit T, H, P, R, L benannt.
:!: Wer einen Bausatz erworben hat, kann anhand der Bilder die Einstellungen über den EDIT Button vornehmen. Die Reihenfolge der Task's sollte übernommen werden.


Version 1:
Die Version 1 hat noch einen zweiten, deaktivierten (disabled) Temperatursensor, welcher später eliminiert wurde. Auch der Luftfeuchtigkeitssensor hat einen etwas kleineren Messbereich, welcher jedoch selten über-/unterschritten wird.


Ab Version 2:

(Task 5 ist für die Lebensverlängerung des Regensensors und kann ebenso in Version 1 verwendet werden)

Messbereiche

Um die Werte besser einschätzen zu können, hier ein kurze Erklärung:

Version 1:

  • Temperatursensor Außen (BMP280) = -40 bis +85 °C
  • Temperatursensor Innen (DHT11) = 0 bis +50 °C
  • Feuchtigkeitssensor (DHT11) = 20 bis 90% RH
  • Luftdrucksensor (BMP280) = 300-1100 hPa
  • Regensensor (T1592 P) = 0-1000 (0-10 ist als trocken anzusehen. 1000 = Unterwasser)
  • Helligkeitssensor (BH1750) = 0-100.000 LX (100.000 = heller Sonnentag)

Ab Version 2:

  • Temperatursensor (BME280) = -40 bis +85 °C
  • Feuchtigkeitssensor (BME280) = 0 bis 100% RH
  • Luftdrucksensor (BME280) = 300-1100 hPa
  • Regensensor (T1592 P) = 0-1000 (0-10 ist als trocken anzusehen. 1000 = Unterwasser)
  • Helligkeitssensor (BH1750) = 0-100.000 LX (100.000 = heller Sonnentag)



Lenbensverlängerung Regensensor

Der Regensensor erkennt Regen, wenn der Stromkreis durch Regentropfen geschlossen wird. Jedoch wenn ein Strom fließt, egal, wie gering, startet die Elektrolyse.
Dabei oxidiert eine der Elektroden und die andere bekommt einen Metallüberzug. Das funktioniert aber leider nicht ewig, weil entweder die Elektrode irgendwann „aufgebraucht“ ist, oder so korrodiert ist, dass kein Strom mehr fließt. Demzufolge hält das Bauteil nicht ewig und muss leider irgendwann ausgetauscht werden. Aber um die Lebenszweit zu verlängern kann man den Strom nur zur Meßzeit einschalten und gleich wieder ausschalten. Wenn kein Strom fließt, entsteht auch keine Elektrolyse.

  • Dazu benennen wir den Namen Regensensor unter Devices Task 2 um in Regensensor_Device und deaktivieren (falls vorhaden) die Checkbox bei Send to Controller
  • Danach legen wir unter Devices ein Generic - Dummy Device als Task 5 an, nennen dieses Regensensor, aktivieren (falls vorhanden) die Checkbox bei Send to Controller und nennen das ValueR:


Danach nutzen wir die Rules in ESPEasy um den Strom zu schalten.
Falls der Reiter Rules noch nicht vorhanden ist, dann diesen unter Tools > Advanced aktivieren und mit Submit speichern.

Anschließend ist der Reiter Rules im Menü sichtbar, unter dem man einen Regelsatz mit folgendem Inhalt als Rules Set 1 ablegt und speichert:

On System#Boot do
  gpio,16,1
  timerSet,1,2
endon

On Rules#Timer=1 do
   gpio,16,1
   TaskRun,2
   TaskValueSet 5,1,[Regensensor_Device#R]
   gpio,16,0
   timerSet,1,300
endon

Erkärung des Scripts:
Bei Systemstart (On System#Boot) wird der Regensensor über den Pin GPIO16 (D0) eingeschaltet und ein Timer Nr.1 wird gestartet.
Nachdem Timer Nr.1 gestartet ist, schaltet dieser den Strom auf GPIO16 ein und lässt den Task mit der ID 2 (Regensensor) seinen Wert bestimmen. Danach wird dieser Wert in den Dummy mit der Task ID 5 Value 1 geschrieben.
Anschließend wird der GPIO16 (D0) wieder ausgeschaltet und der Timer Nr.1 startet erneut in 300 Sekunden.

Also muss das Gehäuse geöffnet und der + Kontakt des Regensensors auf den Pin D0 (GPIO16) des D1 Mini umgesteckt werden.
Danach sollte der Regensensor gemäß obigem Script timerSet,1,300 alle 5 Minuten (300 Sekunden) sich kurz einschalten und seinen Meßwert senden.
:!: Es ist darauf zu achten, dass die Task ID des Sensors (in obigem Bild unter Messwerte Task 2) mit dem Kommando TaskRun,2 übereinstimmt.
:!: Es ist darauf zu achten, dass die Task ID des Dummy und der Name des Sensors (in obigem Bild unter Messwerte Task5 und Task2) mit dem Kommando TaskValueSet 5,1,[Regensensor_Device#R] übereinstimmt.
:!: Der Regensensor mit der Task ID 2 darf nicht mehr an den Controller senden, da nur der Wert des Dummy für die Übermittlung an die Hausautomation maßgeblich ist.

Da der Regensensor jetzt nur noch alle 5 Minuten für den Bruchteil einer Sekunde einschaltet, sollte kaum eine Elektrolyse stattfinden und der Sensor viel viel länger halten.

Anbindung an Hausautomation (FHEM)

FHEM vorbereiten

Damit die Mini Wetterstation mit FHEM kommunizieren kann, muss zunächst in FHEM eine Bridge eingerichtet werden.
Diese lauscht an einem Port (per default 8383) und nimmt die Messwerte der Mini Wetterstation entgegen.

In FHEM einfach folgende Befehlszeile eingeben, speichern und FERTIG!

define espBridge ESPEasy bridge 8383


Danach sollte sich die espBridge zunächst auf initialized stellen. Wenn dies so ist, ist die Konfiguration in FHEM erstmal erledigt und wir arbeiten an der Mini Wetterstation weiter.


Wetterstation mit FHEM verbinden

Auf der Weboberfläche muss nun im Menü Controllers die Verbindung zu FHEM (espBridge) angegeben werden.
Dort auf Edit klicken und ausfüllen.

Protokol = FHEM HTTP
Controller IP = IP-Adresse des FHEM Servers
Controller Port = Connection Port des FHEM Servers (default 8383)
Controller User = Benutzername für die Verbindung (optional)
Controller Password = Passwort für die Verbindung (optional)
ACHTUNG: Wenn username/password vergeben werden, müssen diese selbstverständlich auch in FHEM bei der espBridge über set hinzugefügt werden.


Jetzt fängt die Mini Wetterstation bereits an mit FHEM zu quatschen. Damit beim quatschen aber noch die Sensoren und deren Werte übergeben werden, müssen wir bei diesen noch eine Checkbox aktivieren.
Also auf dem Reiter Devices bei jedem Sensor auf Edit klicken und das Häckchen Send to Contoller aktivieren.



Anschließend werden nach kurzer Zeit sämtliche Sensoren in FHEM automatisch angelernt und sind im Raum ESPEasy zu finden (autocreate aktivieren).
Die Anzeige der Grafik unter den Werten muss allerdings erst noch konfiguriert werden.


Man kann in der Grafik sehr gut erkennen, dass Sonnenaufgang ca. 07:00 Uhr und Sonnenuntergang ca. 17:00 Uhr war.

Oben gezeigter Plot hat folgende Konfiguration (DBLOG):

define SVG_ESPEasy SVG DBLOG:SVG_ESPEasy:HISTORY
attr SVG_ESPEasy group Sensoren
attr SVG_ESPEasy label "Wetterstation - Temperatur Min $data{min2}, Max $data{max2}, Last $data{currval2}"
attr SVG_ESPEasy plotsize 800,400
attr SVG_ESPEasy room ESPEasy

SVG_ESPEasy.gplot

# Created by FHEM/98_SVG.pm, 2018-11-08 09:57:49
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<L1>'
set ytics
set y2tics
set grid y2tics
set ylabel "Helligkeit 1/100 (Lux) / Luftdruck (mbar)"
set y2label "Temperatur (°C) / Luftfeuchte (%)"
set yrange [0:400]
set y2range [0:100]

#DBLOG ESPEasy_WS_Helligkeitssensor:L:::$val=$val/100
#DBLOG ESPEasy_WS_Temperatur_Luftfeuchte_Sensor:T::
#DBLOG ESPEasy_WS_Temperatur_Luftfeuchte_Sensor:H::
#DBLOG ESPEasy_WS_Luftdrucksensor:P:::$val=$val/10
#DBLOG ESPEasy_WS_Regensensor:R:::$val=$val/5

plot "<IN>" using 1:2 axes x1y1 title 'Helligkeit ( 1/100 Lux)' ls l1 lw 0.5 with quadraticSmooth,\
     "<IN>" using 1:2 axes x1y2 title 'Temperatur (°C)' ls l0fill_gyr lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Luftfeuchtigkeit (%)' ls l2 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Luftdruck (1/10 mbar)' ls l4 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Regen' ls l2fill lw 1 with steps

Oben gezeigter Plot hat folgende Konfiguration (FileLog):

define SVG_ESPEasy SVG ESPEasy_WS_Helligkeitssensor:SVG_ESPEasy:CURRENT
attr SVG_ESPEasy label "Wetterstation - Temperatur Min $data{min2}, Max $data{max2}, Last $data{currval2}"
attr SVG_ESPEasy plotsize 800,400
attr SVG_ESPEasy room ESPEasy

SVG_ESPEasy.gplot

# Created by FHEM/98_SVG.pm, 2019-01-08 19:29:53
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<L1>'
set ytics
set y2tics
set grid
set ylabel "Helligkeit 1/50 (Lux) / Luftdruck (mbar)"
set y2label "Temperatur (°C) / Luftfeuchte (%)"
set yrange [0:400]
set y2range [-12:100]

#FileLog_Helligkeitssensor 4:ESPEasy_WS_Helligkeitssensor.*::$fld[3]/50
#FileLog_Temperatur_Luftdrucksensor 4:ESPEasy_WS_Temperatur_Luftdruck_Sensor.T\x3a::
#FileLog_Luftfeuchtesensor 4:ESPEasy_WS_Luftfeuchte_Sensor.H\x3a::
#FileLog_Temperatur_Luftdrucksensor 4:ESPEasy_WS_Temperatur_Luftdruck_Sensor.P\x3a::$fld[3]/10
#FileLog_Regensensor 4:ESPEasy_WS_Regensensor.*::$fld[3]/5

plot "<IN>" using 1:2 axes x1y1 title 'Helligkeit 1/50 Lux' ls l1fill lw 0.5 with quadratic,\
     "<IN>" using 1:2 axes x1y2 title 'Temperatur (°C)' ls l0fill_gyr lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Luftfeuchtigkeit (%)' ls l2 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Luftdruck (1/10 mbar)' ls l4 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Regen' ls l2fill lw 1 with steps

SleepMode

Die Mini Mini-Wetterstation verfügt über einen SleepMode der software- und hardwareseitig aktiviert werden muss.
In diesem Modus wacht die Mini-Wetterstation nach einer vorgegebenen Zeit auf, sendet die aktuellen Daten an den/die Controller (z.B. an FHEM) und legt sich wieder schlafen.
Somit kann ein menge Energie eingespart werden und so lässt sich die Mini-Wetterstation auch mit einer Powerbank über mehrere Wochen/Monate mit Strom versorgen.

Softwareseitige Einstellungen

Zunächst müssen unter dem Reiter Config die Vorgaben gesetzt werden.
Die Einstellung Sleep on connection failure sorgt dafür, dass die Mini-Wetterstation direkt wieder schlafen geht, wenn kein Accesspoint gefunden wird.




In nachfolgendem Beispiel würde die Wetterstation 30 Sekunden wach bleiben und sich danach für 5 Minuten schlafen legen.

Achtung: Wenn Sleep on connection failure aktiviert ist, gibt es keinen Fallback auf den AP-Modus mehr.


Hardwareseitige Einstellungen

Zunächst die Mini-Wetterstation vom Strom nehmen. Danach öffnet man das Gehäuse und es kommt eine Platine zum Vorschein auf der sich ein Jumper befindet.
Mit diesem Jumper schickt man die Wetterstation mit der folgendermaßen gesetzten Stellung in den SleepMode (Mitte-Rechts).
In Stellung (Mitte-Links) wird der Wachmodus erzwungen. Sollte die Mini Wetterstation also einmal nicht mehr aufwachen, dann den Jumper auf (Mitte-Links) setzen.




Wurden alle Maßnahmen ergriffen, kann man die Mini-Wetterstation wieder an den Strom anschließen.
Nach dem Neustart dauert es noch eine Weile bis der Intervall startet. Nach kurzer Zeit beginnen die Schlaf- und Wachpahsen wie eingestellt.

Testen kann man das z.B. indem man die IP-Adresse der Mini-Wetterstation Dauer-Pingt.

ping -t <ip-adresse>




Falls der Sleep Mode nicht funktioniert

Falls der DeepSleep Modus nicht richtig funktioniert, dann ist meistens die Powerbank daran schuld. Denn dieses schalten oftmals nach einigen Sekunden ab, wenn zu wenig Last existiert.
In diesem Fall kann es sein, dass die Wetterstation neu bootet und es zu einem unerwünschtem Loop-Boot kommt.
Ich hatte eine Powerbank, die nach 40 Sekunden abgeschaltet hat und ich verzweifelt nach dem Grund gesucht habe. Dann habe ich diesen Artikel gefunden:
https://apfelhirn.de/automatische-abschaltung-von-powerbanks-als-arduino-stromversorgung-bei-geringer-grundlast-verhindern/
Alternativ kann man ein Battery-Pack mit 3x AA Batterien verwenden. Diese halten auch ewig.

Anschluß Anemometer (Optional)

Wer noch ein Anemometer anschließen will, der kann folgende Hardware und Konfiguration verwenden.

Hardware: Eltako Windsensor, WS

Link: Amazon
Zunächst müsst ihr den gewählten Eingang in ESPEasy auf Input stellen.
Dazu unter Hardware den gewählten GPIO, bei mir GPIO-14(D5), auf Input stellen und speichern.



Anschließend wird der Task Nr. 4 als Device gewählt. Dies ist wichtig, da nur die Tasks 1-4 von ESPEasy unterstützt werden und die Tasks 1-3 von den anderen Sensoren bereits belegt sind.
Die Einstellungen sind folgende:



Und der Task 6 wird per Dummy als Melder verwendet, der die Werte zum Controller schickt.


Zusätzlich benötigt man noch einer Regel:

On System#Boot do
  timerSet,1,2
endon

On Rules#Timer=1 do
   TaskRun,2
   TaskValueSet 6,1,[Windsensor_Device#G]
   timerSet,1,60
endon


Entsprechend der vorgenannten Einstellungen wird das Anemomenter an Pin D5 und GND am D1-Mini angeschlossen.


Erläuterung zu Count/Total/Time:
COUNT = bedeutet, das der Counter die Impulse zählt und diese dann nach Ablauf des eingestellten Delay auf Null zurücksetzt und von vorn beginnt.
TOTAL = Gesamtzählungen. Den Hinweis „Total count is not persistent!“ bedeutet, dass dieser Zähler nicht auf dem ESP gespeichert wird. Ggf. in FHEM festschreiben wenn benötigt.
TIME = dies ist die Zeit zwischen den einzelnen Impulsen am Zählereingang und wird maßgeblich für die Windgeschwindigkeit verwendet. Also je kleiner die Zahl, desto windiger.

FHEM

Wichtig ist, dass das Attribut für oldreadings aktiviert wird. Denn nur dann werden die alten Werte in FHEM gespeichert um die Windgeschwindigkeit berechnen zu können.

define ESPEasy_WS_Windsensor ESPEasy 10.4.70.108 80 espBridge WS_Windsensor
attr ESPEasy_WS_Windsensor IODev espBridge
attr ESPEasy_WS_Windsensor Interval 300
attr ESPEasy_WS_Windsensor group ESPEasy Device
attr ESPEasy_WS_Windsensor oldreadings G
attr ESPEasy_WS_Windsensor presenceCheck 1
attr ESPEasy_WS_Windsensor readingSwitchText 1
attr ESPEasy_WS_Windsensor room ESPEasy
attr ESPEasy_WS_Windsensor setState 3
attr ESPEasy_WS_Windsensor stateFormat { "WS: ".ReadingsNum($name,"WS","")." V: ".ReadingsNum($name,"V","") }
attr ESPEasy_WS_Windsensor userReadings V { Windspeed();; },WS { Windstrength();; }

Zusätzlich benötigt man noch folgendes Script:

# Windgeschwindigkeit
sub Windspeed () {
	
	my $rps;
	my $G_Now;
	my $G_Old;
	my $v;
	
	$G_Now = ReadingsNum("ESPEasy_WS_Windsensor", "G", 0);
	$G_Old = OldReadingsNum("ESPEasy_WS_Windsensor", "G", 0);

        # Achtung die Formel ist für den Eltako Windsensor
        # Er zählt 2x pro Umdrehung. Deswegen am Ende geteilt durch 2
        $rps = ($G_Now - $G_Old) / 60 / 2;
	
	$v = sprintf "%.2f", (1.761 / (1 + $rps) + 3.013 * $rps);
	if ($v == 1.76) {
		$v = 0.00;
	}
	return $v; 
}

# Windstaerke
sub Windstrength () {

	my $ws;
	my $sp;
	
	$sp = ReadingsNum("ESPEasy_WS_Windsensor", "V", 0);
	if ($sp >=  0 && $sp <=  1)  { $ws = 0; }
	if ($sp >  1 && $sp <=  6)  { $ws = 1; }
	if ($sp >  6 && $sp <= 12)  { $ws = 2; }
	if ($sp > 12 && $sp <= 19)  { $ws = 3; }
	if ($sp > 20 && $sp <= 28)  { $ws = 4; }
	if ($sp > 29 && $sp <= 38)  { $ws = 5; }
	if ($sp > 39 && $sp <= 49)  { $ws = 6; }
	if ($sp > 50 && $sp <= 61)  { $ws = 7; }
	if ($sp > 62 && $sp <= 74)  { $ws = 8; }
	if ($sp > 75 && $sp <= 88)  { $ws = 9; }
	if ($sp > 89 && $sp <= 102) { $ws = 10; }
	if ($sp > 103 && $sp <= 117){ $ws = 11; }
	if ($sp > 117)              { $ws = 12; }
	
	return $ws;
	
}

Navigation
Eigene Werkzeuge