NEWS
Watchdog für Alter der Datenpunkte
-
@paul53 said in Watchdog für Alter der Datenpunkte:
@sts85 sagte: In dem Intervall bleibt die Nachricht gleich.
Poste bitte den erzeugten Javascript-Code ohne die letzte Zeile in Code tags.
Vermutung: Es gibt zwei VariablenIntervall
?Du hattest Recht, es gab zwei Variablen Intervall. Ich habe die Variable gelöscht. Die Intervall-Bausteine ebenfalls gelöscht und neu eingefügt. Danach die "richtige" Intervall-Variable gewählt. Nun habe ich das:
var ids, id, intervalle, idx, Intervall, msg; function listsRepeat(value, n) { var array = []; for (var i = 0; i < n; i++) { array[i] = value; } return array; } // Beschreibe diese Funktion … async function getName(id) { return getObject(id).common.name; } ids = Array.prototype.slice.apply($("state[id=*](functions=watchdog)")); intervalle = listsRepeat(null, ids.length); schedule("*/2 * * * * *", async function () { for (var id_index in ids) { id = ids[id_index]; idx = ids.indexOf(id) + 1; Intervall = intervalle[(idx - 1)]; if (parseFloat((new Date().getTime())) - getState(id).ts <= 900000) { (function () {if (Intervall) {clearInterval(Intervall); Intervall = null;}})(); } else if (!Intervall) { msg = 'Sensorwert zu alt: ' + String(await getName(id)); console.log(msg); Intervall = setInterval(async function () { console.log(msg); }, 6000); } intervalle[(idx - 1)] = Intervall; } });
Das Ergebnis ist aber dasselbe?!
Edit: Die timings sind nur für debugging-Zwecke
-
@sts85 sagte: Das Ergebnis ist aber dasselbe?!
Gerade getestet: Du hast recht. Erklären kann ich mir das Verhalten aber nicht.
-
@paul53
msg muss als 3. Parameter an die interne Intervall Funktion übergeben werden. Das geht doch auch bei seinterval? -
@ticaki sagte: msg muss als 3. Parameter an die interne Intervall Funktion übergeben werden.
Gerade getestet: Funktioniert auch nicht.
-
-
@ticaki sagte: function(msg)
Damit funktioniert es. Ist aber keine Option für Blockly?
-
@paul53
Statt der Intervall reference die Nachricht im Array speichern mit nur einem Intervall der das Array überprüft und die Nachricht verschickt? -
Danke euch.
So schnell kommt man an die Grenzen von Blockly - ich dachte nur, ich hab was grundlegend nicht verstanden.
Zur Not muss ich das direkt in Javascript umsetzen, nur bin ich mit der Programmiersprache nicht vertraut, auch wenn grundlegende Programmierkenntnisse vorhanden sind. -
@ticaki said in Watchdog für Alter der Datenpunkte:
@paul53
Statt der Intervall reference die Nachricht im Array speichern mit nur einem Intervall der das Array überprüft und die Nachricht verschickt?Den Ansatz hatte ich auch eben, hab es aber in Blockly noch nicht so schnell umgesetzt bekommen.
Dann kommen alle betroffenen Meldungen immer gemeinsam, das wäre aber vollkommen OK. -
Ob es elegant ist, sei dahingestellt, aber so geht es:
var ids, id, intervalle, messages, idx, Intervall, msg, i, idm, message_there; function listsRepeat(value, n) { var array = []; for (var i = 0; i < n; i++) { array[i] = value; } return array; } // Beschreibe diese Funktion … async function getName(id) { return getObject(id).common.name; } ids = Array.prototype.slice.apply($("state[id=*](functions=watchdog)")); intervalle = listsRepeat(null, ids.length); messages = listsRepeat(null, ids.length); schedule("*/2 * * * * *", async function () { for (var id_index in ids) { id = ids[id_index]; idx = ids.indexOf(id) + 1; Intervall = intervalle[(idx - 1)]; messages[(idx - 1)] = 'Sensorwert zu alt: ' + String(await getName(id)); msg = messages[(idx - 1)]; if (parseFloat((new Date().getTime())) - getState(id).ts <= 900000) { (function () {if (Intervall) {clearInterval(Intervall); Intervall = null;}})(); messages[(idx - 1)] = null; } else if (!Intervall) { console.log(msg); Intervall = setInterval(async function () { for (var i_index in ids) { i = ids[i_index]; idm = ids.indexOf(i) + 1; message_there = intervalle[(idm - 1)]; if (message_there != null) { console.log(('Sensorwert zu alt: ' + String(await getName(i)))); } } }, 6000); } intervalle[(idx - 1)] = Intervall; } });
Danke euch nochmals!
Edit: Kleiner Denkfehler, jetzt werden natürlich nich mehrere Intervalle ausgelöst...
-
Dein jetziges Script verschickt sensorenanzahl^2 Meldungen im Höchstfall alle 6 Sekunden. Oder?
-
Haha, siehe edit. Hab ich auch gerade gemerkt. Ich darf hier natürlich nur einen Intervall nutzen.
-
@sts85
Als Nächstes dann draus eine Nachricht bilden die du dir bei Änderungen per Telegramm selbst zu schickst.Z.B
️ Warmwassershelly hat sich seit 01:00:00 nicht mehr aktualisiert(Hier fieses grinse smiley einsetzten)
-
@sts85 sagte: Ich darf hier natürlich nur einen Intervall nutzen.
Ja, etwa so:
-
@paul53 said in Watchdog für Alter der Datenpunkte:
@sts85 sagte: Ich darf hier natürlich nur einen Intervall nutzen.
Ja, etwa so:
Perfekt, super, läuft 1A.
Hatte eben auch schon was gebastelt, aber dies ist hier noch ein wenig eleganter. Nur deine Zähl-Schleife habe ich durch eine "für jeden Wert" Schleife ersetzt.
Einiges gelernt...
Nochmals vielen Dank euch allen! 🥳