FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: kblc am 24 Oktober 2017, 21:13:38

Titel: FHEM übergibt einen Wert an FHEM
Beitrag von: kblc am 24 Oktober 2017, 21:13:38
Hallo,

ich hab wieder mal eine Frage.

Ich möchte einen Wert eines FHEM System an ein anderes übertragen. Aber eben nur einen Wert.

Firmata_ANALOG soll den Beweungssensor auf 192.168.67.136 den Wert geben.
Was habe ich vergessen? Das ist bestimmt wieder so eine Kleinigkeit.
Ich bewundere übrigens, wie schnell ihr manchmal meine Fehler, an denen ich Tagelang grüble, innerhalb von Sekunden löst. Dankeschön an dieser Stelle schon mal und auch noch mal.


Folgenden Ansatz habe  ich:

Firmata_ANALOG = Bewegungsmelder oder -sensor
Beweungssensor = Dummy auf dem anderen FHEM System
Der Wert ist eine (max) 4Stellige Zahl also 1024 bis 0




define Firmata_ANALOG FRM_AD 14
attr Firmata_ANALOG IODev FIRMATA
attr Firmata_ANALOG event-min-interval reading:5
attr Firmata_ANALOG event-on-change-reading reading:2
attr Firmata_ANALOG stateFormat reading
#attr Firmata_ANALOG webCmd state

define Firmata_ANALOG_Notify notify Firmata_ANALOG:.*  {GetFileFromURL 'http://192.168.78.136:8083/fhem?cmd.Beweungssensor=set%20Beweungssensor%20$EVENT'}



Hier noch ein list

Internals:
   DEF        14
   IODev      FIRMATA
   NAME       Firmata_ANALOG
   NR         78
   PIN        14
   STATE      834
   TYPE       FRM_AD
   resolution 10
   Readings:
     2017-10-24 21:09:16   reading         834
     2017-10-24 21:04:32   state           Initialized
Attributes:
   IODev      FIRMATA
   event-min-interval reading:5
   event-on-change-reading reading:2
   stateFormat reading


Das Ergebnis, das ich jetzt habe ist, dass beim Beweungssensor "$EVENT" kommt. Aber da sollte ja dann eine Zahl stehen.
Vielen Dank

KBLc
Titel: Antw:FHEM übergibt einen Wert an FHEM
Beitrag von: Wzut am 24 Oktober 2017, 21:25:43
nimm mal statt der einfachen Anführungszeichen ' die Doppelten "
Perl löst Veriablen (in deinem Fall $EVENT ) in einfachen Anführungszeichen nicht auf, innerhalb doppelter schon
Oder klebe die Variable an den String :
'http://192.168.78.136:8083/fhem?cmd.Beweungssensor=set%20Beweungssensor%20'.$EVENT
Titel: Antw:FHEM übergibt einen Wert an FHEM
Beitrag von: kblc am 24 Oktober 2017, 21:38:30
Danke für die schnelle Antwort.
Mit doppelten " hat es gar nichts gesendet. Mit dem $EVENT dahinter setzen auch nicht. Ich habe das erkannt am EVENT monitor:

Ach ja und noch ein Fehler meinerseits. Es ist kein Bewegungsmelder, sondern ein Fotowiderstand. Daher auch die Werte im 4Stelligen Bereich. Sorry. Ich habe es aktuell geändert. Daher ist der Auszug bereits mit den neuen Namen.

2017-10-24 21:35:32 dummy Fotowiderstand $EVENT
2017-10-24 21:35:34 dummy Fotowiderstand $EVENT
2017-10-24 21:35:35 dummy Fotowiderstand $EVENT
2017-10-24 21:35:36 dummy Fotowiderstand $EVENT
2017-10-24 21:35:37 dummy Fotowiderstand $EVENT
2017-10-24 21:35:38 dummy Fotowiderstand $EVENT
2017-10-24 21:35:39 dummy Fotowiderstand $EVENT
Titel: Antw:FHEM übergibt einen Wert an FHEM
Beitrag von: Wzut am 24 Oktober 2017, 21:44:59
ich habe eben beide Version getestet und beide gehen bei mir , allerdings wird sich sich dein log über den vielen Output freuen.
Sicher auch das du den ganzen Event haben möchtest und nicht nur den Wert mit $EVTPART1 ?
Titel: Antw:FHEM übergibt einen Wert an FHEM
Beitrag von: kblc am 24 Oktober 2017, 22:24:29
Danke.

Das ist merkwürdig. irgendwas mache ich falsch. Das hat bei mir noch nie so richtig geklappt. Aber $EVENT stimmt doch, oder?

Titel: Antw:FHEM übergibt einen Wert an FHEM
Beitrag von: Otto123 am 24 Oktober 2017, 23:40:01
Hi,

hast Du den Befehl mal einfach in der FHEM Befehlszeile getestet?
{GetFileFromURL 'http://192.168.78.136:8083/fhem?cmd.Beweungssensor=set%20Beweungssensor%20$EVENT'}
Geht nicht wegen '' da wird $EVENT nicht aufgelöst
{GetFileFromURL "http://192.168.78.136:8083/fhem?cmd.Beweungssensor=set%20Beweungssensor%20$EVENT"}
Geht eventuell  nicht wegen % und $ ? Muss man das nicht maskieren?
\% \$
Ich würde es ja einfach so machen, das geht auf alle Fälle:
Edit: Wegen den Beiträgen weiter unten habe ich den Code nachträglich geändert
"curl http://192.168.78.136:8083/fhem?cmd.Beweungssensor=set%20Beweungssensor%20$EVENT"

Falls der csrf Token (https://wiki.fhem.de/wiki/CsrfToken-HowTo) abgeschaltet ist :)

Gruß Otto
Titel: Antw:FHEM übergibt einen Wert an FHEM
Beitrag von: kblc am 25 Oktober 2017, 00:09:44
Vielen Dank, ich habe es gerade geschafft.

Hier meine Lösung. Das war nicht einfach zu verstehen. Aber Commandref, Otto123 und Wzut haben mir sehr geholfen. Vielen Dank:

define Firmata_ANALOG_Notify notify Firmata_ANALOG.* "wget http://192.168.78.136:8083/fhem?cmd.Fotowiderstand=set%20Fotowiderstand%20$EVTPART1"
Titel: Antw:FHEM übergibt einen Wert an FHEM
Beitrag von: Wzut am 25 Oktober 2017, 09:19:57
sicher es gibt halt 100 Wege nach Rom ....
Wenn es denn unbedingt wget sein muss :
Wirf mal einen Blick nach /opt/fhem, hier werden sich die HTML Rückgaben in der Form fhem?cmdxxxx stapeln.
D.h. wenn schon wget dann würde ich ihm immer das gleiche File für den Output zuweisen , z.B.
define Firmata_ANALOG_Notify notify Firmata_ANALOG.* "wget -O /tmp/dummy http://192.168.78.136:8083/fhem?cmd.Fotowiderstand=set%20Fotowiderstand%20$EVTPART1"
das -O ist keine Null sondern der Anfangsbuchstabe von Otto :)

Aber auch die erste Version sollte gehen, allerdings landet der HTML Output direkt im Logfile , es sei denn man gibt einfach ein undef zurück :
define Firmata_ANALOG_Notify notify Firmata_ANALOG.* {GetFileFromURL 'http://192.168.78.136:8083/fhem?cmd.Fotowiderstand=set%20Fotowiderstand%20'.$EVTPART1; return undef;}

Edit : das waren jetzt nun zwei der 100 Wege ... IMHO noch eleganter ist es den HTML Output direkt an der Quelle zu unterdrücken  z.B. dadurch das man noch ein XHR=1 in die URL bastelt :)
Titel: Antw:FHEM übergibt einen Wert an FHEM
Beitrag von: Otto123 am 25 Oktober 2017, 09:57:54
Zitat von: Wzut am 25 Oktober 2017, 09:19:57
sicher es gibt halt 100 Wege nach Rom ....
Wenn es denn unbedingt wget sein muss :
Wirf mal einen Blick nach /opt/fhem, hier werden sich die HTML Rückgaben in der Form fhem?cmdxxxx stapeln.
Moin,

eigentlich nicht, ich meine, bei dem Aufruf von Programmen mit Syntax  "Programm" landet der stdout im Logfile. In meinem Test in der FHEM Kommandozeile war das zumindest so.

Ich habe jetzt nochmal ein bisschen gelesen. Die Beschreibung im Wiki  (https://wiki.fhem.de/wiki/HttpUtils) würde mich davon abhalten bei sowas einfach GetFileFromURL zu verwenden. -> blockierend
Die Aufrufe "<Programm>" werden nicht blockierend ausgeführt.

Gruß Otto
Titel: Antw:FHEM übergibt einen Wert an FHEM
Beitrag von: Wzut am 25 Oktober 2017, 10:02:09
Zitat von: Otto123 am 25 Oktober 2017, 09:57:54
eigentlich nicht
bei mir schon :)
Titel: Antw:FHEM übergibt einen Wert an FHEM
Beitrag von: Otto123 am 25 Oktober 2017, 10:19:18
Zitat von: Wzut am 25 Oktober 2017, 10:02:09
bei mir schon :)
bei mir auch  ;)
Hängt davon ab welche url man testet, mit den FHEM Kommandos passiert genau das - gut das wir drüber gesprochen haben.

Ich ändere meine Empfehlung auf curl. Da passiert nix.

Gruß Otto
Titel: Antw:FHEM übergibt einen Wert an FHEM
Beitrag von: Wzut am 25 Oktober 2017, 10:31:05
Zitat von: Otto123 am 25 Oktober 2017, 10:19:18
Ich ändere meine Empfehlung auf curl. Da passiert nix.
OK, dann hätten wir drei von den 100 ...
@all , Jungs & Mädels strengt euch mal ein bisssl mehr an  bis heute Abend sollten wir doch das Dutzend voll bekommen  ::)
Titel: Antw:FHEM übergibt einen Wert an FHEM
Beitrag von: Otto123 am 25 Oktober 2017, 12:19:21
Als Zwischenstand möchte ich mal noch die Lösung ohne jede Ausgabe (weder Datei noch Eintrag im Log)  zeigen.
define Firmata_ANALOG_Notify notify Firmata_ANALOG.* "curl -s http://192.168.78.136:8083/fhem?cmd=set%20Fotowiderstand%20$EVTPART1"

Das mit XHR=1 zum Unterdrücken habe ich nicht hinbekommen, da wird trotzdem der Fortschritt von curl ins Logfile geschrieben.
Titel: Antw:FHEM übergibt einen Wert an FHEM
Beitrag von: Wzut am 25 Oktober 2017, 13:10:46
Zitat von: Otto123 am 25 Oktober 2017, 12:19:21
Das mit XHR=1 zum Unterdrücken habe ich nicht hinbekommen
"curl -s 'http://192.168.78.136:8083/fhem?XHR=1&cmd=set%20Fotowiderstand%20'$EVTPART1"
Titel: Antw:FHEM übergibt einen Wert an FHEM
Beitrag von: Otto123 am 25 Oktober 2017, 14:59:48
Ich habe noch ein wenig probiert. Mit meinem Gelaber über Erkenntnis kapere ich zwar jetzt etwas den Thread aber ich wollte es einfach verstehen :)
Mein Test Pi hat auf 8088 keinen csrf Token
curl http://192.168.178.80:8088/fhem erzeugt die Ausgabe der Startseite nach stdout
curl http://192.168.178.80:8088/fhem?XHR=1 erzeugt keine Ausgabe nach stdout
curl -o Ausgabe.txt http://192.168.178.80:8088/fhem erzeugt die Ausgabe der Startseite nach Datei und die Ausgabe des Fortschritts nach stdout
curl -o Ausgabe.txt http://192.168.178.80:8088/fhem?XHR=1 nur die Ausgabe des Fortschritts nach stdout obwohl keine Datei geschrieben wird
curl http://192.168.178.80:8088/fhem?cmd=set%20Lamp%20on erzeugt normalerweise(!) keine Ausgabe auf Kommandozeile(Putty) aber eine Ausgabe des Fortschritts ins Logfile bei Eingabe in Kommandozeile von FHEM

Hier kommt jetzt ein Problem mit Sonderzeichen & und ' ' auf der Kommandozeile zum tragen
curl http://192.168.178.80:8088/fhem?XHR=1&cmd=set%20Lamp%20on führt den set Befehl nicht aus.
Die folgenden beiden Varianten erzeugen keine Ausgabe und funktionieren:
curl 'http://192.168.178.80:8088/fhem?XHR=1&cmd=set%20Lamp%20on'
curl http://192.168.178.80:8088/fhem?XHR=1\&cmd=set%20Lamp%20on

Wie oben schon vermutet müssen die Sonderzeichen geschützt werden. Ich glaube das Problem ist unter Perl zwar ähnlich, aber nicht wirklich das Gleiche. Bei Dateinamen will die shell noch ? und = geschützt haben. Merkt man, wen man die oben erwähnten Dateien fhem?cmd=xxxx löschen will.
Jetzt könnte man noch probieren ob FHEM/Perl mit der Übergabe in " " noch irgendetwas verändert. Ich lasse das jetzt  ;)

curl -s unterdrückt in jedem Fall die Fortschrittsausgabe aber nicht die Ausgabe der Webantwort.

Gruß Otto
Titel: Antw:FHEM übergibt einen Wert an FHEM
Beitrag von: Wzut am 25 Oktober 2017, 15:16:25
@Otto , ich hatte meine Beispiele jeweils in einem notify stehen und nicht direkt in der shell, daher wage ich zu behaupten das man nichts maskieren muss :)