https API Abfrage mit HTTPMOD

Begonnen von tyrolean, 16 November 2019, 15:21:04

Vorheriges Thema - Nächstes Thema

tyrolean

Hallo,

ich versuche nun schon seit einigen Stunden mit dem HTTPMOD Modul zureicht zukommen.
Konkret habe ich folgende Aufgabenstellung:

Ich würde gerne über eine kennwortgeschützte  API Seite (Bsp:  https://api.xxxxyyyyy.at) welche in der Kurzfassung so aussieht:

{
    "ID": "2001655309",
    "IDADDROBJ": "-703359930",
    "IDADDROBJHOME": "-703359930",
    "IDADDROBJORG": "-2001552613",
    "STATUS": "available_at_station",
    "STATUSINFO": null,
}


den "STATUS" auslesen und wenn er ungleich "available_at_station" it ein notify auslösen.
Ich gehe mal davon aus dass dies wenn ExtractAllJSON auf 1 gesetzt wird über die Readings möglich sein sollte jedoch scheitere ich leider schon am login.

Natürlich habe ich die Suche hier im Forum, Google und das FHEM Wiki zu Rate gezogen doch irgendwie stehe ich komplett auf der Leitung. Also bitte nicht mit Steinen werfen - obwohl ich es vermutlich verdient hätte  ;)
Wenn ich besagte Seite via Browser öffne (Safari) kommt sofort die Eingabeaufforderung für Benutzername und Passwort, den Seitenquelltext kann ich mir gar nicht anzeigen lassen.

Habt ihr einen Tipp wie ich den Benutzernamen bzw. das Kennwort "mitgeben" kann. Die Version Benutzer:Kennwort@https://api.xxxxyyyyy.at funktioniert leider nicht.


Gruß und Dank aus Tirol



amenomade

Das beste wäre, dein Internet Traffic zum api mit Burp zu loggen
Aber es könnte reichen, mit F12 im Browser zu protokollieren (Retier Netzwerk). Da wirst Du sehen, wo die "POST" Request mit login Daten gesendet wird, und dann kannst Du entspr. die login Attribute im HTTPMOD setzen.

Aber ohne weitere Infos, wird es schwierig, dir zu helfen.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

tyrolean

Hallo,

danke für die Antwort - mit F12 bin ich leider auch nich ausreichend weiter gekommen.
Burp habe ich zwar installiert, aber ehrlich gesagt nicht wirklich weiter gekommen.

Konkret geht es um die Seite https://api.leitstelle-tirol.at/RESOURCES - vielleicht hilft das ja weiter...

...Danke

amenomade

Scheint ein ganz normales basic auth zu sein. Probiere einfach mit https://User:Password@api.leitstelle-tirol.at/RESOURCES in der DEF des HTTPMODs
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

tyrolean

Vielen Dank,
so hat die Anmeldung perfekt funktioniert -sorry dass ich das nicht selbst gefunden habe.

Darf ich noch ganz frech fragen ob ihr eine elegante Möglichkeit kennt ein notify zu definieren, dass mir die Änderung eines bestimmten Readings anzeigt, möglichst ohne Zeitverzögerung...

amenomade

Mit event-on-change-readings hast Du nur ein Event, wenn das Reading sich ändert.
Dann einfach ein notify, das darauf triggert
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

tyrolean

Tausend Dank, das läuft ja einwandfrei.

Wenn das API mehrere Objekte beinhaltet (siehe z.Bsp. unten), gibt es da eine Möglichkeit genau eine  Eigenschaft (STATUS) vom letzten Objekt in der Reihe für das notify bzw. event-on-change-readings auszuwählen oder z.Bsp. über stateFormat den state des Device entsprechend zu setzen.

{
    "ID": "2001655309-11111",
    "IDADDROBJ": "-703359930",
    "IDADDROBJHOME": "-703359930",
    "IDADDROBJORG": "-2001552613",
    "STATUS": "available_at_station",
    "STATUSINFO": null,
}
{
    "ID": "2001655309-22222",
    "IDADDROBJ": "-703359930",
    "IDADDROBJHOME": "-703359930",
    "IDADDROBJORG": "-2001552613",
    "STATUS": "available_at_station",
    "STATUSINFO": null,
}
{
    "ID": "2001655309-3333",
    "IDADDROBJ": "-703359930",
    "IDADDROBJHOME": "-703359930",
    "IDADDROBJORG": "-2001552613",
    "STATUS": "alarmed",     #### um das geht es ####
    "STATUSINFO": null,
}


Übrigens, muss ich mir über die Performance meines FHEM's welches auf einen RPi 3 läuft Sorgen machen wenn ich die Abfrage alle 30 Sekunden mache.
(Das API beinhaltet jeweils so ca. 50 Objekte wie oben)

amenomade

#7
Wenn Du extractAllJSON gesetzt hast, solltest Du alle Readings haben. Wenn Du nur eins davon willst, dann definiere einfach nur reading01Name und reading01JSON Attribute

Wobei... wenn die Antwort nur so aussieht, wie Du es hieroben geschrieben hast, ist es kein gültiges JSON. Dann wird JSON Parsing nicht funktionieren, und Du musst mit Regex arbeiten. Unschön... aber z.B. wenn es immer nur 3 ID Blocks gibt:
attr <Name> reading01Name Status
attr <Name> reading01Regex (?s)STATUS".*?STATUS".*?STATUS":."(.*?)"
attr <Name> event-on-change-reading Status
attr <Name> stateFormat Status


EDIT: Wegen Performanz, könnte es gehen. Auf jeden Fall die aktuellste Version vom Modul benutzen. Die enthält die Korrektur eines Speicherlecks
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus