NEWS
[Vorlage] Variable Zeitsteuerung mit VIS Editor
-
Habe ein kleines Update hochgeladen.
Mir war gestern aufgefallen, dass die Anzeige des nächsten Timers bei einem bestimmten Fall fehlerhaft war (wenn mehrere Timer anstehen, aber keiner davon am "heutigen" Tag). Habe die Funktion korrigiert, diese könnt ihr einfach in euren Skripten ersetzen:
// Zeigt alle kommenden Timer in Liste (optimiert für DropDown-Liste) function nextTimer(){ var TimerJSON = JSON.parse(getState("javascript.0.Timer." + path + ".TimerJSON").val); var timeStamp, checkTime, firstKey, splitKey, newKey; var allTimer = {}; Object.keys(TimerJSON).forEach(function(key) { for(var i = 1; i <= length(TimerJSON[key]); i++) { // Hier werden alle Timer durchlaufen if (TimerJSON[key][i].Aktiv && TimerJSON[key][i].ConditionsTrue){ // Timer ist Aktiv und Bedingungen sind erfüllt var tmp = TimerJSON[key][i].CronTage.split(","); for(var j = 0; j < tmp.length; j++) { tmp[j] = (tmp[j] == 0 ? 7 : tmp[j]); timeStamp = tmp[j] + " " + TimerJSON[key][i].Zeit; if (showValues){ if (allTimer.hasOwnProperty(timeStamp)) {allTimer[timeStamp] += ", " + key + " (" + TimerJSON[key][i].Sollwert + ")"} else {allTimer[timeStamp] = key + " (" + TimerJSON[key][i].Sollwert + ")";} } else { if (allTimer.hasOwnProperty(timeStamp)) {allTimer[timeStamp] += ", " + key} else {allTimer[timeStamp] = key;} } } } } }); var allTimerLength = length(allTimer); var d = new Date(); var actDay = (d.getDay() == 0 ? 7 : d.getDay()); var actTime = ('0' + d.getHours()).slice(-2) + ":" + ('0' + d.getMinutes()).slice(-2); var actTimeStamp = actDay + " " + actTime; if (allTimerLength == 0){ setState("javascript.0.Timer." + path + ".NextDevice", "Keine Timer"); setState("javascript.0.Timer." + path + ".NextDevices", "Keine Timer"); } else if (allTimerLength == 1){ firstKey = Object.keys(allTimer)[0]; splitKey = firstKey.split(" "); newKey = TageJSON[splitKey[0]] + " " + splitKey[1]; setState("javascript.0.Timer." + path + ".NextDevice", newKey + " - " + allTimer[firstKey]); setState("javascript.0.Timer." + path + ".NextDevices", newKey + " - " + allTimer[firstKey]); } else { firstKey = ""; var listBefore = ""; var listAfter = ""; var listComplete = ""; Object.keys(allTimer).sort().forEach(function(key) { if (key > actTimeStamp){ if (firstKey == "") {firstKey = key}; splitKey = key.split(" "); newKey = ( parseInt(splitKey[0]) == actDay ? "" : TageJSON[splitKey[0]]) + " " + splitKey[1]; listAfter += newKey + " - " + allTimer[key] + ";" ; } else { splitKey = key.split(" "); newKey = TageJSON[splitKey[0]] + " " + splitKey[1]; listBefore += newKey + " - " + allTimer[key] + ";" ; }; }); listComplete = listAfter + listBefore; setState("javascript.0.Timer." + path + ".NextDevice", listComplete.split(";")[0]); setState("javascript.0.Timer." + path + ".NextDevices", listComplete.slice(0, listComplete.length - 1)); } }
Habe ansonsten noch alle Subscribes in Funktionen gepackt, und deren Ausführung am Ende der Main Funktion verzögert eingefügt. Somit entstehen nun nur noch zwei Fehler nach der ersten Ausführung des Skripts (also wenn noch keine States erstellt wurden). Wollte die Fehler eigentlich komplett eliminieren aber die letzten Beiden sind iwie sehr zäh
-
Und noch ein Update hinterher: Keine neue Funktionalität, aber höherer Komfort.
- Die Sollwerte-Auswahl im PopUp wird entsprechend der hinterlegten Devices angezeigt. Ist es ein Boolean Device (true/false), wird in der Auswahl nur An/Aus zur Auswahl dargestellt.
- Wenn kein boolean, dann wird der Rest angezeigt (Zahlenwerte + Auf/ab)
Theoretisch könnte ich diese Auswahl auf für die Bedingungen vorgeben. Besteht hierbei Interesse?
Bei den Bedingungen hatte ich Vorgaben bisher nicht integriert, damit diese möglichst frei genutzt werden können.Für das Update in bestehende Skripte würde ich empfehlen komplett neu zu importieren. Auch das PopUp!
Einfacher Import:
Nur Skript-Inhalt unter Zeile 40 kopieren und im eigenen Skript alles unter Zeile 40 damit ersetzen. Es kamen oben keine neuen Variablen dazu, daher bleiben eure Voreinstellungen davon unberührt. -
@GiuseppeS sagte in [Vorlage] Variable Zeitsteuerung mit VIS Editor:
Und noch ein Update hinterher: Keine neue Funktionalität, aber höherer Komfort.
- Die Sollwerte-Auswahl im PopUp wird entsprechend der hinterlegten Devices angezeigt. Ist es ein Boolean Device (true/false), wird in der Auswahl nur An/Aus zur Auswahl dargestellt.
- Wenn kein boolean, dann wird der Rest angezeigt (Zahlenwerte + Auf/ab)
Update durchgeführt , Werte der DropDown-Liste werden je nach Aktor erfüllt .
Wie immer ….Frage ……., bei den Updates muss ich immer händisch die Werte ändern , könntest du es nicht mit reinnehme , dann ist es kompatibel mit @Mic Log Script .
.
.
-
@Glasfaser
Wie verwendest du denn die Zusatzangaben "Timer: " und "+++ " zur Filterung im Log-Script?
Evtl. geht es auch ohne diese Zusätze, wenn du auf den Script-Namen alleine filterst.
Also falls GiuseppeS dies nicht in sein Script einbaut, Zusatz-Strings zur Logausgabe zu ermöglichen.@GiuseppeS - nur nebenbei: vielen Dank für deine tolle Arbeit , ich setze dein Script zwar noch nicht ein, aber werde ich bald machen
-
@Mic sagte in [Vorlage] Variable Zeitsteuerung mit VIS Editor:
@Glasfaser
Wie verwendest du denn die Zusatzangaben "Timer: " und "+++ " zur Filterung im Log-Script?
Evtl. geht es auch ohne diese Zusätze, wenn du auf den Script-Namen alleine filterst.
Also falls GiuseppeS dies nicht in sein Script einbaut, Zusatz-Strings zur Logausgabe zu ermöglichen.Ich benutze nur die "+++ " anstatt " Timer: " zum Filtern in meiner Liste
{ id: 'javascript', filter_all: ['+++'], filter_any: [''], blacklist: ['Error'], clean: ['script.js.Timer.Rollladen.Timer_Rollladen_EG:','script.js.Timer.Aktor.Timer_Aktor:','script.js.Timer.Rollladen.Timer_Rollladen_OG:','.LEVEL','.STATE','script.js.Fritzbox.QRCode:','Timer.Außen.Steckdose_Carport_prüfen_und_aus:','script.js.Synology.Backup1: ','script.js.Synology.Backup2: ','script.js.Homematic_CCU.Gartenbeleuchtung_an_aus:','script.js.Kalender_Zeit.Astrocheck_Dusk:','script.js.Kalender_Zeit.Astrocheck_Sunset:','+++ ',' +++'], columns: ['date','msg'], },
-
@Glasfaser
Ich kann die Variable einbauen. Würde sie "logPraefix" taufen und in die Log-Ausgabe einbinden.
Da sich die Variable im Bereich der erweiterten Optionen befinden wird, sehe ich keine Probleme für Nutzer der Script-Kategorie "Anfänger".
Werde ich nachher schnell einbinden...@Mic
Kann die netten Worte nur zurückgeben. Habe selbst des öfteren von deinem Script gehört und werde es auch demnächst einsetzen -
@GiuseppeS sagte in [Vorlage] Variable Zeitsteuerung mit VIS Editor:
@Glasfaser
Ich kann die Variable einbauen. Würde sie "logPraefix" taufen und in die Log-Ausgabe einbinden.
Da sich die Variable im Bereich der erweiterten Optionen befinden wird, sehe ich keine Probleme für Nutzer der Script-Kategorie "Anfänger".
Werde ich nachher schnell einbinden...Ja danke … muß nicht sofort sein , kannst Du demnächst mal in einem Update mit einbinden !
@GiuseppeS sagte in [Vorlage] Variable Zeitsteuerung mit VIS Editor:
@Mic
Kann die netten Worte nur zurückgeben. Habe selbst des öfteren von deinem Script gehört und werde es auch demnächst einsetzenDito …..., deshalb mache ich hier Werbung
-
@Glasfaser
Danke Ich will diesen Thread nicht übernehmen, falls mehr Austausch notwendig, dann besser im Log-Script-Thread.
Aber wie sieht es aus, wenn du unter "filter_all" statt+++
einfachscript.js.Timer.
eingibst? Oder nimmst du das+++
für alles, was du loggen willst? Dann macht es das natürlich einfacher...
Alternativ könntest du alle Anfangs-Bestandteile der zu loggenden Scripte unter "filter_any" hinzufügen, alsoscript.js.Timer.
,script.js.Synology.
etc. -
@Mic sagte in [Vorlage] Variable Zeitsteuerung mit VIS Editor:
@Glasfaser
Aber wie sieht es aus, wenn du unter "filter_all" statt+++
einfachscript.js.Timer.
eingibst?Nee … lass mal …. Danke , für mich ist es kein Problem es so zu lassen , es sind nicht nur die Rollladen hinterlegt …. sonst funktionieren die anderen Meldungen nicht .
PS: Lese auch deine Änderung …. Trotzdem Danke für die Tips
-
Passt Habe oben meine Nachricht noch korrigiert und ergänzt...
-
Danke für die Tipps , kann man immer gebrauchen
-
Update ist raus: 15.09.2019 v2
- Log-Ausgabe wird über Variable "logPraefix" manipuliert. Default-Wert = "Timer: ", was somit der aktuellen Ausgabe entspricht.
-
Ich möchte nochmal zu dem Thema „Anwesenheitssimulation“ nachhaken.
Ich habe beispielsweise einen Timer, der an Wochentagen um 06:05 +- 3 Min (Zufall) das Licht im Bad einschaltet. Ein zweiter Timer schaltet es dann gegen 06:25 (wieder +- ein paar Minuten) aus.
Das funktioniert soweit problemlos und passt auch für viele Monate im Jahr. Allerdings gibt es eine Zeit im Sommer, da ist der Sonnenaufgang so früh, da würde man gar kein Licht anschalten. Hat jemand einen Ansatz, wie man ggf. Bedingungen gestalten kann, die z.B. Die aktuelle Zeit und Astro-Zeiten berücksichtigen?
Möglicherweise denke ich ja auch viel zu kompliziert.VG
ak1 -
@ak1
Ich würde ein Object namens Daylight erstellen, dass true bzw false in Abhängigkeit der Astro Zeit aufweist.
Wenn Uhrzeit zwischen sunrise und sunset = true
Ansonsten false.
Dieses Object dann als weitere Bedingung in Timer einbinden. -
@GiuseppeS
Das klingt gut und logisch. Ein Skript würde dann den Wert dieses Objektes setzen. Was wäre ein geeigneter Trigger, um so ein Skript auszulösen? Oder müsste das Skript einfach zyklisch alle paar Minuten laufen lassen? -
@ak1
Würde selbst alle 5 Minuten triggern. Dadurch hat man zwar eine größere Abweichung zwischen Object und Realität aber mir würde es genügen.Edit:
Hatte hier alternativ eine weitere Lösung beschrieben. Aber war eher unnötig kompliziert. Falls schon gelesen, bitte ignorieren. -
@ak1 sagte in [Vorlage] Variable Zeitsteuerung mit VIS Editor:
….Hat jemand einen Ansatz, wie man ggf. Bedingungen gestalten kann, die z.B. Die aktuelle Zeit und Astro-Zeiten berücksichtigen?
….Ganz einfach …. nimm dieses Skript/Datenpunkte , als Bedingung :
.
.
Skript:
-
-
Hallo zusammen,
wie bekomme ich das repariert?
2019-10-02 21:03:00.011 warn at Timer.processTimers (timers.js:223:10) javascript.1 2019-10-02 21:03:00.011 warn at listOnTimeout (timers.js:263:5) javascript.1 2019-10-02 21:03:00.011 warn at tryOnTimeout (timers.js:300:5) javascript.1 2019-10-02 21:03:00.011 warn at ontimeout (timers.js:438:13) javascript.1 2019-10-02 21:03:00.011 warn at Timeout._onTimeout (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1856:34) javascript.1 2019-10-02 21:03:00.011 warn at Object.<anonymous> (script.js.common.Anwesenheitssimulation.AS_Bad:54:11) javascript.1 2019-10-02 21:03:00.011 warn at setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1276:20) javascript.1 2019-10-02 21:03:00.009 warn State "control.0.presence_abscence.AS_Bad_2" not found
Es gibt den State/das Objekt "AS_Bad_2" nicht mehr. Es gibt auch keinen Timer mehr dazu und auch kein Überbleibsel in der Aufzählung "Timers".
Allerdings hatte ich den Fehler gemacht, entsprechende Timer zu löschen, dann das Objekt zu entfernen und anschließend das Zeitsteuerungsskript neu zu starten. Erst dann ist mir aufgefallen, dass ich noch eine "AS_Bad_2"-Leiche in der Aufzählung habe.Ich dachte ich hätte nun alles korrigiert, aber diese Warnung taucht immer wieder auf.
Kann ich das irgendwo bereinigen?
Danke und Gruß
ak1 -