Eine Wetterstation für das smart Home

Wir haben im Jahr 2014 ein Einfamilienhaus gebaut. Vielleicht berichte ich hier im später noch über den Verlauf des Baus… Jedenfalls durfte ich mit dem Bau auch meinem Spieltrieb freien Lauf lassen und habe ein Bus-System installiert. Zum Einsatz kam LCN, weil man das so schön vorrüsten kann und visualisiert und teilweise gesteuert wird über IP-Symcon auf einem Raspberry Pi. IP-Symcon hat den Vorteil, dass man auch andere Komponenten mit einbinden kann, die nicht direkt mit dem Bus-System verbunden sind und auch diese Komponenten mit zum Steuern irgendwelcher Sachen nehmen kann.

Nun hat es mich in der Vergangenheit immer gestört, dass bei unserer Wetterstation ständig irgendwas nicht funktioniert hat. Mal ist der Außensensor abgesoffen, mal waren die Batterien der Station leer und außerdem ist so eine Station im Wohnzimmer sinnlos, wenn man früh im Schlafzimmer steht, sich anziehen und dazu wissen will, wie kalt es draußen ist. Reicht ein T-Shirt und kurze Hosen, oder muss es doch der Rollkragenpullover und die lange Hose sein?

Außerdem sind Wetterdaten für so eine Haussteuerung auch ganz sinnvoll. Man könnte z.B. die Rollläden nicht nur stur zeitgesteuert verfahren, sondern auch noch Temperatur und Sonneneinstrahlung berücksichtigen und somit z.B. im Sommer ein Aufheizen der Räume automatisch verhindern. Nun gibt es viele Wetterdaten, die man sammeln kann, nur was ist sinnvoll und kann weiter verwertet werden?

  • (Außen-) Temperatur – wenn es kalt ist und die Sonne scheint, bleiben die Rollläden oben, damit man nicht so viel heizen muss.
  • rel. Luftfeuchtigkeit – kommt bald Regen, oder muss ich den Garten bewässern?
  • Luftdruck – um auf evtl. bevorstehende Wetteränderungen zu schließen
  • Windrichtung, Windgeschwindigkeit – Rollläden bei Sturm schließen, damit die Fenster heil bleiben?
  • Sonneneinstrahlung (UV-Index) – für die Rollladensteuerung (wenn es bewölkt ist, muss ich die Rollläden nicht runterfahren)
  • Regenmenge (gesamt, pro Stunde) – Sinnvoll, um halbwegs ausrechnen zu können, wieviel Wasser neu in der Zisterne dazugekommen ist.
  • Blitze, Entfernung – wenn ein Gewitter aufzieht, sollte man evtl. die Antennen rausziehen…

Es gibt sicher noch Andere interessante Werte, aber das sind im Wesentlichen die, auf die es mir ankommt.

Weil ich wenig Zeit habe, hatte ich schon lange mit einer Kauflösung geliebäugelt, die ich dann einfach nur noch an die Haussteuerung anbinden muss. Es gibt zwar Wettersensoren von Issendorff, die direkt an den LCN angebunden werden können, aber die Preise sind jenseits von allem, was ich bereit war, dafür auszugeben und der Funktionsumfang doch sehr gering. Andererseits gibt es Stationen, die über USB oder RS232 an einen PC angeschlossen werden können. Warum also nicht so etwas nehmen und ein Plugin für IP-Symcon schreiben? Vielleicht hat das auch schon mal jemand gemacht? Aber eigentlich braucht man doch das Anzeigeteil davon gar nicht, wenn man den Außensensor, der ja eh über Funk angebunden ist, gleich direkt abfragt…

Ich habe also immer wieder mal nach preiswerten Wetterstationen mit PC-Anbindung gesucht und bin dabei auf ein Ersatzteil für die Ventus W266 gestoßen. Bei Reichelt gab es den Außensensor mit der Nummer W136 als Ersatzteil recht preiswert zu kaufen. Was man an Funktionsumfang für sein Geld bekommt ist schon enorm. Bis auf Luftdruck deckt es komplett die oben angegebene Liste ab und ist dabei noch sehr schön kompakt.

In der Vergangenheit hatte ich schon mal irgendwo einen Beitrag gelesen, wo jemand den Funk-Sensor seiner Wetterstation direkt empfangen und die Werte ausgewertet hat. Also habe ich gedacht, das muss doch auch mit der Ventus-Station gehen. Auf meiner Suche nach mehr Informationen bin ich zuerst bei Mikrocontroller.net fündig geworden. Das sah ja schon mal sehr vielversprechend aus. Die weitere Suche führte mich ins FHEM-Forum und BINGO, genau das wollte ich auch machen. Mit ESPEasy hatte ich schon rumgespielt, also schnell ein RFM69HCW-Modul bei Pollin bestellt und als das dann geliefert wurde, die Schaltung auf dem Steckbrett aufgebaut. Damit war es jedoch nicht getan. Man musste das experimentelle Plugin ins ESPEasy einkompilieren und dann das Ganze auf das ESP-Modul spielen. Ich habe mir also die Entwicklungsumgebung laut Wiki installiert, die Quellen heruntergeladen, alles zusammengebaut, wie es beschrieben war und… lief nicht. 🙁
Dank der Hilfe aus dem FHEM-Forum bekam ich eine fertig kompilierte Version, die dann auch das tat, was sie soll. Ich hab dann zusätzlich noch ein BMP280-Breakout-Board angeschlossen, damit ich den Luftdruck bekomme.

Da dann endlich alles auf dem Steckbrett lief, dachte ich, dass es doch schön wäre, alles schön kompakt auf eine Leiterplatte zu packen und diese dann samt Gehäuse irgendwo auf dem Dachboden zu deponieren. Der Dachboden ist nicht isoliert und so ist der Luftdruck dort genau so, wie außerhalb des Hauses. Im Haus kann es bei geschlossenem Fenster und laufender Dunstabzugshaube schon mal starken Unterduck geben… Außerdem ist dort die Entfernung zum Sensor nicht so groß, so dass es auch keine Empfangsprobleme geben sollte.

Der Schaltplan war einfach, ich hab es auf das Wesentliche reduziert, Spannungsversorgung sollte über ein einfaches Mini-USB-Netzteil erfolgen, von denen ich hier genügend rumliegen habe. Firmware wird über einen AMP-micromatch-Steckverbinder eingespielt, an den ich einen USB-seriell-Adapter anschließe. Das BME280-Modul wird einfach aufgesteckt.

Hier nun der Schaltplan (draufklicken für großes Bild):

Schaltplan

Wie man sieht, gehört nicht viel dazu. Ich wollte das Ganze eigentlich in eine kleine Strapu-Box quetschen, daher die etwas komische Leiterplattenform, aber letztendlich habe ich es doch nur mit Schrumpfschlauch eingeschrumpft. Als Antenne fungiert ein einfaches Stück Draht, bei 868MHz sind das ja nur ein paar Zentimeter. Hier auch noch die Leiterplattenzeichnungen (draufklicken für große Bilder):

Leiterplatte Top
Leiterplatte Top
Leiterplatte Bottom
Leiterplatte Bottom

…und die Bestückungspläne…

Bestückung Top
Bestückung Top
Bestückung Bottom
Bestückung Bottom

Und für die ganz Faulen hier auch nochmal das Ganze zusammengepackt inklusive der EagleCAD-Dateien: Link

Nachdem alles auf Leiterplatte gebracht wurde (ESP12E-Modul hatte ich hier liegen), machte ich mich daran, es in meine Hausautomatisierung zu integrieren. Ich hatte hier im IP-Symcon-Forum schon gelesen, dass einige Leute diverse Sensoren über ESPEasy an IP-Symcon angebunden haben. Also sollte das doch mit der Wetterstation kein Problem sein. Dank der vielen Beispiele im oben verlinkten Forenbeitrag war es das auch nicht und nach ein paar Stunden Arbeit hatte ich dann auch schon meine Wetterdaten zur Einsicht im IP-Symcon zur Verfügung.

<?

//IPS_LogMessage("Sender ", $_IPS['SENDER']);

if ($_IPS['SENDER'] == 'RegisterVariable'){
$data = $_IPS['VALUE'];

$Prefix1 = "&idx=";                                    // damit fängt der Datensatz an
$Suffix1 = "&";
$Prefix2 = "&svalue=";                                    // damit fängt der Datensatz an
$Suffix2 = "HTTP/1.1";
$Prefix3 = "&switchcmd=";                                    // damit fängt der Datensatz an
$Suffix3 = "HTTP/1.1";

//$Ende1nachZeichen = 2;                                       // und ist xx Zeichen lang
$AnfangID = strlen($Prefix1)+(strpos($_IPS['VALUE'], $Prefix1));
$EndeID = strpos($_IPS['VALUE'], $Suffix1, $AnfangID+1);
$ID = substr($_IPS['VALUE'], $AnfangID, $EndeID-$AnfangID);

$AnfangValue = strlen($Prefix2)+(strpos($_IPS['VALUE'], $Prefix2));
$EndeValue = strpos($_IPS['VALUE'], $Suffix2, $AnfangValue);
$Value = substr($_IPS['VALUE'], $AnfangValue, $EndeValue-$AnfangValue-1);

$AnfangSw = strlen($Prefix3)+(strpos($_IPS['VALUE'], $Prefix3));
$EndeSw = strpos($_IPS['VALUE'], $Suffix3, $AnfangSw);
$Switch = substr($_IPS['VALUE'], $AnfangSw, $EndeSw-$AnfangSw-1);
//IPS_LogMessage("Switch roh: ", $Switch);

    if($Switch == "On"){
      $Switch = true;
      }else{
      $Switch = false;
      }

//IPS_LogMessage("Data rin: ", $data);
//IPS_LogMessage("AnfangID: ", $AnfangID);
//IPS_LogMessage("EndeID: ", $EndeID);
//IPS_LogMessage("EndeValue: ", $EndeValue);
//IPS_LogMessage("IDx: ", $ID);
//IPS_LogMessage("Value: ", $Value);
//IPS_LogMessage("Switch: ", $Switch);

switch ($ID) {
            case "1":
             $aValue=explode(";", $Value);
             SetValueFloat(41366 /*[Wetter\BMP-Temperatur]*/, $aValue[0]);
			 SetValueFloat(12576 /*[Wetter\Luftdruck]*/, $aValue[3]);
         break;
            case "2":
             $aValue=explode(";", $Value);
             SetValueFloat(10696 /*[Wetter\Temperatur]*/, $aValue[0]);
             SetValueFloat(27043 /*[Wetter\rel. Luftfeuchte]*/, $aValue[1]);
         break;
            case "3":
             $aValue=explode(";", $Value);
             SetValueFloat(39189 /*[Wetter\Windrichtung]*/, $aValue[0]);
             SetValueFloat(45727 /*[Wetter\Windgeschwindigkeit durchschn.]*/, $aValue[1]);
             SetValueFloat(35820 /*[Wetter\Windgeschwindigkeit Böen]*/, $aValue[2]);
         break;
            case "4":
             $aValue=explode(";", $Value);
             SetValueFloat(31118 /*[Wetter\Regen Total]*/, $aValue[0]);
             SetValueFloat(22490 /*[Wetter\Regen letzte Stunde]*/, $aValue[1]);
         break;
            case "5":
             $aValue=explode(";", $Value);
             SetValue(41048 /*[Wetter\UV-Index]*/, $aValue[0]);
         break;
            case "6":
             $aValue=explode(";", $Value);
             SetValueFloat(39144 /*[Wetter\Blitze total]*/, $aValue[0]);
             SetValueFloat(53774 /*[Wetter\Blitze letzte 5min]*/, $aValue[1]);
             SetValueFloat(11046 /*[Wetter\Blitze Entfernung]*/, $aValue[2]);
         break;
            case "7":
             $aValue=explode(";", $Value);
             SetValue(57964 /*[Wetter\Batterie]*/, $aValue[0]);
         break;
    }
}

?>


Weitere Screenshots und Hinweise dazu folgen…
Die nächste Stufe wird jetzt die Steuerung der Rollläden entsprechend der vorhandenen Daten durchzuführen, aber das ist dann eine andere Geschichte…