NEWS
Script triggert nicht bei Temperaturänderung
-
Hallöchen, ich habe ein Script erstellt, dass soll bei einer Temperatur von 25 Grad auslösen und eine Markisse hochfahren.
Das Script soll auch bei Regen den Behang Runter fahren. Abend nach vor eingestellter Zeit soll der Behang ebenfalls Runter fahren.
Grundsätzlich funktioniert das Script. Schließen klappt. Bei Temperatur hochfahren auch, aber nur wenn ich zuvor im Script-Editor das Script neu gestartet habe. Könnte sich jemand mal das Script bitte anschauen?. Danke/*****Steuerung Markisse Pool Kopf******************************************* ** April 2020 ** TAHOMA ** 0 = OBEN, 100 = UNTEN, Nr 0= OBEN, Nr 1 = UNTEN ** ** geä: ********************************************************************************/ const idRollo = 'tahoma.0.devices.Pool_Kopf.states.core:DeploymentState'; const idAnwesend = 'javascript.0.Anwesenheitssteuerung.Userlist.JemandDa'; const idAuto = 'javascript.0.Garten.Zeitsteuerung.PoolK.AutoTemp'; // Automatik const idNr = 'javascript.0.Garten.Zeitsteuerung.PoolK.Nr'; // Wert zur Steuerung Widgets const idPosK = 'tahoma.0.devices.Pool_Kopf.states.core:DeploymentState'; const idRStunde = "javascript.0.Garten.Zeitsteuerung.PoolK.R_stunde"; const idRMinute = "javascript.0.Garten.Zeitsteuerung.PoolK.R_minute"; const idTemp = 'hm-rpc.2.0010D8A98AD479.1.ACTUAL_TEMPERATURE'; // Temperatur Poolbereich const idSW_Temp = 'javascript.0.Garten.Zeitsteuerung.PoolK.SW_Temp'; // Auslösewert'; // Temperatur Poolbereich const idAutoR = "javascript.0.Garten.Zeitsteuerung.PoolK.AutoR"; const idRegen = 'hm-rpc.0.OEQ0996444.1.STATE'; // Status Regen var Anwesend = getState(idAnwesend).val; var RolloStatus = getState(idRollo).val; var R_stunde = getState(idRStunde).val; var R_minute = getState(idRMinute).val; var AUTO = getState(idAutoR).val; var AutoTemp = getState(idAuto).val; var IstTemp = getState(idTemp).val; var Nr = getState(idNr).val; var SW_Temp = getState(idSW_Temp).val; var Regen = getState(idRegen).val; var schedAuf, schedRunter, text, Pos, Status; console.log(Regen); //Rollo POS/Nr festlegen (Nr.0 oder Nr.1) schedule("* * * * *", function () { if (getState(idRollo).val == 0) { setState('javascript.0.Garten.Zeitsteuerung.PoolK.Nr', 0); } else { setState('javascript.0.Garten.Zeitsteuerung.PoolK.Nr', 1); } }); function StatusK() { Pos = getState(idRollo).val; if (Pos == 0) { Status = "OBEN" setState(idNr, 0);//EINGEFAHREN } else { Status = "UNTEN" setState(idNr, 1);//AUSGEFAHREN }; return Status; }; schedule("* * * * *", function () { console.log("----STATUSINFO ZUR MARKISSE POOL KOPF----"); console.log("-> Automatik ist: " + AutoTemp); console.log("-> Auto Schließen: " + AUTO); console.log("-> Auto Schließen um: " + R_stunde + ":" + R_minute); console.log("-> Jemand im Haus: " + Anwesend); console.log("-> Regnet es? " + Regen); console.log("-> Ist Temp: " + IstTemp + " °C"); console.log("-> Stellwert Temp: " + SW_Temp + " °C"); console.log("-> Markisse Pool Kopf: " + StatusK()); console.log("-> Status für Widget: " + Nr); console.log("--------------------------------"); }); function Aktion(pos) { if (getState(idAuto).val == true) { setState(idRollo, pos); if (pos) console.log("*****Markisse PoolK fährt Runter***** "); else console.log("*****Markisse PoolK fährt Rauf***** "); } }; //PoolK RUNTER schedule({ hour: R_stunde, minute: R_minute }, RunDailyDown); function RunDailyDown() { if (AUTO == true) { Aktion(100); setState('javascript.0.Garten.Zeitsteuerung.PoolK.Nr', 1); text = '\u2b07\ufe0f Pool Kopf '; createEventlog("RUNTER", text); } }; //PoolK RegenRunter on({ id: "hm-rpc1.OEQ0996444.1.STATE", change: "any" }, function (obj) { if (Regen == 1) { Aktion(100); setState('javascript.0.Garten.Zeitsteuerung.PoolK.Nr', 1); text = '\u2b07\ufe0f REGEN Pool Kopf '; createEventlog("RUNTER", text); } }); on({ id: "hm-rpc.2.0010D8A98AD479.1.ACTUAL_TEMPERATURE", change: "gt" }, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (IstTemp >= SW_Temp) { Aktion(0); setState('javascript.0.Garten.Zeitsteuerung.PoolK.Nr', 0); text = '\u2b06\ufe0f Temp Markisse Pool Kopf '; createEventlog("AUF", text) } });
Gruß Michael
-
@michihorn
IstTemp wird nur einmal bei Script-Start gesetzt. Ändere Zeile 100 und lasse Zeilen 101 bis 103 (+108) weg:on({ id: idTemp, valGe: SW_Temp, oldValLt: SW_Temp}, function () {
-
@paul53 Vielen Dank hab das so geändert, mal morgen abwarten.
Kannst du noch mal über den Teil "Regen" schauen, ob das noch zu optimieren wäre?EDIT: Hochfahren nach Temperatur hat schon mal heute geklappt.
Danke
Michael -
@michihorn sagte:
on({ id: "hm-rpc1.OEQ0996444.1.STATE", change: "any" }, function (obj) { if (Regen == 1) {
Weshalb Trigger auf change: "any" ?
Die Variable Regen wird nur bei Script-Start gesetzt.on(idRegen, function(dp) { Regen = dp.state.val; if(Regen) {
Auch die Variable AUTO wird nur bei Script-Start gesetzt. Es fehlt ein Trigger, der sie aktualisiert.
Du verwendest 2 identische Schedules (jede Minute). Fasse die minütlichen Aktionen in einem Schedule zusammen.
Wo ist die Funktion createEventlog() deklariert ?
-
@paul53 Hallo Paul
folgendes Script ist in "GLOBAL" deklariertcreateState("javascript.0.SystemEventList"); createState("javascript.0.SystemEventList.EventList"); createState("javascript.0.SystemEventList.NextEventid"); const EventListDestination = "javascript.0.SystemEventList."; function createEventlog(EventType, EventText) { let EventList = getState(EventListDestination + "EventList").val; let EventId = getState(EventListDestination + "NextEventId").val; let EventDateTime = formatDate(getDateObject((new Date().getTime())), "TT.MM.JJ - hh:mm:ss"); EventId = EventId + 1; setState(EventListDestination + "NextEventId", EventId); let FormatedEventId = ("00000" + EventId).slice(-5); let EventLog = FormatedEventId + " -- " + EventDateTime + " --- " + EventType + " - " + EventText; EventList = EventLog + "<br>" + EventList; setState(EventListDestination + "EventList", EventList); };
Michael
-
@paul53 Das Ereignis Regen sollte dynamisch sein, daher das "any".
Bei jeder Zustandsänderung des Sensor DP sollte getriggert werden und dann festgestellt werden ob 1 oder 0.