NEWS
on({id: ....mit timer kombiniert? Mehrfacher Aufruf??
-
Liebe Leute,
kurze Frage zur on-Funktion.
Ich möchte bei einer Leistungsmessung unter einem gewissen Wert einen Aktor ausschalten. Nachdem es aber beim Einschalten erst ein paar Sekunden braucht, bis die Leistung über diesem Wert ist, kommt eine timer-Funktion dazu, die nach 30 Sekunden schaut, ob der Wert noch immer darunter liegt.
Was passiert nun, wenn diese on-Funktion aber innerhalb dieser 30 Sekunden erneut ausgelöst wird? Rennt dann das Programm mehrmals parallel?
Wenn ja, kann man das irgendwie abfangen, dass die on-Funktion für diese Dauer gesperrt wird?Liebe Grüße
Tom -
@etv
Man stoppt bei Änderungen am DP zunächst den Timer, um ihn dann erneut zu starten. -
@etv das kannst du per se machen.. zuerst den laufenden stoppen dann neu starten
-
...leider JEIN...
Ich möchte eben den Timer NICHT stoppen, da ich ja das Gerät abdrehen will, wenn nach 30 Sekunden noch immer wenig Leistung gezogen wird.
Wenn ich jedes mal den Timer lösche und neu starte wird das Gerät nie abgedreht, da es ja quasi fertig ist und "nie mehr" mehr Leistung ziehen wird....
ABER, ich hab schon einen workaround gefunden
on({id: id_Scooter_Power, valLt: 4}, function (obj) { watt = obj.state.val; if (debug_scooter) {log('- - - - - - - - - - Scooter Charger: Leistungsänderung unter 4 Watt, nämlich: '+ watt +' W')} on_off_time = obj.state.lc; jetzt = parseFloat(Date.now().toFixed()); if (on_off_time < jetzt - 30000) { if (debug_scooter) {log('- - - - - - - - - - Scooter Charger: UND - es ist länger als 30 Sekunden EIN, daher wird abgedreht')} setState(id_Scooter_Switch, false) } });
Ich löse es, indem ich die Zeit vom letzten State Change analysiere....
Liebe Grüße
Tom -
@etv sagte in on({id: ....mit timer kombiniert? Mehrfacher Aufruf??:
da ich ja das Gerät abdrehen will, wenn nach 30 Sekunden noch immer wenig Leistung gezogen wird.
Du triggerst doch auf "ist kleiner als 4". Dann feuert der Trigger nur bei absteigender Flanke und das Einschalten spielt keine Rolle.
Trotzdem arbeitet man bei timeouts üblicherweise immer so, dass ein ggf. noch laufender Timer zunächst gestoppt wird.
Ich bin mir nicht sicher, aber ich denke dass sonst mehrere Instanzen parallel laufen.
Das gibt früher oder später Ärger. -
@codierknecht, danke für den Timer-Tipp!
Problem in diesem Fall ist, dass der Lader am Anfang unten herum dümpelt, bis er endlich mit dem Laden beginnt. Da grundelt er etwa 10-15 Sekunden eben unter 4 Watt herum (mal rauf, mal runter) und das hat mir den Scooter oft wieder abgedreht, bevor er noch zu laden begonnen hat....daher dieser nötige Hack.
Liebe Grüße
Tom -
@etv sagte in on({id: ....mit timer kombiniert? Mehrfacher Aufruf??:
Da grundelt er etwa 10-15 Sekunden eben unter 4 Watt herum (mal rauf, mal runter)
OK, das klingt schwierig
-
Alternative:
on({id: id_Scooter_Power, change: "ne"}, async function (obj) { var watt = obj.state.val; (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); if (watt < 4) { timeout = setTimeout(async function () { setState(id_Scooter_Switch, false); }, parseInt(30000)); } });
So reagiert der Trigger auf jede Änderung der Leistung.
Zuerst wird ein ggf. laufender Timer gelöscht.
Ist die Leistung < 4 W, starten die 30 Sekunden.
Ändert sich die Leistung innerhalb der 30 Sekunden, geht's von vorne los.
Ändert sich die Leistung beim Einschalten von z.B. 3 auf 100 W, wird ein ggf. laufender Timer gelöscht und nix passiert.Einziges Problem hierbei: Wenn der Scooter nach dem Laden immer noch innerhalb von 30 Sekunden "rumdümpelt", wird er nie abgeschaltet
-
@etv sagte in: beim Einschalten erst ein paar Sekunden braucht, bis die Leistung über diesem Wert ist
on({id: id_Scooter_Power, valLt: 4, oldValGe: 4}, function (obj) {
-
@paul53
Cool - das wandelnde Programmierhandbuch hat wieder zugeschlagen