NEWS
[gelöst] Refresh eines externen Systems
-
Hallo,
ich möchte meine in ioBroker vorhandenen Tür- und Fensterkontakte nutzen um meine Heizung zu deaktivieren, so lange das Fenster offen ist.
Das geht per HTTP Request, in dem ich die Zieltemperatur in dem betroffenem Raum heruntersetze. Konkret wird dabei in der Heizungssteuerung ein weiterer Offset erzeugt, der Einfluss auf die Zieltemperatur hat.
Leider hat dieser nur eine Lebenszeit von 10 Minuten und muss dann erneuert werden.Mir fehlt hier zur Zeit der gedanklich richtige Ansatz. Bei Öffnen eines Fensters einen Trigger zu starten und dann den HTTP - Request zu senden.
Aber nun muss dieser Request alle 10 Minuten wiederholt werden, solange das Fenster noch offen ist.
Ich habe schon überlegt mit SetStateDelayed rekursiv das an zu gehen, bin mir aber nicht sicher, ob es eine elegantere Variante gibt.Wie löse ich das am besten in Javascript? Kann ich einen 10minütigen Timer starten, solange ein Fenster offen ist?
Vielen Dank im Voraus
-
@Gwenselah sagte:
Kann ich einen 10minütigen Timer starten, solange ein Fenster offen ist?
Ja, mit setInterval(callback, cycle).
-
Ich habe ein ähnliches Szenario. Ich will dass nach 30 Sekunden mein Licht ausgeschaltet wird, außer der Bewegungsmelder erkennt weiterhin Bewegung. Das prüfe ich alle 30 Sekunden. Vielleicht hilft dir mein Skript:
on({id: 'hm-rpc.2.00091569950FCC.1.MOTION', change: "ne"}, function (obj) { //Licht einschalten setState("hue-extended.0.groups.002-flur_vorne.action.on", true); //Prüfe alle [checkInterval] Sekunden auf weitere Bewegung checkNoFutherMovement(); }); function checkNoFutherMovement(){ //Bewegungsmelder wieder scharf schalten setState('hm-rpc.2.00091569950FCC.1.RESET_MOTION', true); var nextMovementCheck = new Date(); nextMovementCheck.setSeconds(nextMovementCheck.getSeconds() + checkInterval); var hrs = nextMovementCheck.getHours(); var mins = nextMovementCheck.getMinutes(); var secs = nextMovementCheck.getSeconds(); //console.log("Next Check: " + hrs + ":" + mins + ":" + secs); //Prüfe in [checkInterval] Sekunden ob noch Bewegung vorhanden ist schedule({hour: hrs, minute: mins, second: secs}, function(){ if( getState("hm-rpc.2.00091569950FCC.1.MOTION").val == true ){ checkNoFutherMovement(); } else { flurlichtAusschalten(); } } ); } function flurlichtAusschalten(){ setState("hue-extended.0.groups.002-flur_vorne.action.on", false); }
-
Vielen Dank für die Anregungen, ich werde diese in mein Script einfließen lassen.
-
-
@Mephist0 sagte in Refresh eines externen Systems:
var nextMovementCheck = new Date();
Das ist einfach ein Zahlenwert in Sekudnen. Da du alle 10 Minuten prüfen willst, sähe es bei dir so aus:
var nextCheck = new Date(); nextCheck.setMinutes(nextCheck.getMinutes() + 10); var hrs = nextCheck.getHours(); var mins = nextCheck.getMinutes(); (...)
-
Hallo,
ich hab es in meinem Luftbefeuchter-Script so gelöst:
var myPowerInterval = null; //.... if (isOutletOn) { if (myPowerInterval) clearInterval(myPowerInterval); myPowerInterval = setInterval(function(){ var currentWatt = getState('sonoff.0.Gesund Steckdose 2.ENERGY_Power').val; setState('0_userdata.0.Automation.Luftbefeuchtungsscript_Wohnzimmer.StatusFault', (currentWatt < 10)); },11000); } else if (myPowerInterval) clearInterval(myPowerInterval);
Gruß Tim
-
Ich hab dazu noch einen Verständnisfrage. Wie verhält sich die TimerVariable "myPowerInterval" bei mehrfachen Aufrufen?
Ein Beispiel basierend auf dem Script von tictaki:function TueIrgendwas (Raum){ var myPowerInterval = null; if (isOutletOn) { if (myPowerInterval) clearInterval(myPowerInterval); myPowerInterval = setInterval(function(){ setState(Raum, "-5"); },11000); } else if (myPowerInterval) clearInterval(myPowerInterval); } on {(TriggerRaum1),function(){ TueIrgendwas("Raum1"); } on {(TriggerRaum2),function(){ TueIrgendwas("Raum2"); }
Übersteht die Variable myPowerInterval (bzw. deren Inhalt) von Aufruf "Raum1" den Aufruf durch "Raum2"? (Sind die Aufrufe von TueIrgandwas von einander gekapselt?)
Oder benötige ich für jeden Raum eine eigene Variable? -
@Gwenselah
Hallo,die Variable myPowerInterval muß fürs Skript (global, außerhalb einer Funktion) deklariert werden.
var myPowerInterval = null; function TueIrgendwas (Raum){ ...
Aber die gilt nur für 1 gleichzeitigen Timer. Du benötigst für jeden Raum eine eigene. Mein Vorschlag:
var myPowerInterval = [null,null]; function TueIrgendwas (Raum, index){ if (isOutletOn) { if (myPowerInterval[index]) clearInterval(myPowerInterval[index]); myPowerInterval[index] = setInterval(function(){ setState(Raum, "-5"); },11000); } else if (myPowerInterval[index]) clearInterval(myPowerInterval[index]); } on {(TriggerRaum1),function(){ TueIrgendwas("Raum1", 0); } on {(TriggerRaum2),function(){ TueIrgendwas("Raum2", 1); }
Gruß Tim
-
@ticaki
Auf Grundlage Deines Vorschlags habe ich nun mein Script entwickelt. Vielen Dank für Deine Hilfe.
Man muss nur aufpassen, dass SetIntervall erst mit dem Delay beginnt und dann die Funktion ausführt.