!! Gelöst !! Terminal Curl Aufruf in reading speichern

Begonnen von Shadow3561, 28 Februar 2023, 19:28:50

Vorheriges Thema - Nächstes Thema

Benni

#15
Zitat von: Otto123 am 01 März 2023, 09:33:20
ich dachte jetzt gar nicht das hier im Post die echten Namen und Passwörter stehen :)

Dein curl Aufruf verwendet --digest - da läuft doch die Autorisierung zweistufig (challenge response) wenn ich das richtig verstehe?

Den hatte ich gar nicht bemerkt!
Das kann HttpUtils (und damit HTTPMOD) anscheinend nicht, wenn ich im Forum ausreichend recherchiert habe.

Das ist auch nicht zweistufig. Dabei werden, wenn ich es richtig verstanden habe, eigentlich nur Name und Passwort vor dem Senden als MD5-Hash encodiert, statt nur einfach in Base64 encodiert.

gb#

betateilchen

Zitat von: Benni am 01 März 2023, 09:53:51
Das kann HttpUtils ... anscheinend nicht

wie? wo? was?

Es gibt etwas, was HttpUtils nicht kann? Lass das nicht Rudi hören...  ;D
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Shadow3561

Damit klappt es zuverlässig. Danke

Wie schaffe ich es, dass nicht das Log zugefülltes wird? Verbose 0 hilft leider nicht.

Zitat von: JoWiemann am 01 März 2023, 09:42:03
Hallo,

ich habe Dir mal etwas gebaut. Ohne Gewähr.

defmod Klingel dummy
attr Klingel readingList Taster



defmod getKlingel at +*00:00:30 {\
my $strCurl = `curl -i --digest -u admin:password "http://192.168.1.xxx/ISAPI/VideoIntercom/callStatus?format=json&channelType=tripartitePlatform"`;;\
$strCurl =~ s/\n|\t//g;;\
\
  if ($strCurl =~ /"CallStatus":{"status":"(.*?)"}/) {\
    fhem("set Klingel Taster $1");;\
  } else {\
    fhem("set Klingel Taster Fehler");;\
  }\
}


Bitte admin:psswort und die IP wieder vervollständigen

Grüße Jörg

betateilchen

Zitat von: Shadow3561 am 01 März 2023, 11:09:32
Wie schaffe ich es, dass nicht das Log zugefülltes wird? Verbose 0 hilft leider nicht.

In Deinen fhem() aufrufen den Parameter für quiet angeben.

fhem("mache bla",1)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Warum machst Du Dir das Leben mit dem regexen von JSON schwer?
Da kann doch FHEM selbst ein reading generieren.


defmod getKlingel at +*00:00:30 {\
my $strCurl = `curl -i --digest -u admin:password "http://192.168.1.xxx/ISAPI/VideoIntercom/callStatus?format=json&channelType=tripartitePlatform"`;;\
json2reading('Klingel',$strCurl);


Danach steht der Zustand des Tasters als reading "CallStatus_status" im device "Klingel".
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

JoWiemann

Zitat von: betateilchen am 01 März 2023, 13:08:11
Warum machst Du Dir das Leben mit dem regexen von JSON schwer?
Da kann doch FHEM selbst ein reading generieren.


defmod getKlingel at +*00:00:30 {\
my $strCurl = `curl -i --digest -u admin:password "http://192.168.1.xxx/ISAPI/VideoIntercom/callStatus?format=json&channelType=tripartitePlatform"`;;\
json2reading('Klingel',$strCurl);


Danach steht der Zustand des Tasters als reading "CallStatus_status" im device "Klingel".

Ausgehend von der Rückgabe des curl Aufrufs, wie sie im ersten Post hinterlegt worden ist, handelt es sich um kein reines JSON. Also läuft json2reading auf einen Fehler.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

betateilchen

Ok, da hast Du natürlich recht.

Vielleicht sollte man mal curl dazu bewegen, nur den body zurückzuliefern? Wenn ich mich recht erinnere, gibt es bei curl einen parameter -b, der genau das bewirkt.

Ansonsten wäre es ziemlich sinnfrei, beim Aufruf der URL explizit ein Rückgabeformat (format=json) anzugeben, wenn dann doch kein brauchbares json zurückkommt.


-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

JoWiemann

Zitat von: betateilchen am 01 März 2023, 13:29:12
Vielleicht sollte man mal curl dazu bewegen, nur den body zurückzuliefern? Wenn ich mich recht erinnere, gibt es bei curl einen parameter -b, der genau das bewirkt.

Habe den Parameter gefunden: -H "Accept: application/json". Dann muss aber der Server das auch interpretieren.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Shadow3561

-H gibt leider nichts zurück.
-s hingegen liefert


{
"CallStatus": {
"status": "idle"
}
}

JoWiemann

Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Shadow3561

#25
Dank eurer Hilfe klappt es jetzt wie gewünscht.

Für die wenigen, die ähnliches vor haben.

Dummy definieren für das gewünschte Reading
defmod HikKlingel dummy


Notify definieren was den Curl-Aufruf macht und den json-String in den Dummy schreibt
defmod getKlingel at +*00:00:30  {\
my $strCurl = `curl -s --digest -u admin:password "http://192.168.1.xxx/ISAPI/VideoIntercom/callStatus?format=json&channelType=tripartitePlatform"`;;;;\
json2reading('HikKlingel',$strCurl);;\
}


Mit dem Reading des Dummy kann man dann weitere Aktionen ausführen.
In meinem Fall wird ein snapshot von einer IP-Cam gemacht

defmod CAMMOTION.not.02 notify HikKlingel:CallStatus_status:.ring {fhem ("get KlingelNeu image")}
attr CAMMOTION.not.02 addStateEvent 1


Vielen Dank noch einmal an alle.

Mit freundlichen Grüßen

Otto123

Da käme dann nochmal der Tipp von betateilchen zum tragen:  ;)
https://forum.fhem.de/index.php/topic,132443.msg1266047.html#msg1266047

Sonst hast Du die get Aufrufe alle im Log ...
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Shadow3561

Zitat von: Otto123 am 01 März 2023, 18:51:33
Da käme dann nochmal der Tipp von betateilchen zum tragen:  ;)
https://forum.fhem.de/index.php/topic,132443.msg1266047.html#msg1266047

Sonst hast Du die get Aufrufe alle im Log ...

Dem ist eben nicht so.
Ich weiss zwar nicht warum, könnte mir aber denken, dass es an json2reading liegt.
Das Log jedenfalls ist ruhig, zu Glück, denn den Tipp von betateilchen habe ich nicht so ganz verstanden und konnte leider weder bei Google noch hier im Forum etwas darüber finden.
Aber vielleicht magst du es ja ergänzen damit Suchende evtl. auf diesen Thread aufmerksam werden wenn sie nach ähnlichem suchen.

betateilchen

Zitat von: Shadow3561 am 01 März 2023, 18:46:31
Dummy definieren für das gewünschte Reading

Auf den dummy kann man auch getrost verzichten, wenn es nur darum geht, damit ein notify zu triggern.

Dann kannst Du das reading auch einfach in das at schreiben
json2reading('getKlingel',$strCurl)

und dann das notify darauf definieren - dabei kannst Du sogar komplett auf das fhem() verzichten:
defmod CAMMOTION.not.02 notify getKlingel:CallStatus_status:.ring get KlingelNeu image
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: Shadow3561 am 01 März 2023, 18:56:12
denn den Tipp von betateilchen habe ich nicht so ganz verstanden und konnte leider weder bei Google noch hier im Forum etwas darüber finden.

Das ist hier im Forum bereits (gefühlt) 728 mal erklärt.
Du musst den Aufruf der Funktion fhem() um einen zusätzlichen Parameter ergänzen.


fhem ("get KlingelNeu image",1)


Durch das ",1" werden Logausgaben aus der fhem() Funktion unterdrückt.

Aber wie schon geschrieben - in Deinem Fall brauchst Du fhem() überhaupt nicht.


---
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!