[Gelös] DOIF init Schichtsystem Hilfe

Begonnen von SamNitro, 08 September 2023, 15:02:53

Vorheriges Thema - Nächstes Thema

SamNitro

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?
(Intel-Nuc Proxmox) (Homematic) (EnOcean) (CUL868) (CUL433) (Zigbee2MQTT) (ESP8266) (Echo) (DUOFERN)

rabehd

Auch funktionierende Lösungen kann man hinterfragen.

SamNitro

#2
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
(Intel-Nuc Proxmox) (Homematic) (EnOcean) (CUL868) (CUL433) (Zigbee2MQTT) (ESP8266) (Echo) (DUOFERN)

rabehd

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.
Auch funktionierende Lösungen kann man hinterfragen.

Damian

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]}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

SamNitro

(Intel-Nuc Proxmox) (Homematic) (EnOcean) (CUL868) (CUL433) (Zigbee2MQTT) (ESP8266) (Echo) (DUOFERN)

Damian

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])}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

SamNitro

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.
(Intel-Nuc Proxmox) (Homematic) (EnOcean) (CUL868) (CUL433) (Zigbee2MQTT) (ESP8266) (Echo) (DUOFERN)

Damian

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])}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

SamNitro

Perfekt so sieht es doch direkt viel aufgeräumter aus :)
(Intel-Nuc Proxmox) (Homematic) (EnOcean) (CUL868) (CUL433) (Zigbee2MQTT) (ESP8266) (Echo) (DUOFERN)

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

SamNitro

#11
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?
(Intel-Nuc Proxmox) (Homematic) (EnOcean) (CUL868) (CUL433) (Zigbee2MQTT) (ESP8266) (Echo) (DUOFERN)

Damian

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.
 
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

SamNitro

Ah okay. Die anderen DOIFs triggern (bis jetzt) nur auf eine Uhrzeit. Das Schichtsystem wird nur abgefragt (eq).
(Intel-Nuc Proxmox) (Homematic) (EnOcean) (CUL868) (CUL433) (Zigbee2MQTT) (ESP8266) (Echo) (DUOFERN)