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

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

Vorheriges Thema - Nächstes Thema

Shadow3561

Ich komme nicht weiter.

Ich besitze eine Hikvision IP Video Doorbell.
Diese lässt sich leider nicht in FHEM einbinden und eine API kann ich auch nirgends finden.
Nach langem suchen habe ich es nun geschafft den Status der Klingeltaste per curl ab zu fragen.

Der Aufruf im Terminal lautet
curl -i --digest -u admin:password http://192.168.1.xxx/ISAPI/VideoIntercom/callStatus?format=json&channelType=tripartitePlatform

Die Ausgabe sieht so aus

Type=tripartitePlatform
[1] 138193
root@intelnuc:~# HTTP/1.1 401 Unauthorized
Date: Tue, 28 Feb 2023 19:21:00 GMT
Server: webs
Content-Length: 0
Connection: close
X-Frame-Options: SAMEORIGIN
Cache-Control: no-store
Pragma: no-cache
WWW-Authenticate: Digest qop="auth", realm="DS-4Dxxxxx", nonce="OTdlOWU3MGM5M2RhYTc5MDJkxxxxxxxxxx=", stale="false", opaque="", domain="::"
Content-Type: application/json

HTTP/1.1 200 OK
Date: Tue, 28 Feb 2023 19:21:00 GMT
Server: webs
Content-Length: 42
Connection: close
X-Frame-Options: SAMEORIGIN
Cache-Control: no-store
Pragma: no-cache
Content-Type: application/json

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


Ich benötige also den Status.

Leider lässt sich die Abfrage der URL nicht per HTTPMOD auslesen weil es mit der Authentifizierung nicht klappt, oder ich bin einfach zu dusselig.

Nun war mein Gedanke es mit folgenden Aufruf in FHEM zu versuchen

{qx(curl -i --digest -u admin:password http://192.168.1.xxx/ISAPI/VideoIntercom/callStatus?format=json&channelType=tripartitePlatform)}
eine Eingabe in der Kommandozeile schreibt auch eine Ausgabe ins LOG. Nun hätte ich es aber gerne in einem Reading von einem Dummy damit ich auf das event reagieren kann. und genau dort komme ich nicht weiter.

Wie stelle ich es an, dass der Status der Klingel in einem reading landet?

Ich hoffe auf eure Hilfe und bedanke mich im Voraus.

JoWiemann

#1
Hallo,

Du kannst das über ein userReadings machen. Allerdings glaube ich nicht, dass Dir das hilft. Der Aufruf über curl polled ja nicht, sondern ist nur ein Snapshot. Somit wirst Du das drücken der Taste eher nicht mitbekommen.

Grüße Jörg

PS: es gibt wohl auch ein SDK, Install Hikvision Device Network SDK. Viel habe ich dazu aber auch nicht gefunden: https://github.com/laszlojakab/hikvision-intercom-python-demo
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

Dafür habe ich ein "at" geplant was alle 30sec den Status triggert.

Das setzt allerdings voraus, dass ich es irgendwie schaffe den Status in ein Userreading zu bekommen. Daran hakt es leider

JoWiemann

Murphy sagt: der Taster wird immer gedrückt wenn das at wartet.
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

Aber Murphy weiss nicht, dass der Taster als gedrückt angezeigt wird, solange es Klingelt. Und die dauert 60sec. Da hat das at 1-2x die Gelegenheit ein klingeln zu erwischen.

JoWiemann

Ich bin jetzt nicht der httpmod Kenner. Eventuell mal im httpmod Thread die Frage nach dem richtigen Aufruf stellen.

Hast Du schon mal folgendes Probiert? Httpmod mit

http://admin:passwort@192.168.1.xxx/ISAPI/VideoIntercom/callStatus?format=json&channelType=tripartitePlatform

aufzurufen?

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

Otto123

#6
Zitat von: Shadow3561 am 28 Februar 2023, 19:28:50
Wie stelle ich es an, dass der Status der Klingel in einem reading landet?
das schreibt die IPv4 Adresse in einen Dummy
setreading Test IP {(qx(curl http://v4.ident.me))}
So kommt unnützes "Beiwerk" dazu (ich weiß nicht wozu Du den Parameter -i genommen hast?) setreading Test IP {(qx(curl -i http://v4.ident.me))}
Und so landet keine Statusmeldung (alle 30 sec :) ) im Log
setreading Test IP {(qx(curl -s http://v4.ident.me))}

Der Syntax für set(reading) steht in der commandref https://fhem.de/commandref_modular_DE.html#set

Aber das geht mit httputils auch anders / ohne blockierenden Shell Aufruf.
https://wiki.fhem.de/wiki/HttpUtils
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

betateilchen

Und wieder meine Frage: warum curl und nicht GetFileFromUrl() als FHEM-Bordmittel?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Shadow3561

Zitat von: betateilchen am 28 Februar 2023, 20:24:10
Und wieder meine Frage: warum curl und nicht GetFileFromUrl() als FHEM-Bordmittel?

Weil ich den Aufruf nicht verstehe. Irgendwie schaffe ich es nicht die Autorisierung mit einzubauen.
Die Anfrage mit User:pass@ip klappt leider bei der Klingel nicht nicht und gibt einen Fehler zurück.

Mit freundlichen Grüßen

Benni

Wenn ich es richtig sehe, ist die Anmeldung ja lediglich Basic Auth, das kann HTTPMOD doch auch:

Zitat
Handling sessions and logging in

In simple cases logging in works with basic authentication. In the case HTTPMOD accepts a username and password as part of the URL in the form http://User:Password@192.168.1.18/something

<...>

Dann sollte das mit folgender HTTMOD-Definition doch eigentlich funktionieren, sofern der im Eingangspost gezeigte Curl-Aufruf funktioniert hat:


defmod htKlingel HTTPMOD http://admin:ann-sophie@192.168.1.26/ISAPI/VideoIntercom/callStatus?format=json&channelType=tripartitePlatform 30
attr htKlingel enforceGoodReadingNames 1
attr htKlingel event-on-change-reading .*
attr htKlingel extractAllJSON 1


gb#

Shadow3561

ZitatDie Anfrage mit User:pass@ip klappt leider bei der Klingel nicht nicht und gibt einen Fehler zurück.


Zitat von: Benni am 01 März 2023, 07:10:46
Wenn ich es richtig sehe, ist die Anmeldung ja lediglich Basic Auth, das kann HTTPMOD doch auch:

Dann sollte das mit folgender HTTMOD-Definition doch eigentlich funktionieren, sofern der im Eingangspost gezeigte Curl-Aufruf funktioniert hat:



Otto123

#11
Zitat von: Shadow3561 am 01 März 2023, 05:38:22
Irgendwie schaffe ich es nicht die Autorisierung mit einzubauen.
Die Anfrage mit User:pass@ip klappt leider bei der Klingel nicht nicht und gibt einen Fehler zurück.
mMn ist der Unterschied: Im Aufruf mit curl -u werden Sonderzeichen weitgehend akzeptiert, ergo kann der Account z.B. eine Email Adresse sein (Sonderzeichen wie @ enthalten ) in der url müsste man alle Sonderzeichen "url codieren" - Beispiel: aus @ wird %40.
Gleiches gilt für Sonderzeichen im Passwort.

Siehe auch https://wiki.fhem.de/wiki/HttpUtils#GetFileFromURL
ZitatWICHTIG: Falls ein Username sowie Passwort übergeben werden, so müssen diese vorher jeweils mittels urlEncode() in URL-kompatible Form umgewandelt werden um Probleme mit evtl. enthaltenen Sonderzeichen zu vermeiden.
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

#12
Mit der Codierung der Sonderzeichen im Passwort (admin:xxx%2dxxxxx funktioniert es auch nicht.

Zurück kommt dann


"requestURL": "/ISAPI/VideoIntercom/callStatus",
"statusCode": 4,
"statusString": "Invalid Operation",
"subStatusCode": "badAuthorization",
"errorCode": 1073741827,
"errorMsg": "The user has not passed the authentication"
}





Otto123

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?
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

JoWiemann

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
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