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
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.
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 (https://api.leitstelle-tirol.at/RESOURCES) - vielleicht hilft das ja weiter...
...Danke
Scheint ein ganz normales basic auth zu sein. Probiere einfach mit https://User:Password@api.leitstelle-tirol.at/RESOURCES in der DEF des HTTPMODs
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...
Mit event-on-change-readings hast Du nur ein Event, wenn das Reading sich ändert.
Dann einfach ein notify, das darauf triggert
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)
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