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