FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: SamNitro am 08 September 2023, 15:02:53

Titel: [Gelös] DOIF init Schichtsystem Hilfe
Beitrag von: SamNitro am 08 September 2023, 15:02:53
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?
Titel: Aw: DOIF init Schichtsystem Hilfe
Beitrag von: rabehd am 08 September 2023, 15:28:16
Wofür brauchst Du Hilfe?
Titel: Aw: DOIF init Schichtsystem Hilfe
Beitrag von: SamNitro am 08 September 2023, 15:34:16
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
Titel: Aw: DOIF init Schichtsystem Hilfe
Beitrag von: rabehd am 08 September 2023, 16:08:19
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.
Titel: Aw: DOIF init Schichtsystem Hilfe
Beitrag von: Damian am 08 September 2023, 16:14:56
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]}
Titel: Aw: DOIF init Schichtsystem Hilfe
Beitrag von: SamNitro am 08 September 2023, 16:38:32
Perfekt vielen Dank :)
Titel: Aw: [Gelös] DOIF init Schichtsystem Hilfe
Beitrag von: Damian am 09 September 2023, 09:24:31
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])}
Titel: Aw: [Gelös] DOIF init Schichtsystem Hilfe
Beitrag von: SamNitro am 09 September 2023, 09:49:20
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.
Titel: Aw: [Gelös] DOIF init Schichtsystem Hilfe
Beitrag von: Damian am 09 September 2023, 17:10:50
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])}
Titel: Aw: [Gelös] DOIF init Schichtsystem Hilfe
Beitrag von: SamNitro am 09 September 2023, 21:43:30
Perfekt so sieht es doch direkt viel aufgeräumter aus :)
Titel: Aw: [Gelös] DOIF init Schichtsystem Hilfe
Beitrag von: Damian am 09 September 2023, 22:36:20
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.
Titel: Aw: [Gelös] DOIF init Schichtsystem Hilfe
Beitrag von: SamNitro am 09 September 2023, 22:46:41
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?
Titel: Aw: [Gelös] DOIF init Schichtsystem Hilfe
Beitrag von: Damian am 10 September 2023, 10:57:42
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.
 
Titel: Aw: [Gelös] DOIF init Schichtsystem Hilfe
Beitrag von: SamNitro am 10 September 2023, 12:13:19
Ah okay. Die anderen DOIFs triggern (bis jetzt) nur auf eine Uhrzeit. Das Schichtsystem wird nur abgefragt (eq).