WIFFI-WZ direkt in Symcon nutzen

Angeregt durch diesen Beitrag habe ich mich noch etwas weiter mit der Integration vom WIFFI-WZin IPS beschäftigt.

Ich hatte regen, sehr aufgeschlossenen und netten Kontakt mit Eugen :). Er hat einige Änderungen an der Firmware vorgenommen und stellt mit der heute veröffentlichten Version 53 ein JSON mit allen Daten zur Verfügung. Dieses JSON wird direkt an IPS geschickt und kann dort wie folgt verarbeitet werden.

Zum Empfangen der Daten muss eine Serversocket I/O Instanz angelegt werden

Danach wird ein Cutter angelegt, der die Daten vom Serversocket erhält und sie bei 03 (hex) aufteilt

Und dann noch eine Registervariable, die das Script von unten als Ziel bekommt


<?

$debug = true;
$vartype = array(
	'string' => '3',
	'number' => '2',
	'boolean' => '0'
);

$data = trim($_IPS['VALUE']);
$data_object = json_decode($data, true);

//echo "---
";
//print_r($data_object);
//echo "---
";

$ident = str_replace(':','',$data_object['Systeminfo']['MAC-Adresse']);

foreach ($data_object['Systeminfo'] as $key => $value) {
	SetValue(CreateVariableByIdent( CreateDummyModulByIdent($_IPS['SELF'], "wiffi_".$ident), $ident."_".str_replace('-','_',$key), $key, $vartype['string']), $value);
}


foreach ($data_object['vars'] as $array) {
	SetValue(CreateVariableByIdent(CreateDummyModulByIdent($_IPS['SELF'], "wiffi_".$ident), $ident."_".$array['name'], $array['homematic_name'], $vartype[$array['type']]), $array['value']);
}

return(0);


function CreateVariableByIdent($id, $ident, $name, $type)
{
	$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;
}

function CreateDummyModulByIdent($id, $ident)
{
	$id = IPS_GetParent($id);
	$vid = @IPS_GetObjectIDByIdent($ident, $id);
	if($vid === false) {
		$InsID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
		IPS_SetName($InsID, $ident); 	// Instanz mit Default Name benennen
		IPS_SetIdent($InsID, $ident);	
		IPS_SetParent($InsID, IPS_GetParent($_IPS['SELF']));
	}
	return $vid;
}


?> 

Damit der WIFFI-WZ das JSON auch sendet, muss Parameter 27 auf 1 gestellt werden oder mit folgendem Script gleich noch weitere Parameter gesetzt werden. Die IP im Script entsprechend auf euren WIFFI anpassen.


<?
ini_set(max_execution_time, 180); // Sekunden Laufzeit
$ip = '172.16.100.34'; 

$array = array(
	'param:27:1:',		// 1 für JSON Daten
	'param:13:55:',		// Eigene Ortshoehe 
	'param:20:524:',	// Breitenengrad des eigenen Standortes in 0.1°
	'param:21:98:'      // Laengengrad des eigenen Standortes in 0.1°
	);

foreach($array as $entry) {
	file_get_contents('http://'.$ip.'/?'.$entry);
	IPS_Sleep(10*1000);
}
 

?>

Das Ergebnis sind dann folgende Werte, die inklusive der Dummy Instanz und jeweiligem eindeutigen Ident automatisch angelegt werden.
4_wiffi_werte.jpg

Das Dummy Modul wird parallel zum Script angelegt und kann natürlich umbenannt werden, da die Variablen jeweils per Ident angesprochen werden.

Die Messwerte werden bei entsprechend großer Änderung gesendet bzw. auch nach Mindestzeitabständen. Die Bewegungsmelder und Noise senden sofort, womit auch entsprechende Beleuchtungssteuerung oder Ähnliches möglich ist.

Zu Signalisierung kann der Buzzer mit angesteuert werden und piept dann z.B. dreimal.

file_get_contents('http://172.16.100.21/?buzzer:3:');

Der WIFFI ist bei mir einige Wochen zum Testen im Bad gelaufen, die Werte sind sehr stabil und gut vergleichbar mit meinen LCN Daten bzw. einem „Schätzeisen für Temperatur und Feuchte“.
Um eventuell auftretende Ausreißer beim Neustart zu unterbinden werden die Werte ab Version 53 erst nach 60 Sekunden geschickt, damit sich alle Sensoren wieder eingependelt haben.

Sollte reges Interesse am WIFFI-WZ und seiner Integration in IPS bestehen, könnte ich daraus auch ein Modul erstellen :loveips:.

Prima Ralf, vielen Dank!

Hallo Ralf,

coole Sache, vielen Dank.
Ein Modul für den Wiffi wäre natürlich das i-Tüpfelchen. :wink:

Hallo Ralf,

ich hatte heute mal wieder etwas Zeit und wollte meinen Wiffi in Betrieb nehmen.

Das mit den Socket 's hat auch wunderbar funktioniert.
Nur fehlt in deinem Beitrag oben das Skript :eek: , ist das Absicht?
Wenn nicht, könntest du es dann noch hier einstellen.

Vielen Dank!

Sehr suspect, das war eigentlich mal im Beitrag enthalten, jetzt waren nur die [ PHP ] Tags drin. Ich habe es im ersten Beitrag wieder ergänzt.

Update:
Und jetzt auch das zweite Script zum Setzen der Parameter.

Nachdem ich heute meinen zweiten Wiffi in Betrieb genommen haben, funktioniert das Script auch tatsächlich wie es soll. Es wurde eine weitere Dummy Instanz angelegt und die Daten werden passend gepflegt :D.

Ich bin begeistert, zwischen den Feiertagen kommen noch zwei Wiffi’s.

Moin,
nachdem ich mir jetzt einen wiffi-wz zugelegt habe, bin ich gerade bei der Inbetriebnahme. Danke Ralf für deinen Script.
Habe deinen zweiten Script zur Einstellung der Parameter genutzt und erhalte aber immer diese Warnung:
„Warning: file_get_contents(http://192.168.178.121/?param:13:21:): failed to open stream: HTTP request failed! <!DOCTYPE html><html><head><link rel=„stylesheet“ href=„https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css“ in E:\IP-Symcon\scripts\30272.ips.php on line 14“, .
Der Parameter wird richtig gesetzt doch die Ausführung dauert sehr lange.
Gleiches Verhalten beim Buzzer setzen.
Gibt es da noch eine andere Möglichkeit außer file_get_contents?
Gruß GMilf

Alles, womit du Dateien laden/öffnen kannst, aber das Verhalten wird immer sehr ähnlich sein.

Der ESP bzw. Wiffi ist wohl etwas langsam, wenn viele Parameter gesetzt werden oder die Seite öfter neu geladen wird.

Es läuft auch gerade ein Test mit dem Wiffi-voice ;).

Moin Ralf
Habe einen wiffi hier und habe das so wie von dir beschrieben umgesetzt. Mit script 2 konnte ich Parameter setzen, die Datenübertragung über den Socken funktionierte nicht. Habe dann das Update auf wiffi Firmware 60 durchgeführt und alles noch mal neu angelegt. Danach hat er genau einmal gesendet. In den Meldungen sehe ich jedoch dass er es versucht, bekomme aber immer ein :

„Invalid argument supplied foreach() on line 19“

Es wurde wie gesagt einmal sauber alles angelegt wie in deinem screenshot zu sehen und mit Daten gefüllt. Deinen Text verstehe ich so, dass der Geräuschsensor sofort übertragen sollte, das funktioniert jedoch auch nicht.

Vielleicht weißt du wo der Fehler liegt, vielleicht liegt es auch an dem update auf Firmware 60?

Ich habe die „60“ noch nicht installiert, schaue ich mir am Wochenende an.

Daran liegt es wohl doch nicht. Ich bin grad nochmal auf die 53 zurück, genau das gleiche Verhalten. Obwohl sonst nichts verändert wurde sendete er ja einmal heute morgen, wundert mich. Wenn ich das script zum Setzen der Parameter nutze, werden die Parameter zuverlässig gesetzt, jedoch erscheint auch dort in der Scriptausgabe : „Error receiving data: (12152)“
Unabhängig welche Softwareversion ich einsetze, an dem Verhalten ändert sich nichts.

Die Fehlermeldung ist leider normal.

Hast du den Parameter 27 auf 1?

Kommen überhaupt Daten im Debug vom IO?

Wie sehen die Daten im Debug der Registervariablen aus?

Alles gut, mein Fehler! Beim wiederholten Neuanlagen der Instanzen hab ich irgendwann vergessen das 03 HEX einzugeben! Jetzt läuft alles wieder. Ich werde wieder auf Firmware 60 wechseln, da wird der Taupunkt mit berechnet und das updaten ist um einiges entspannter.

edit:
mit Firmware 60 läuft es nicht! Im Debüt vom I/O und auch Cutter kommen Daten. Im Debüt von der Register Variable dann nicht mehr. Liegt vielleicht am Trennzeichen? Da steig ich aber nicht richtig durch

Moin, möchte kurz über meine ersten Erfahrungen mit dem WIFFI-WZ 2.0 berichten:
Bestellung und Lieferung erfolgten prompt und problemlos, die Verpackung des „Bausatzes“ war einwandfrei.
Das Einlöten der diskreten Bauelemente erfolgte in ca. 30min. da die SMD-Bauteile bereits aufgelötet sind.
Die im Netz vorhandene Bauanleitung ist mit ihren Fotos dabei hilfreich und fehlerfrei.
Es wäre schön, wenn die „Maßnahmen zur Verbesserung der Störfestigkeit“ auf der Grundplatine (einlöten von Kondensatoren u. Widerständen) bereits auf der Platine integriert wären, so müssen sie als „fliegender Aufbau“ durchgeführt werden.
Nun zur Inbetriebnahme:
Schade, dass kein Netzteil 5V/1A im Bausatz enthalten ist, so musste dieses separat beschafft werden. Aus der Schaltung war nirgends ersichtlich ob evtl. ein vorhandenes 5,3V-Netzteil auch verwendbar wäre. Angaben zur Toleranz der Versorgungsspannung hätten da geholfen.
Die Lieferung war mit der Software-Version wiffi_wz_53 programmiert.
Die Programmierung des WLAN-SSID-Netzwerkname, dem WLAN-Passwort u. CCU-Ip-Adresse (gleich eigener IPS-Server-Adresse) erfolgte dank der guten Beschreibung von einem separaten Laptop über die IP 192.168.4.1 ohne Probleme. Dabei daran denken, ebenfalls den WIFFI-WZ Parameter 27 auf 1 zu setzen um die json-Ausgabe zu erhalten, sowie den Parameter 13 für Ortshöhe und 20 , 21 für die Ortskoordinaten zu setzen.
Nach dem Restart war ein Anmelden im WLAN des IPS-Netzwerk nicht möglich. Nach längerem Suchen fand ich in der Beschreibung einen Hinweis: Die SW-Version 53 kommt anscheinend nicht mit Leerzeichen im WLAN-SSID-Netztwerknamen klar, die ich aber bei meiner FRITZ!Box verwende.
Inzwischen war die neue WIFFI-Version 56 erhältlich, doch ein Update konnte nur nach erfolgreichen Anmelden im WLAN-Netzwerk erfolgen, nach Hinweis von Eugen habe ich übergangsweise meine SSID in der FRITZ!Box geändert, konnte den WIFFI-WZ anmelden und auf die SW-Version 56 updaten. Ab dieser Version ist es nun möglich auch Leerzeichen in den WLAN-SSID-Netzwerknamen zu verwenden.
Nach einem Reset kann man am Browser mit der neuen IP-Adresse die gemessenen Daten über die Eingabe WIFFI-IP-Adr/?json: ausgeben. Ein zu schnelles Wiederholen der Abfrage sollte unterbleiben, da sonst keine neuen Daten angezeigt werden und ein Reset nötig ist.
Die Einbindung in IPS erfolgte mit der Beschreibung und dem Script von Ralf, danke dafür. Die Struktur (wiffi_MAC-Adresse des WIFFI) wurde aufgebaut und die WIFFI-Daten angezeigt, ein Update der Daten erfolgte alle 2 min oder bei Werteänderung.
Warum die MAC-Adresse im WIFFI genau andersherum wie in der FRITZ!Box dargestellt wird, ist mir unklar, man sollte nur darauf achten wenn man der WIFFI-WZ eine feste IP-Adresse in der FRITZ!Box zuordnet. (Der WIFFI-WZ erscheint dort mit dem Namen ESP…)
Leider entsprachen die angezeigten Daten in IPS nicht den Werten der json-Ausgabe im Browser. So wurde z.B. in IPS die Temperatur durch einen anderen Wert überschrieben.
Wahrscheinlich lag das an einer falschen Struktur (doppelte Indizes) in den Json-Daten. Dies habe ich Eugen berichtet und am 17.1.2017 wurde die neue SW-Version 60 veröffentlich.
Der Test mit der Version 56 zeigte nach einigen Stunden einige konstante (eingefrorene) Werte von 99,6.
Ein SW-Reset über den Browser brachte keine Verbesserung. Erst ein Power OFF/ON lieferte wieder plausible Werte.
Der Luftdruckwert wurde die ganze Zeit nur mit einem konstanten (Max)Wert angezeigt. Ich habe deshalb den Sensor BMP180 durch einen BME280 ersetzt, seitdem wird der Luftdruck korrekt angezeigt. (Den BME280 hätte man gegen Aufpreis auch gleich direkt mitbestellen können).

Der WIFFI-WZ wurde anschließend auf die SW-Version 60 upgedatet. Die alte Struktur in IPS habe ich gelöscht.
Die neue Struktur in IPS wurde nicht aufgebaut, obwohl in IPS-Server-Socket und im Cutter unter Debug Daten angezeigt wurden. Obwohl die Instanzen zwischen IPS-Server Socket, Cutter und Register-Variable nicht geändert wurden, waren keine Daten im Debug der Registervarablen erkennbar. Erst nach der Neuanlage dieser Instanzen wurde die Registervariable wieder mit Daten gefüllt und die Struktur „wiffi_MAC-Adresse“ neu aufgebaut und die Daten mit den zusätzlichen Werten für Taupunkt und absoluter Feuchte angezeigt. Dabei sollte man etwas Geduld haben, da die Daten nur im 2min Takt bereitgestellt werden. Eingefrorene Daten konnte ich in dieser Version und mit dem BME280 bisher nicht wieder feststellen.
Ein Problem scheint es noch in Ralf‘s Script zu geben:
Führt man ein Power OFF/ON durch, wird eine zusätzliche neue Struktur in IPS angelegt mit wiffi_ ohne eine MAC-Adresse, die alte Struktur mit „wiffi_MAC-Adresse des wiffi„ bleibt zum Glück erhalten. Vielleicht kann Ralf ja da nochmal nachbessern, meine Bereinigungs-Versuche sind leider aus Unkenntnis fehlgeschlagen.

Ich werde den WIFFI-WZ in der nächsten Zeit in verschiedenen Räumen testen. Der Hinweis über die Empfindlichkeit des rechten IR-Modul scheint zuzutreffen, so wurde nachts mehrfach eine Bewegung in einem nicht genutzten Raum registriert. Ich habe darauf die IR-Module untereinander getauscht, was eine gewisse Verbesserung brachte. Warum die mitgelieferten Entstörkondensatoren an den IR-Modulen (am SMD-IC) nicht bereits serienmäßig angelötet wurden, verstehe ich nicht, da Löten an SMD-Bauelementen ohne Spezial-Lötwerkzeug zur Beschädigung führen kann.
Wenn etwas mehr Zeit meinerseits vorhanden ist, werde ich die Stromaufnahme checken um evtl. auf Batteriebetrieb umzustellen.
Es steht außerdem noch der Einbau in das optionale Gehäuse an, was doch etwas tricky zu sein scheint, da Stecker und LED’s hoch/runtergebogen werde müssen.

Fazit meinerseits:
Interessanten, empfehlenswertes Modul um die verschiedenen Parameter in einem Raum zu erfassen. Ich werde die gelieferten Daten in nächster Zeit immer wieder auf Plausibilität mit bereits installierten Sensoren und Abläufen prüfen. Sollte eine gewisse Zuverlässigkeit und Langzeitstabilität vorhanden sein, werde ich mir für einen weiteren Raum ein weiteres WIFFI-WZ oder auch das Modul WIFFI-Voice zulegen.
Gruß GMilf

Spiegelt sich mit meiner Erfahrung in Bezug auf Firmware 60 wieder. Ich habe allerdings noch nich probiert die Instanzen neu anzulegen. Werde ich Montag probieren und dann berichten.
Ansonsten aber ein toller Sensor der jede Menge Daten liefert. Um das mit anderen Systemen abzubilden müsste man deutlich tiefer in die Tasche greifen!

Die V60 liefert fehlerhaftes JSON, ich teste gerade eine neue Version.

Hallo,

gibt es da schon news?
Es sieht so aus als ob das mit der wiffi_wz_74 auch nicht geht.
Die 74 war schon installiert.

I0 und Cutter bekommen Daten, Die RegVar nicht mehr?

Danke

Chris

Hello,
ich habe gerade ein mail von Eugen Stall erhalten, er sagt das der JSON Fehler korrigiert ist.
Woran kann es liegen das die REG Var keine Daten im Debug anzeigt?
Stimmt die 03 HEX als Trennwert noch?

Danke.

Chris

Er hat mir im Frühjahr nicht mehr geantwortet, bei mir läuft weitgehend 54. Alle weiteren getesteten Versionen war nicht nutzbar, da das JSON nicht korrekt ist.

Auch der Neustart alle 2 Tage liefert ein defektes Paket.

Ich musste einiges in der Kommunikation umstellen, da die Pakete in zwei Teilen kommen. Die müssen dann wieder zusammengesetzt werden. Das macht inzwischen ein Modul.

Ich schaue mir am Sonntag mal an, wie ich das am Besten zur Verfügung stellen kann.

Hallo,

mit der Version wiffi_wz_75 funktioniert es bei mir.

Viele Grüße aus dem Unterallgäu
Harry

Gesendet von iPad mit Tapatalk

Und so hab ich es gemacht:

  1. WWW-Reader einrichten:

URL: http://<ip-Adresse des WIFFI>/?json

  1. Controller-Script „WIFFI Controller“ für die Register-Variable erstellen:
<?
// Auswerte-Script für den WIFFI


// ID des WWW-Readers anpassen!
$WWW_ReaderID = 12345;

// wer hat das Script aufgerufen?
switch ($_IPS['SENDER']) {
	case "Execute":   // direkter Start des Script

		// Webseite abfragen
		WWW_UpdatePage($WWW_ReaderID);
		break;

	case "RegisterVariable":   // Auswerten der Register Variable

		$buf = $_IPS['VALUE'];
		$data = json_decode($buf, true);
		$variables = IPS_GetChildrenIDs(IPS_GetParent($_IPS['SELF']));
		
		// Daten-Array auswerten
		for($i=0; $i<count($data['vars']); $i++) {

			$var_name = $data['vars'][$i]['homematic_name'];
			$var_wert = $data['vars'][$i]['value'];

			for($k=0; $k<count($variables); $k++) { 

				if (IPS_GetName($variables[$k]) == $var_name) {

					// Werte wegschreiben
					SetValue($variables[$k], $var_wert); 
				}
			}
		}
		break;

	case "TimerEvent":
	case "Variable":
	case "WebFront":
		break;
}
// Log-Meldung schreiben
IPS_LogMessage($_IPS['SELF'], "*** ".IPS_GetName($_IPS['SELF'])." Skript #".$_IPS['SELF']);
?>
  1. Register-Variable einrichten und mit WWW-Reader und Controller-Script verbinden:

  2. Unterhalb der Register-Variable die benötigten Variablen anlegen.
    Die Variablennamen wie im JSON-Telegramm benennen und dabei die Variablentypen beachten!

So sollte es funktionieren. :slight_smile:

Viele Grüße aus dem Unterallgäu
Harry