NEWS
Logik zum Abfragen/Schreiben von Werten per REST-API
-
Hallo zusammen,
ich weiß aktuell nicht genau wie ich meine Logik umsetzen soll...
Ich habe einen UniPi am laufen welcher mir per REST-API Temperaturen zurückgeben kann. Weiterhin kann ich über die API auch 8 Relays schalten.Da ich die Temperaturen und auch Relays in meinen Skripten verwenden möchte, weiß ich aktuell noch nicht genau wie ich das am Besten machen soll...
Ich hatte vorher Pimatic im Einsatz, das gab es als IoBroker-Adapter und ich konnte in meinen Regeln einfach den Adapter verwenden. Da ich Pimatic grundsätzlich allerdings nicht so toll fande, habe ich mich doch wieder dagegen entschieden und würde das gerne selber per REST anbinden.
Zum Schluss würde ich gerne auch noch die Relays in meiner Visualisierung (vis) anzeigen (Relay an Ja/Nein?) und schalten können...
Ich stehe aktuell etwas auf dem Schlauch und würde mich freuen, wenn mir jemand ein paar Denkanstöße geben könnte.
Beste Grüße und Vielen Dank im Voraus,
Luk -
@th3g3ntl3man sagte: UniPi am laufen welcher mir per REST-API
Gibt es eine Beschreibung zur API?
-
@paul53
Hier ist die Dokumentation der API: https://evok-14.api-docs.io/1.11/Also ich hatte mir sowas vorgestellt, dass ich vielleicht ein Skript schreibe, welches mir bspw. alle 30 Sekunden die Werte per API holt und in selbstdefinierte Variablen schreibt, sodass ich diese in weiteren Skripten abfragen kann...
Wie ich allerdings bspw. die Relays vernünftig in den IOBroker bekomme, sodass ich sie bspw. auch in der Visualisierung anzeigen könnte, weiß ich noch nicht genau, da ich da eigentlich keine zeitliche Versetzung darin haben möchte...
-
@th3g3ntl3man sagte: Da ich die Temperaturen und auch Relays in meinen Skripten verwenden möchte
Laut Doku mittels "request":
var options = { method: 'GET', url: 'http://your-ip-goes-here:8080/json/ai/%7Bcircuit%7D', body: '{}' }; request(options, function (error, response, body) { if (error) throw new Error(error); console.log(body); });
Damit erst mal für die Temperaturen testen? Oder sind die Temperaturen über 1wire abzufragen?
-
@paul53
Vielen Dank schon mal für die schnelle Hilfe!!Ich glaube, dass ich kein Problem haben werde, die Skripte an sich zu schreiben, mir geht es eher um den "Best-Practice"-Ansatz.
Also um das Konzept die Daten zwischen dem IOBroker und dem UniPi sauber zu synchronisieren.Ein Beispiel, welches ich aktuell im Kopf habe:
Skript1: Holt alle Temperaturen des UniPis in einem Intervall von bspw. 30 Sekunden ab.
Skript2: Holt die Werte der Relays in einem Intervall von ca. 1-2 Sekunden ab, sodass ich diese in meiner Visualisierung direkt anzeigen kann, wenn diese geschaltet werden.
Skript3-X: Verwendet die Werte von Skript1 und reagiert mit entsprechenden Schaltungen im Homematic etc.Ich finde diesen Ansatz allerdings etwas "umständlich"(?) und weiß nicht ob man das vielleicht auch sauberer aufsetzen könnte...
Zumal weiß ich nicht wie performant das ist alle paar Sekunden die REST-Abfragen durchzuführen... -
@th3g3ntl3man sagte: Ich hatte vorher Pimatic im Einsatz
Wie wurde es damit gemacht (Intervalle)?
-
@th3g3ntl3man sagte in Logik zum Abfragen/Schreiben von Werten per REST-API:
@paul53
Vielen Dank schon mal für die schnelle Hilfe!!Ich glaube, dass ich kein Problem haben werde, die Skripte an sich zu schreiben, mir geht es eher um den "Best-Practice"-Ansatz.
Also um das Konzept die Daten zwischen dem IOBroker und dem UniPi sauber zu synchronisieren.Ein Beispiel, welches ich aktuell im Kopf habe:
Skript1: Holt alle Temperaturen des UniPis in einem Intervall von bspw. 30 Sekunden ab.
Skript2: Holt die Werte der Relays in einem Intervall von ca. 1-2 Sekunden ab, sodass ich diese in meiner Visualisierung direkt anzeigen kann, wenn diese geschaltet werden.
Skript3-X: Verwendet die Werte von Skript1 und reagiert mit entsprechenden Schaltungen im Homematic etc.Ich finde diesen Ansatz allerdings etwas "umständlich"(?) und weiß nicht ob man das vielleicht auch sauberer aufsetzen könnte...
Zumal weiß ich nicht wie performant das ist alle paar Sekunden die REST-Abfragen durchzuführen...- Sofern das System keine Push Benachrichtigung erlaubt wirst du um eine regelmässige abfrage nicht herum kommen.
- Ich würde an Stelle von "request" die JS Bibliothek "Axios" (https://www.npmjs.com/package/axios) einsetzen - da kannst du (wie in diesem Beispiel beschrieben) mit async / await arbeiten.
- um Überlappende Anfragen zu verhindern würde ich die regelmässigen Abfragen nicht über ein Intervall sondern eine sich selber verlängernde Kette von Timeouts lösen:
var DataTimeout; async function getData() { try { const resp = await axios.get('yourlink'); // handle your response } catch (err) { // Handle Error Here console.error(err); } DataTimeout = setTimeout(getData, 5000) } getData()
Kritisch sind bei schnellen Abfragen meiner Ansicht nach genau die überlappenden Anfragen, die entstehen können wenn das Netzwerk langsam ist oder der Server zeit benötigt die Anfrage zu beantworten. Ab welchem Intervall das kritisch ist hängt dabei von vielen Faktoren ab so das du das letztendlich wirst ausprobieren müssen.
Wichtig zu beachten ist in diesem Fall auch das es Sinnvoll sein kann Dir innerhalb des Skriptes eine Schattenkopie der Werte der Datenpunkte zu halten deren Quellen du in so schneller Folge abfragst. Dadurch kannst du das aktualisieren der Datenpunkte im ioBroker auf die Fälle begrenzen wo sich der Status geändert hat. Dieses gibt die Möglichkeit ohne den Haken "alle States bei Start abonnieren" zu arbeiten ohne das beim Eintragen der Werte zeitverzögerungen wegen der Notwendigkeit entstehen auf das Ergebnis von "getState" zu warten.
Der Ansatz die Aufgaben sauber zu trennen ist meiner Meinung nach sehr sinnvoll:
- Eine Ebene um die Werte bereitzustellen. (2 in Deinem Fall wegen der unterschiedlichen Intervalle)
- Eine Ebene um auf die Werte (deren Änderung, Aktualisierung) zu reagieren.
Das erlaubt es Dir auch für die beiden Ebenen unterschiedliche Logikmaschinen zu benutzen (JS, Blockly, Rules, NodeRed) - Jeweils immer die für die Aufgabe und Dein wissen bestgeeignete.
A.