Hallo,
auf Grund eines Berichtes in der aktuellen C't habe ich mir das neue IoT-Ding Sens'it 3 (https://www.sensit.io/ (https://www.sensit.io/)) besorgt, welches über das SigFox-Netz unter anderem Temperatur und Bewegungsmeldungen an einen Sens'it-Server überträgt. Die Daten können dann per App oder Web abgefragt werden. Das Ding funktioniert in meiner vom Haus abgelegenen Garage einwandfrei, so dass ich dort über dieses Ding eine Temperaturüberwachung oder eine Überwachung der Toröffnung realisieren könnte.
Könnte deshalb, weil ich es bis dato noch nicht geschafft habe, Sens'it in FHEM einzubinden. Die Web-Oberfläche /https://www.sensit.io (https://www.sensit.io)) von Sens'it erlaubt es bei einer Meldung des Gerätes eine Notification an mich zu versenden. Dies geht aktuell per SMS, E-Mail, Push (auf Smartphones) oder mit einem Webhook.
Jetzt war meine Idee, mittels Webhook einen Event und Daten des Sens'it-Gerätes direkt an FHEM weiterzugeben um dort bei einem Dummy entsprechende Readings zu generieren.
Über E-Mail geht es nicht, da die Daten in der generierten E-Mail im Body stehen, hier habe ich innerhalb von FHEM kein Modul gefunden, welches den Body ausliest und andererseits wäre diese Art nicht just-in-time.
Daher würde ich das ganze über den Webhook (https://build.sigfox.com/sensit-for-developers#sensit-io-webhooks (https://build.sigfox.com/sensit-for-developers#sensit-io-webhooks)) realisieren wollen. Dieser schaut so aus:
ZitatHTTP Post:
URL => beliebig (also die FHEM-Adresse; ex: https://my.web-hook.com/)
Header => beliebig (zwei Felder name:value; ex: content-type: text/html)
Body =>
{
"messageId": "{{messageId}}",
"receivedAt": "{{receivedAt}}",
"deviceId": "{{deviceId}}",
"sigfoxId": "{{sigfoxId}}",
"deviceName": "{{deviceName}}",
"payload": "{{payload}}",
"batteryIndicator": "{{batteryIndicator}}",
"value": "{{value}}",
"sensor": "{{sensor}}",
"state": "{{state}}",
"events": "{{events}}"
}
ex: Sens'it {{deviceName}} says Hello!
D.h. die für FHEM benötigten Daten stehen im Body.
Zwar kann ich mittels der URL-Zeile in Fhem einen Befehl auslösen, das funktioniert auch, aber ich will an die Daten im Body herankommen.
Gibt es so was ähnliches wie Geofancy, welches bei Aufruf den Body eines Http-Aufrufes ausliest und dieses dann als Reading in Fhem speichert. Mit Geofancy habe ich es ausprobiert, aber es geht richtigerweise nicht, da ein anderer Body erwartet wird. Mir würde es schon genügen, wenn der Body als solches in ein Reading kommt, dann kann man es selber aufdröseln. Aber aktuell scheitere ich einfach an der Tatsache, dass ich zwar FHEM kontaktieren kann, mit aber der Body von Sens'it verloren geht. Leider kann ich in der URL keine Variablen des Body übergeben, so dass hier hier über den URL-Aufruf arbeiten könnte.
Kennt jemand eine Lösung, wie ich an den Body herankommen? Oder gibt es vielleicht jemanden, der für Sens'it ein Modul schreiben könnte?
Vielen Dank für Eure Rückmeldungen.
Viele Grüße
Kurt
So etwas gibt es tatsächlich, das Modul heisst HTTPMOD.
Sent from my iPad using Tapatalk
Hallo schka17,
sicher?
Ich habe HTTPMOD so verstanden, dass HTTPMOD eine URL aufruft und dann eine Antwort erwartet. Also die Aktion geht von FHEM aus.
Sens'it funktioniert so aber nicht, sondern Sens'it senden den HTTP-Reqest selber, d.h. die Aktion geht von Sens'it aus. Wäre ja auch anders rum suboptimal, da ich ja nicht weiß, wann mein Sens'it eine Notifiktion sendet, insbesondere bei Bewegungen.
D.h. ich benötige so was wie eine "normale" URL-Steuerung von FHEM, wobei hier dann ein HTTPMOD lauscht und den Body extrahiert. Also eine Mischung zwischen Geofany (als "Lauscher") und HTTPMOD (als "Extrahierer").
So habe ich HTTMOD aber nicht verstanden, oder irre ich mich da....
Gruß
Kurt
@kurt6908: Koenntest du bitte Folgendes in 99_myUtils.pm eintragen:use vars qw(%FW_webArgs);
sub
sensitFn()
{
Log 1, "MYFN:".join("\n", map { "$_=>$FW_webArgs{$_}" } keys %FW_webArgs);
}
dann als URL Folgendes spezifizieren:http://fhemhost:fhemport/fhem?cmd=%7bsensitFn()%7d&XHR=1
und die Ausgaben aus dem FHEM-Log hier anhaengen?
Hallo rudolfkoenig,
ich habe die 99_myUtils editiert, die URL jedoch auf meinen "offenen" FHEM-Webhook umgebaut
https://fhemhost:fehmport/webhook?cmd={sensitFn()}&XHR=1
ein manueller Aufruf (einfach URL im Browser ohne Body o.ä.) liefert im Log
Zitat
MYFN:cmd=>{sensitFn()}
XHR=>1
Die o.g. ULR ist bei Sens'it hinterlegt, jetzt muss ich warten, bis sich das Ding wieder meldet...dann melde auch ich wieder.....
Gruß
Kurt
Hallo rudolfkoenig,
hier der Logeintrag meines Sens'it:
Zitat2018.09.08 20:33:43 1: MYFN:XHR=>1
{
"messageId": "5b941606a111fa53422ae11b",
"receivedAt": "Sat Sep 08 2018 18:33:41 GMT 0000 (UTC)",
"deviceId": "xxxx",
"sigfoxId": "xxxxx",
"deviceName": "Sensit1",
"payload": "xxxxx",
"batteryIndicator": "2",
"value": "28.63",
"sensor": "temperature",
"state": "",
"events": ""
}=>
cmd=>{sensitFn()}
Daten habe ich anoymisiert, inhaltlich und insbesondere die Temperturdaten stimmt aber alles.
Jetzt würde ich z.B. gerne value in ein Reading in ein Dummy schreiben.
Ich glaube mit der Erweiterung in den 99_myUtils.pm und der Logausgabe würde ich schon irgendwie weiterkommen, aber ich traue es mir nicht zu, daraus ein richtiges Modul zu schreiben.....aber wahrscheinlich ist es sinnvoller, ein richtiges Device daraus zu machen...
Viele Grüße
Kurt
Aendere sensitFn in:sub
sensitFn()
{
for my $k (keys %FW_webArgs) {
next if($k !~ m/^{.*}$/s);
json2reading("sensitdummy", $k);
}
}
sensitdummy muss definiert sein, und FHEM einigermassen aktuell wg. json2reading.
Hallo rudolfkoenig,
VIELEN DANK!
Es funktioniert. Ich empfange nun die JSON-Werte meines Sens'it in FHEM in einem Dummy als Reading und kann damit weiterarbeiten.
Da ich die Funktion json2reading nicht gefunden habe und danach auch nicht gesucht habe, kam ich nicht auf diese Lösung.
Da das Device Sens'it jedoch parallel zur Temperatur auch noch Feuchtigkeit schickt und sich generell auch auf andere Werte (z.B. Licht und Bewegung) umschalten lässt, wäre aus meiner Sicht ein richtiges Modul auf Basis von json2reading nicht schlecht. Ansonsten muss für jeden Wert bzw. jeden Dummy zumindest die 99_myUtils.pm erweitert werden.
Viele Grüße
Kurt
Zitat von: kurt6908 am 09 September 2018, 10:54:35
Da das Device Sens'it jedoch parallel zur Temperatur auch noch Feuchtigkeit schickt und sich generell auch auf andere Werte (z.B. Licht und Bewegung) umschalten lässt, wäre aus meiner Sicht ein richtiges Modul auf Basis von json2reading nicht schlecht. Ansonsten muss für jeden Wert bzw. jeden Dummy zumindest die 99_myUtils.pm erweitert werden.
Viele Grüße
Kurt
Für jedes externe Gerät ein Device. Also eigentlich korrekt so. Oder hast du unterschiedliche Geräte für Temperatur und Feuchtigkeit?
Hallo CoolTux,
das Sens'it, als ein Gerät, hat unterschiedlich Modi, die sich am Gerät oder per Web-Interface umschalten lassen (https://www.sensit.io/ (https://www.sensit.io/)):
- Temperatur und Feuchtigkeit
- Türschließung
- Lichtanzeige
- Magneterkennung
- Vibration
Das Gerät kann aber nur einen der genannten Modi übermitteln und nicht mehrere gleichzeitig, mit Ausnahme von Temperatur und Feuchtigkeit.
Die an die Sens'it-App bzw. eigentlich eher an die Sens'it-Cloud übermittelten Daten gem. o.g. Modi können dann mit verschiedenen "Notifications" versehen werden (siehe das Bild unter https://build.sigfox.com/sensit-for-developers#sensit-io-webhooks (https://build.sigfox.com/sensit-for-developers#sensit-io-webhooks)), wobei jedoch jeder WERT mit einer eigenen Notification versehen werden muss, d.h. konkret, jeder Wert braucht seinen eigenen HTTP-Post-Request, der jedoch anpassbar ist. Jetzt könnte man allen Wertänderungen die gleiche URL eintragen (wie bei mir aktuell), dann werden aber die Werte überschrieben.
Also braucht man aktuell für jeden Wert (wenn man das Gerät mal umschalten würden, bzw. ein weiteres Gerät dazunimmt) eine eigene URL und eine eigene Routine in FHEM, damit die Readings korrekt versorgt werden. Oder man passt den HTTP-Body für jeden Wert an und übermittelt nur das Value, dann weiß man aber wieder nicht, welche Notifikation aktiv ist.
Mit einem Modul könnte man auf den Wert "sensor" (der den o.g. Modi entsprchen sollte) reagieren und damit auch unterschiedlich Readings in einem Device versorgen. So könnte man z.B. alle o.g. Modi im Device als Reading anlegen und je nach "sensor" und "value" richtig zuordnen.
Ich habe aktuell "Temperatur und Feuchtigkeit" eingestellt und würde so zwei Webhooks einstellen können. Momentan habe ich nur Temperatur aktiv, da mit ein zweiter für Feuchtigkeit meine Readings überschreiben würde. D.h. ich müsste nun einen zweiten Dummy für Feuchtigkeit anlegen, die 99_myUtils.pm erweitern und dem Wert Feuchtigkeit eine andere URL übergeben. Das ist aus meiner Sicht, insbesondere für alle möglichen Modi, nicht praktikabel, so dass durch ein Modul das Gerät mit allen seinen Modi als ein Device angelernt werden sollte.
Leider kann ich das nur theroretisch....für ein Modul fehlen mir die Perl-Kenntnisse...a bisl was geht scho...aber net so gscheid.... ;=)
P.S.: Das Ding liegt in meiner ca. 200m entfernten Sammelgarage und sendet brav jede Stunde die Temperatur über das Sigfox-Netz (https://www.sigfox.com/en (https://www.sigfox.com/en))...funzt einwandfrei....aber in FHEM aktuell halt nur die Temperatur...
Zitatdefmod dy_Garage_Temperatur dummy
attr dy_Garage_Temperatur group Sensit
attr dy_Garage_Temperatur room Garage
attr dy_Garage_Temperatur userReadings temperature_met:value.* { my $val = (ReadingsVal("dy_Garage_Temperatur", "value", 0));; $val=~ s/\./,/g;; return $val;;}
setstate dy_Garage_Temperatur 20.75
setstate dy_Garage_Temperatur 2018-09-09 12:32:24 batteryIndicator 2
setstate dy_Garage_Temperatur 2018-09-09 12:32:24 deviceId xxx
setstate dy_Garage_Temperatur 2018-09-09 12:32:24 deviceName Sensit1
setstate dy_Garage_Temperatur 2018-09-09 12:32:24 events
setstate dy_Garage_Temperatur 2018-09-09 12:32:24 messageId 5b94f6b84dc3a42621e7b653
setstate dy_Garage_Temperatur 2018-09-09 12:32:24 payload xxx
setstate dy_Garage_Temperatur 2018-09-09 12:32:24 receivedAt Sun Sep 09 2018 10:32:22 GMT 0000 (UTC)
setstate dy_Garage_Temperatur 2018-09-09 12:32:24 sensor temperature
setstate dy_Garage_Temperatur 2018-09-09 12:32:24 sigfoxId xxx
setstate dy_Garage_Temperatur 2018-09-09 12:32:24 temperature_met 20,75
setstate dy_Garage_Temperatur 2018-09-09 12:32:24 value 20.75
temperature_met brauche ich, damit Alexa richtig liest ;=)
Gruß
Kurt
Du kannst aber zu mindest für Deinen Fall und für das gleichzeitige übertragen von Temperatur und Luftfeuchtigkeit Dir Ein anpassen. Sagt ja keiner das Du json2reading nehmen musst. Und wenn doch machst 2 Dummys und passt entsprechend Deine Regex an.