NEWS
Intervall zur Datenabfrage festlegen
-
Ich bin dabei einen neuen Adapter zu entwickeln.
Funktionsweise:
- Er fragt von einem Solarmax Wechselrichter über TCP Daten ab.
- Die Werte werden in ein array geschrieben
Die Werte kann ich im Log ausgeben lassen:
Ziel ist aber natürlich, dass die Werte in einem bestimmen, festzulendem Abstand abgefragt werden.
Ich habe mir auf Github den Code einiger Adapter angesehen, werde aber nicht schlau draus.
Der gesamte code für den Adapter ist hier zu finden:
https://github.com/SimonBard/iobroker.solarmax -
@godlich2019
Hi goldich2019,habe bei meinem Adapter einen Abnfrageintervall eingebaut.
https://github.com/Schnup89/ioBroker.eq3-Thermostat/blob/master/main.js
Beachte folgende Zeilen:
12
97-99
187
190Die Timer wird immer neu gestartet sobald die Funktion einmal durch ist.
Gruß
Schnup -
@Schnup89 sagte in Intervall zur Datenabfrage festlegen:
Beachte folgende Zeilen:
Die Timer wird immer neu gestartet sobald die Funktion einmal durch ist.Besten Dank! Von jemandem, der das gleiche hier sucht sollte noch Zeile 80 beachtet werden, da wird die Funktion in der onReady aufgerufen.
-
Also ich bekomme es nicht korrek auf die Reihe.
Es gibt bei mir keine Updates. Muss ich da nicht noch per
setTimeout(function, milliseconds)
sagen, dass die OnReady Funktion oder was anderes aufgerufen werden soll?
Bei Dir wird ja dann in fEQ3Update die Funktion fUpdateDevObj aufgerufen. Da werden aber nur states gesetzt, aber warum sollte sich der state zwischenzeitlich geändert haben?
-
[EDIT 13:48Uhr]
-> Hab mir gerade deinen Code angesehen, sieht gut aus, gibt die mal eine log-NAchricht aus vor Zeile 226 (lib.query(['PAC']);) zum schauen ob der Timer anständig läuft.Simmt, die Zeile 80 hab ich vergessen zu erwähnen, sorry.
Der erneute Aufruf findet in der Funktion fEQUpdate in Zeile 190 statt.
Hast du die Variable "this.config.inp_refresh_interval" ersetzt?Ich würde eine eigene Funktion schreiben, nicht die OnReady wiederholt aufrufen!
Hier nochmal Zusammengefasst:
let tmr_Datenabfrage = null; let nCounter = 0; async onReady() { [...] this.fDatenabfrage(); [...] } fDatenabfrage() { [...] tmr_Datenabfrage = setTimeout(() =>this.fDatenabfrage(),1000); // Sich selbst aufr. nCounter = nCounter +1; this.log.info(nCounter.toString()); [...] }
-
@Schnup89 Vielen Dank! Das hat soweit geklappt.
Eine Sache noch: Ich stelle ja beim Start des Adapters eine Verbindung her, dann wird alle X s eine Abfrage an den Wechselrichter gestellt.
Die Verbindung sollte aber jeden Morgen wieder hergestellt werden, lässt sich das auch irgendwie steuern?
-
Super dass es geklappt hat
Du könntest in der Main.js node-schedule nutzen.
Nach Zeile 14 das Modul laden:
var schedule = require('node-schedule');
Ab Zeile 132 (nach dem subscribe am Ende der onReady-Funktion folgendes einfügen:
const frueh = schedule.scheduleJob({hour: 05, minute: 30}, () => { this.log.info('Baue jetzt um 05:30 Uhr Verbindung neu auf'); try { await lib.init(this, '192.168.178.6', 12345); this.log.info('Adapter wurde gestartet'); } catch (error) { this.log.error(error); this.log.info('Adapter start failed'); } });
Mit einem lib.init wird laut deiner Lib-Funktion die Verbindung vorher geschlossen (__disconnect), dann sollte das passen.