Sensordaten über FHEM mit Rest API an Website schicken

Begonnen von scp, 23 September 2019, 17:35:45

Vorheriges Thema - Nächstes Thema

scp

Hallo guten Tag,

ich habe es nun geschafft einen meiner wirelles MBUS Sensoren über einen nanoCUL zu integrieren. Nun ist mein nächstes Vorhaben einige Sensordaten zu einer Website zu schicken. Ich habe bereits gesehen, dass es einen "HTTPMOD" gibt , der evtl. so etwas unterstützen könnte. Gibt es eine Möglichkeit eine "REST API" zu verwenden ?
Hier gibt es ja einige Beiträge zum Thema Rest API für Sensoren. Dann könnte das ja auch bei Website funktionieren. Ich weiß nur, dass die Macher der Website Rest API verwenden. Bin noch neu in diesem Gebiet... habe z.b gesehen dass JSON dafür verwendet wird ?
Vielleicht hat jemand  einen Hinweis . Ich denke aber , wenn ich das lange genug probiere, es auch hinbekomme, wie bei meinem anderen Projekt ;D


scp


KölnSolar

ZitatThema Rest API für Sensoren
Ein fürchterlicher Begriff, der einem erst einmal Angst macht. Letztendlich ist es "nur" Internetdatenverkehr. Den kann es dann in den unterschiedlichsten Protokollen(http, mqtt, soap, xmpp....) geben. Wenn man Glück hat, findet  man im Inet irgendeine Anwendung, wo das Protokoll bereits "gehacked" wurde oder ausnahmsweise vom Hersteller offen gelegt wurde. Ist dem nicht so, dann braucht man immer noch etwas Glück, dass das Protokoll nicht per SSL/TLS verschlüsselt übertragen wird. Denn dann kann man "relativ einfach" mit Wireshark den Datenverkehr aufzeichnen, analysieren u. mit HTTPMOD umsetzen. Und Kür ist es, wenn man es dabei noch schafft die irrsinnige Nachhausetelefoniererei in die Cloud zu unterbinden, sprich sich den Server "nachbaut".

In Deinem Fall willst Du aber ja nur einen eigenen Server "versorgen", wenn ich Dich richtig verstanden hab. Dann vergiss diesen fürchterlichen Begriff und guck Dir an wie Server funktionieren. Da findest Du immer was zu nginx, apache.... Und nicht vergessen: FHEMWEB ist ja bereits ein Server.  ;) Vielleicht lässt sich Dein "Projekt" bereits mit FHEM-Bormitteln umsetzen.
Grüße Markus
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

scp

Habe nun erstmals herausgefunden, dass man mit einem notify ein Perl Skript ausführen kann. Werde auch noch schauen, dass das notify regelmäßig kommt, dazu gibt es auch ein Tool in Fhem habe ich bereits gesehen...

Habe jetzt erst mal zum schnelleren Lernen Perl Skript direkt auf meinem Raspbian (Linux) System mit Geany getestet. Das funktioniert soweit. Habe mir auch gedacht, dass ich so ein HTTP Post oder ähnliches im Notfall einfach durch das ausführen eines C Codes durchführe. Man kann in Perl über system ("Hier steht die Bash Anweisung"); Bashanweisungen von Linux ausführen. Somit habe ich zum Bsp. einfach ein anderes Perl Skript gestartet oder auch mal ein C Code ( was übrigens mit ./Coutfile geht....).

Nun habe ich mir gedacht, ich sei gewappnet und teste die system ()-Funktion einfach mal bei meinem Notify... aber das der system() angegeben Skript wird einfach nicht ausgeführt. Denke ich zumindest . Es wird auch nur eine -1 ausgegeben.

:)
testdummy {

print("hallo welt aus fhem");
system("echo halloausfhem");
system("cd /home/pi");  # wechsle in den pfad wo meine datei ist
my $rueckgabe =system("perl testperl.pl");  # führe mein perlskript aus :D
system("cd /home/pi");  # teste das ganze noch mal ...
system("perl testperl.pl");
$rueckgabe = system("echo hlowrld");
fhem("set testdummywert 400;;");;
  # es wird 400 zurückgegeben.. funktioniert aber nicht wenn ich $rueckgabe #zurückgebe, dann kommt nur -1 ....
# hier könnte evlt. ein HTTP Code hin.... zum senden von Daten

}


das ist meine perl skript auf meinem Linux-System:
print("helo\n"); # zeige einfach helo an
system("cd /home/pi/ ;perl testperl2.pl "); # wechsle in bestimmten pfad um weitere #pl auszuführen

#system("perl testperl2.pl");
printf("\n hier kommt das c file:\n"); # kündige c file an
system ("./test2"); # hier wird ein c file getestet
system("xmessage -center \"perl skript 1 ausgeführt!\" "); # lässt pop up #erscheinen


Ist das soweit sinnvoll was ich da mache ?
Es könnte ja auch sein, dass man noch Rechte für FHEM freischalten muss .., damit diese System Funktion korrekt ausgeführt weden kann.. mal schauen

Werde einfach weiter recherchieren. Hat mich ja bereits gefreut, dass ich so einfach Perl Skript für ein notify ausführen kann .

:D
Danke :D

KölnSolar

ZitatIst das soweit sinnvoll was ich da mache ?
Ich finde nicht.
Ganz verstanden habe ich es nicht, aber es wirkt von hinten durch die Brust ins Knie.  ;)
Du kannst PerlCode in z.B. eine 99_myUtils.pm als Sub in das FHEM-Modulverzeichnis packen.##############################################
# $Id: 99_myUtils.pm 1932 2012-10-06 20:15:33Z ichselbst $
package main;

use strict;
use warnings;

sub
myUtils_Funktion()
{
.

};

1;

die rufst Du in einem notify auf
define mynotify notify mydevice:.* {myUtils_Funktion()}

Um mit einem Server aus FHEM heraus zu kommunizieren, könnten diese Links zu der Beschreibung von bereits in FHEM integrierten Funktionen hilfreich sein: DevIo, httputils
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

scp

Erstmal ein Dankeschön bevor ich weiter recherchiere  :)



scp

So, habe es nun dank der anderen Posts hier geschafft ein externes Skript auszuführen !
https://forum.fhem.de/index.php?topic=17613.0
https://forum.fhem.de/index.php/topic,86073.0.html
https://forum.fhem.de/index.php?topic=34012.0

Es war evtl. das Problem, dass fhem entsprechende Rechte auf Linux benötigt.
Das konnte man durch "sudo visudo" Eintragen von fhem ALL = (ALL:ALL) ALL  und außerdem evtl. noch durch chmod 777 "scriptpfad"  lösen.

wenn ich nun in das commandofenster von Fhem den folgenden Perl code ausführe wird mein testperl.pl -Skript ausgeführt !
{system('sudo perl /home/pi/testperl.pl');;}



ZitatUm mit einem Server aus FHEM heraus zu kommunizieren, könnten diese Links zu der Beschreibung von bereits in FHEM integrierten Funktionen hilfreich sein: DevIo, httputils

Das muss ich jetzt unbedingt näher anschauen.
Vielleicht lassen sich so https Nachrichten versenden :D
Mal schauen .

scp

#7
Hi , nun habe ich das erste mal Daten von einer Website empfangen...
{GetFileFromURL("https://ptsv2.com/t/a8q2n-1570456690/post");;}

Die Antwort die ich dann erhalte stammt von der Testwebseite die man online selber erstellen kann:
"Test Best We love FHEM "

Erscheint zwar nicht im Logfile aber steht dann unter dem Eingabefenster.

Das bedeutet wohl, dass  ich noch tiefer einsteigen muss um die Befehle korrekt zu verwenden.  ;D
---
Auf der WIKI-Seite wird für HTTMOD auch etwas zu POST erklärt. Es gibt dort sogar ein Beispiel . Man müsste nur noch etwas Zeit investieren, um es nachzuvollziehen
Zitat
If your device expects special HTTP-headers then specify them as attr requestHeader1 to attr requestHeaderX. If your Device expects an HTTP POST instead of HTTP GET then the POST-data can be specified as attr requestData

Derweil habe ich ein Skript in Perl geschrieben um meine gewünschte Sensorvariable aus Fhem heraus in ein Textfile zu exportieren. das klappt :D
Dieser Code wird von einem "at" alle 5 Sekunden ausgeführt :D
Könnte ich dann alternativ mit einem eigenen Skript meiner wahl per POST verschicken :D aber ich möchte das eigentlich in FHEM selber mit dem HTTPMOD lösen.
+*00:00:05 {"Periodischer test"}{print("hallo welt aus fhem");;
system("echo halloausfhem");;
my $rueckgabe  = ReadingsVal("WMBUS_SON_23275669_22_8","1_value","2");;
print("\nInhalt = ",$rueckgabe);;
print("\n");
system("cd /; cd home/pi/Desktop;echo \"Following comes right out of FHEM !! :\">>T1.txt");;
system("cd /; cd home/pi/Desktop;echo $rueckgabe>>T1.txt");;
}


---
Tatsächlich lässt sich so ein Variablenwert aus FHEM extrahieren und verschicken  ;D ;D ;D
Der Code wurde ergänzt und schickt nur mit dem Linux curl immer einen aus FHEM herausgelesenen Variablenwert zu einem Testserver . Der zeigt dann wirklich die ganze Zeit an, dass ein POST gekommen ist ! ;D


+*00:00:05 {"Periodischer test"}{print("hallo welt aus fhem");;
system("echo halloausfhem");;
my $rueckgabe  = ReadingsVal("WMBUS_SON_23275669_22_8","1_value","2");;
print("\nInhalt = ",$rueckgabe);;
print("\n");
system("cd /; cd home/pi/Desktop;echo \"Following comes right out of FHEM !! :\">>T1.txt");;
system("cd /; cd home/pi/Desktop;echo $rueckgabe>>T1.txt");;
system("curl -d 'name=$rueckgabe' \"ptsv2.com/t/eanfw-1570542634/post\"");;
}


---
Außerdem hier frohe Neuigkeiten:
Nachdem man ein Attribut "request Data" zu einem HTTPMOD Modul hinzufügt, wird bei jedem Aufruf auch ein POST request gemacht.
Das sieht dann so aus:
Ich erstelle mir ein HTTMOD-Modul :
define postv4 HTTPMOD http://ptsv2.com/t/eanfw-1570542634/post 6
die Adresse soll alle 6 Sekunden aufgerufen werden.
Wenn man das ganze dann so eingibt werden alle 6 Sekunden Get requests gemacht.
Das kann ich daran sehen, dass auf der ptsv2 Seite immer steht um welche Anfrage es sich handelt.
Ok.
Nun möchte ich ja ein POST -Request durchführen.
Da ich das durch die kleine Linuxübung vorhin etwas besser verstanden habe ist mir wie vorhin gesagt schon dieses request Data aufgefallen. Mir war zwar noch total unklar welche Daten ich als Test einfügen könnte , aber dann habe ich einfach mal test=2 eingegeben....
Unglaublicherweise erschien dann eine POST Anfrage mit der Dateneinheit Test mit dem Wert 2 !
Daraufhin habe ich dann weiter getestet und wollte mehr Werte sehen, habe das dann gegen

param1=1111&param2=2222&param3=3333
ausgetauscht. Und tatsächlich kamen 3 voneinander getrennte Werte an !
;D
Jetzt müsste ich es nur noch schaffen die entsprechenden Sensorwerte/Variablen als werte zu übermitteln :D


Leider kommt da momentan nicht der Inhalt meiner Variablen an:
Also habe das einmal nur mit WMBUS_SON_23275669_22_8:1_value versucht und einmal als PERL Anweisung: {ReadingsVal("WMBUS_SON_23275669_22_8","1_value","2")}

Parameters
Parameter    Values
param1    1111
param2    2222
param3    WMBUS_SON_23275669_22_8:1_value
param4    {ReadingsVal("WMBUS_SON_23275669_22_8","1_value","2")}

, aber da steht dann einfach nur das gleiche xD ... will ja den Inhalt

Ah man muss evtl. explizit mit den HTTPMOD Befehlen arbeiten etwa mit einem Replacement ... muss das noch besser verstehen:
attr mydevice replacement01Mode text
Übersetzt aus der Wiki https://wiki.fhem.de/wiki/HTTPMOD
Zitatmanchmal kann es hilfreich sein, Teile einer URL, eines HTTP-Headers oder von Post-Daten dynamisch zu ändern, abhängig von vorhandenen Lesungen, Interna oder Perl-Ausdrücken zur Laufzeit. Dies kann erforderlich sein, um weitere Variablen an einen Server, ein aktuelles Datum oder andere Dinge zu übergeben.