WIFFI-WZ Multisensor mit IP-Symcon betreiben

28. Sep
2017
geschrieben von Roland Meier

In den vergangenen Tagen habe ich mich mit der ersten Sensorik im Smarthome beschäftigt.

Auf Grund der vorhandenen konventionellen Verdrahtung in unserer Wohnung, führten meine Recherchen erneut zum ESP8266 WLAN Modul, welches ich u.a. in der Lichtsteuerung in Nutzung habe.

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.

 

Anzeige

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:

wiffi wz interface

 

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:

wiffi wz werte

 

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:

ip symcon wiffi wz konsole

 

Und hier das Frontend:

ip symcon wiffi wz 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.

 

Gelesen 6383 mal Letzte Änderung am Mittwoch, 05 Dezember 2018
Artikel bewerten
(9 Stimmen)

2 Kommentare

  • Roland Meier 12. Okt 2019
    gepostet von Roland Meier

    Hi,
    hab bisher leider noch nichts mit OpenHab2 gemacht, kommt aber vermutlich bald.
    Ich denke aber mal, dass dies genauso funktionieren sollte.
    LG

  • Daniel 28. Apr 2019
    gepostet von Daniel

    Hallo,

    zuerst einmal vielen Dank für Eure hilfreichen Anleitungen!

    Ich nutze OpenHab 2 und wollte fragen, ob die Sensorwerte auch hierüber ausgelesen werden können. Ist das mit vertretbarem Aufwand zu realisieren?

    Beste Grüße,
    Daniel

Bitte anmelden, um einen Kommentar zu posten
Anzeige

Anzeige

123RF.com - For all your creative needs!

Kalender

« April 2024 »
Mo Di Mi Do Fr Sa So
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

Newsletter

Euch interessieren meine Themen hier? Dann tragt euch einfach in den Newsletter ein und ihr werden bei neuen Beiträgen informiert.

Anzeige