Hierzu habe ich ein tolles Projekt im Netz gefunden, den WIFFI-WZ 2.0 von Eugen Stall (Anzeige).
Was ist der WIFFI-WZ?
Der WIFFI-WZ ist ein Sensormodul basierend des WLAN Chips ESP8266. Infos gibts auf der Homepage von Eugen Stall (Anzeige). Die Platine enthält u.a. folgende Sensorik:
- 2x IR Bewegungsmelder
- Temperatursensor
- Luftfeuchtesensor
- Luftdruckmesser
- Geräuschmelder
- Helligkeitsmessung
- Luftqualitätsmesser
Über diese Sensoren und Einstellungen werden von der Software für die Hausautomation folgende Werte errechnet:
- Sonnenstand (Azimut) und Sonneneinfallswinkel (Elevation)
für Rollo- und Beschattungssteuerung - Taupunkt-Temperatur und absolute Feuchte
Steuerung von Lüftungsanlagen und Entfeuchter zur Vermeidung von Schimmel - Luftdrucktrend
Erkennung von Wetteränderungen
Der WIFFI-WZ wird als Bausatz verkauft, es ist also etwas Lötarbeit nötig. Das Beitragsbild oben zeigt das fertig aufgebaute Modul.
Aufbau & Inbetriebnahme des WIFFI-WZ Sensors
Den Aufbau selbst könnt ihr dem obigen Link entnehmen, Eugen hat hier wirklich eine sehr detaillierte Anleitung geschrieben.
Zum Betrieb habe ich ein weiteres Leicke Netzteil bestellt, welche sich in den letzten Monaten gerade in Kombination mit den ESP8266-Modulen bewährt haben.
Der erste Start verläuft wie erwartet, der ESP erzeugt ein eigenes WLAN Netz "wiffi" in welches ich mich mit Tablet oder Smartphone und dem Passwort "wiffi1234" anmelde.
Im Browser wird die IP eingetragen, in dem Fall "192.168.4.1" und schon ist das Interface zu sehen:
Bei der Einrichtung hatte ich dann die ersten Probleme, da ich dummerweise im WLAN Schlüssel 2 Zeichen hatte, welche Konflikte in der weiteren Konfiguration ergaben:
- Doppelpunkt ":"
Mit dem Doppelpunkt erkennt die Software von Eugen eine Parametertrennung. Ein Doppelpunkt im Passwort würde den Rest des Passworts abschneiden. - Kleiner Zeichen "<"
Das Kleiner Zeichen wird über das URL Encoding in ASCII Code %3C umgewandelt und erzeugt somit einen falschen WLAN-Key.
Hierfür hatte ich den ersten Kontakt mit Eugen selbst und auch hier war ich erstaunt, dass selbst an einem Samstag innerhalb weniger Stunden eine Antwort vorlag.
Eine direkte Codeänderung z.B. über gezielte Escape-Sequenzen schien jedoch nicht so einfach umzusetzen, sodass ich kurzerhand den WLAN Schlüssel änderte. Das hatte zwar zur Folge, dass ich fast 80 Geräte aktualisieren musste, aber was solls.
Für die eigentliche Konfiguration sind dann eigentlich nur 3 URL Befehle nötig:
192.168.4.1/?ssid:MEINE_SSID: 192.168.4.1/?pwd:MEIN_WLAN_KEY: 192.168.4.1/?ccu:IP_DER_CCU:
Die CCu ist in meinem Fall der IP-Symcon Server, zu welchem die Informationen geschickt werden.
Mit Druck auf den Reset-Taster oder
192.168.4.1/?reset:
kann das Modul neu gestartet werden.
Bei dem Aufruf der zugewiesenen IP-Adresse können über das Interface auch schon Werte abgelesen werden:
Firmware des WIFFI-WZ aktualisieren
Geliefert wurde mein WIFFI-WZ mit der wiffi_wz_70 Firmware. Laut der Seite gibt es bereits eine wiffi_wz_75 Version, welche ich als .ZIP heruntergeladen und entpackt habe. Heraus kommt eine .BIN Datei, welche wir ausschließlich für das Update benötigen.
Alle Schritte sind unter Punkt 17. Update der WIFFI-WZ Projektbeschreibung (Anzeige) bestens beschrieben und rein über das Webinterface machbar.
Das WIFFI-WZ Modul in IP-Symcon integrieren
Im IP-Symcon Forum gab es bereits einen ausführlichen Beitrag über das Thema WIFFI-WZ (Anzeige).
An dieser Stelle ein Dank an alle User des Forenbeitrags, ins besondere an Ralf.
Auf dessen Skript in Beitrag #8 basieren meine Änderungen hier, welche für die aktuellen Versionen 70 bzw. 75 des WIFFI-WZ Moduls erforderlich sind.
Hier gezielt meine Schritte zur Anbindung an IP-Symcon. Dabei war mein größter Knackpunkt, wie eine Register-Variable anzulegen ist.
Inzwischen arbeite ich fast ausschließlich über den Objektbaum:
- Neuen Server Socket erstellen
In den I/O Instanzen → Objekt hinzufügen → Instanz hinzufügen → "Server Socket" → Weiter → Name z.B. "Wiffi Socket" → Aktivieren mit Port 8181.
Somit empfängt IP-Symcon schonmal die Informationen. - Neue Register Variable anlegen
Im IP-Symcon Pfad in der entsprechenden Kategorie eine neue Instanz hinzufügen → Register Variable → Weiter → Name z.B. "Wiffi Sensor" → Übergeordnete Instanz den soeben angelegten Server Socket wählen.
Ein Ziel haben wir aktuell noch nicht. - PHP-Skripte anlegen
Innerhalb der Register Variable hatte ich zwei PHP Skript angelegt. Den ersten Namen "set_params" und Nummer zwei mit "get_data". - Die Register Variable erneut öffnen um das "get_data" Skript mit dem Ziel der Variable zu verbinden.
PHP "set_params" Skript
Auch dieses Skript basiert aus einem Forenskript und setzt ein paar Werte, die hierfür aber optional sind. Auch wurde hier der PHP-Notice korrigiert, durch Hochkomma Setzung in Zeile 2:
<?php ini_set('max_execution_time', 180); // max execution time for the script $ip = '192.168.XXX.XXX'; $array = array( 'param:27:0:', // 0 = JSON off | 1 = JSON on 'param:13:350:', // own location height 'param:20:49:', // own degree of latitude in 0.1° 'param:21:12:' // own degree of longitude in 0.1° ); foreach ($array as $entry) { file_get_contents('http://' . $ip . '/?' . $entry); IPS_Sleep(10*1000); } print_r('ready...');
Als IP ist natürlich die entsprechende IP-Adresse des WIFFI-WZ zu verwenden, die Geo Daten können z.B. über MyGeoPosition ermittelt werden.
Mit dem Ausführen des Skripts werden dann die Parameter gesetzt, welche auch im Expertenmodus des Webinterfaces vom WIFFI-WZ zu finden sind.
In der hier beschriebenen Variante hatte ich ohne JSON Codierung gearbeitet.
PHP "get_data" Skript
Und hier noch das für die WIFFI-WZ Version 70 + 75 veränderte PHP-Skript zum Auslesen der Variablen:
<?php $debug = false; $vartype = array( 'wz_ip' => '3', 'wz_co2' => '2', 'wz_temp' => '2', 'wz_feuchte' => '2', 'wz_noise' => '0', 'wz_luftdrucktrend' => '3', 'wz_motion_left' => '0', 'wz_motion_right' => '0', 'wz_lux' => '2', 'wz_baro' => '2', 'wz_elevation' => '2', 'wz_azimut' => '2' ); $data = trim($_IPS['VALUE']); //$data = str_replace('GET /xy.exe?antwort=dom.GetObject("',"",$data); //$data = str_replace('").State(',"#",$data); //$data = str_replace(')',"",$data); //$data_array=explode("#",$data); $data = explode('GetObject("', $data); $data = explode(') HTTP', $data[1]); $data_array = explode('").State(', $data[0]); if ($debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "wiffi: ".$data_array[0]." = ".$data_array[1]); // IPS_LogMessage(IPS_GetName($_IPS['SELF']), "wiffi: ".$data_array[0]." = ".str_replace('"','',$data_array[1])); SetValue(CreateVariableByIdent($_IPS['SELF'], $data_array[0], $data_array[0], $vartype[$data_array[0]]), $data_array[1]); // SetValue(CreateVariableByIdent($_IPS['SELF'], $data_array[0], $data_array[0], $vartype[$data_array[0]]), str_replace('"','',$data_array[1])); return(0); function CreateVariableByIdent($id, $ident, $name, $type) { $id = IPS_GetParent($id); $vid = @IPS_GetObjectIDByIdent($ident, $id); if($vid === false) { $vid = IPS_CreateVariable($type); IPS_SetParent($vid, $id); IPS_SetName($vid, $name); IPS_SetIdent($vid, $ident); } return $vid; }
Sämtliche originalen Zeilen sind noch zu sehen bzw. mit // auskommentiert. Vor allem die 4 Zeilen in welcher der gelieferte String zerlegt wird. Dieser beinhaltet in den neuen Versionen zusätzliche Angaben zum HTTP Header, was die vorherige Filterung und weitere Ausführung verhindert.
Mit den 3 Nachfolgenden Zeilen zerlege ich den String neu anhand von Zeichenfolgen und erstelle ein entsprechendes Array, welches den Parameternamen und zugehörigen Wert beinhaltet.
Wenn das nun gespeichert wird und der WIFFI-WZ auch korrekt arbeitet, legt das Skript automatisch die nötigen Variablen an. (siehe nächsten Screenshot)
Finale Anpassung der IP-Symcon Ansicht
Zuletzt hab ich noch etwas "Kosmetik" gemacht, sämtliche angelegten Variablen ausgeblendet. Mit einem Link und entsprechenden Namen + Einheit werden nun die gewünschten Werte angezeigt:
Und hier das Frontend:
Ereignisse basierend der Sensordaten
Aufmerksame Leser haben vermutlich in den letzten Screenshots schon bemerkt, dass ich zusätzliche Variablen "Geräusche erkannt", "Bewegung erkannt (links)" und "Bewegung erkannt (rechts)" angelegt habe.
Hierbei ging ich meine ersten Schritte mit Ereignissen.
Für die 3 genannten Sensorwerte erhalte ich vom WIFFI-WZ lediglich ein TRUE/FALSE.
Hierfür habe ich jeweils eine neue Boolean Variable mit dem Profil ~Alert angelegt.
Innerhalb jeder der 3 Variablen habe ich 2 Eregnisse angelegt:
- Ereignis 1:
Variable: wz_noise
Auslöser: Bei bestimmtem Wert
Wert: True
Aktion: Variable ändern
Ziel: Variable "Geräusche erkannt" ausgewählt
Code: SetValue($_IPS['TARGET'], true);
Ereignis aktiv - Ereignis 2:
Variable: wz_noise
Auslöser: Bei bestimmtem Wert
Wert: False
Aktion: Variable ändern
Ziel: Variable "Geräusche erkannt" ausgewählt
Code: SetValue($_IPS['TARGET'], false);
Ereignis aktiv
Dadurch wird mir nun bei Änderung der WIFFI-WZ Variable auch diese Variable aktualisiert und über den Zustand wie im Screenshot schön angezeigt.
Weitere Tests und Ideen
Mit der Sensorik können nun die unterschiedlichsten Ereignisse vereint werden. Ausprobiert hatte ich z.B.
- Bei Bewegung links → Schalte Ganglicht ein
- Keine Bewegung links → Schalte Ganglicht aus
- Bei Bewegung rechts → Schalte Wohnzimmerlicht ein
- Keine Bewegung rechts → Schalte Wohnzimmerlicht aus
- Bei Geräusch + mein Handy nicht im WLAN (abwesend) → Schalte alle Lichter ein + Buzzer Alarm
Das letzte Ereignis entspricht quasi eine erste Alarmanlage. Die Geräteerkennung im WLAN klappt prima über das FritzBox-Project.
Für die kommenden Wochen spiele ich bereits intensiv mit dem Gedanken, einen Rollo-Gurt mit einem elektrischen Gurtwickler zu versehen und entsprechend der Sonneneinstrahlung bzw. Uhrzeit zu steuern.