Hallo alle zusammen,
Ich versuche ein DOIF zu erstellen was sich beim starten schon aktualisiert. (Init)
([00:01] and $week % 3 == 0) (set Schichtsystem Früh)
DOELSEIF
([00:01] and $week % 3 == 1) (set Schichtsystem Spät)
DOELSEIF
([00:01] and $week % 3 == 2) (set Schichtsystem Nacht)
Gerne auch als eigenes Reading Schichtsystem
Kann einer dabei helfen?
Wofür brauchst Du Hilfe?
Ich hätte gerne dass das DOIF beim starten von FHEM oder nach der Definition sich schon aktualisiert.
So wie hier:
init{[00:00];set_State($week %3)}
Nur das direkt als eigenes Reading Früh Spät oder Nacht erstellt wird.
0 ist bei mir Frühschicht
1 Spätschicht
2 wäre Nachtschicht
ZitatMit dem Attribut initialize Wird der Status vorbelegt, mit Initialisierung nach dem Neustart.
Anwendungsbeispiel: Nach dem Neustart soll der Zustand von di_lamp mit "initialized" vorbelegt werden. Das Reading cmd_nr wird auf 0 gesetzt, damit wird ein Zustandswechsel provoziert, das Modul wird initialisiert - der nächste Trigger führt zum Ausführen eines Kommandos.
attr di_lamp initialize initialized
Das ist insb. dann sinnvoll, wenn das System ohne Sicherung der Konfiguration (unvorhergesehen) beendet wurde und nach dem Neustart die zuletzt gespeicherten Zustände des Moduls nicht mit den tatsächlichen übereinstimmen.
Dann musst du es im Perl-Modus definieren
DOIF init{[00:01]; if ($week % 3 == 0) {fhem_set"Schichtsystem Früh"}
elsif ($week % 3 == 1) {fhem_set"Schichtsystem Spät"}
elsif ($week % 3 == 2) {fhem_set"Schichtsystem Nacht"}
}
oder kürzer über ein Array:
DOIF init{[00:01]; fhem_set "Schichtsystem ".("Früh","Spät","Nacht")[$week % 3]}
Perfekt vielen Dank :)
Statt eines Dummys kannst du natürlich auch direkt den Status des DOIF nutzen:
DOIF init{[00:01]; set_State (("Früh","Spät","Nacht")[$week % 3])}
Hey, ich habe das jetzt aktuell so:
init{[00:01|Mo]; if ($week % 3 == 0) {fhem"setreading DOIF_Schichtsystem Schichtsystem Frühschicht"}
elsif ($week % 3 == 1) {fhem"setreading DOIF_Schichtsystem Schichtsystem Spätschicht"}
elsif ($week % 3 == 2) {fhem"setreading DOIF_Schichtsystem Schichtsystem Nachtschicht"}
}
Damit das in ein separates Reading geht.
Zitat von: SamNitro am 09 September 2023, 09:49:20Hey, ich habe das jetzt aktuell so:
init{[00:01|Mo]; if ($week % 3 == 0) {fhem"setreading DOIF_Schichtsystem Schichtsystem Frühschicht"}
elsif ($week % 3 == 1) {fhem"setreading DOIF_Schichtsystem Schichtsystem Spätschicht"}
elsif ($week % 3 == 2) {fhem"setreading DOIF_Schichtsystem Schichtsystem Nachtschicht"}
}
Damit das in ein separates Reading geht.
Auch dafür gibt es eine Perlfunktion:
DOIF init{[00:01|Mo]; set_Reading ("Schichtsystem",("Frühschicht","Spätschicht","Nachtschicht")[$week % 3])}
Perfekt so sieht es doch direkt viel aufgeräumter aus :)
Zitat von: SamNitro am 09 September 2023, 21:43:30Perfekt so sieht es doch direkt viel aufgeräumter aus :)
... und du kannst mit set_Reading entscheiden, ob du ein Event erzeugen willst oder nicht.
Zitat... und du kannst mit set_Reading entscheiden, ob du ein Event erzeugen willst oder nicht.
ich habe mir jetzt andere DOIF's geschrieben um darauf zu reagieren.
1. Licht spezifisch
2. Rollo
so kann ich über mein Tablet einzelne auch ausschalten.
Aber könntest du das trotzdem kurz erläutern?
Es hängt davon ab, wie die anderen DOIFs auf den Schichteintrag reagieren sollen. Triggern sie auf Veränderung um Mitternacht oder fragen sie diesen Eintrag einfach nur zu einem anderen Zeitpunkt ab.
setreading-FHEM-Befehl löst immer ein Event aus. Das kann sinnvoll sein, wenn man die Veränderung hier montags um Mitternacht oder nach dem Hochfahren des Systems mitbekommen möchte. Ich gehe aber davon aus, dass du zum späteren Zeitpunkt die Schicht abfragst, dann wären die Events unnötig.
Möchte man ein Event mit set_Reading erzeugen, dann muss man einen dritten Parameter angeben:
DOIF init{[00:01|Mo]; set_Reading ("Schichtsystem",("Frühschicht","Spätschicht","Nachtschicht")[$week % 3],1)}
Grundsätzlich sollte man auf unnötige Events verzichten, denn die belasten unnötig das System. Hier ist das ziemlich egal, denn die Events würden höchstens einmal pro Woche kommen.
Allerdings produzieren manche User durch irgendwelche Definitionen zig oder hunderte Events pro Sekunde ohne sich dessen bewusst zu sein. Das kann das System langsamer machen.
In welcher Häufigkeit Events im System produziert werden, sieht man bekanntlich im Event-Monitor.
Ah okay. Die anderen DOIFs triggern (bis jetzt) nur auf eine Uhrzeit. Das Schichtsystem wird nur abgefragt (eq).