neue Features: ereignisgesteuertes Perl - DOIF-Perl

Begonnen von Damian, 25 Februar 2018, 21:29:16

Vorheriges Thema - Nächstes Thema

Ellert

In FHEM-Mode sollte es auch recht knapp zu formulieren sein:
([FB]) (set radio [FB])
attr do always

Damian

Zitat von: Ellert am 06 Oktober 2018, 18:54:14
In FHEM-Mode sollte es auch recht knapp zu formulieren sein:
([FB]) (set radio [FB])
attr do always


ja, natürlich :)

Ich wollte an dem Beispiel insb. aufzeigen, dass man aus der if-then-else Denkweise ausbrechen kann. Und immer dann, wenn do always benutzt wird, rückt die besondere Eigenschaft des FHEM-Modus, mit Zuständen zu arbeiten, in den Hintergrund. 
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Newbie

Hallo Damian,

Zitatattr testkleide DOIF_Readings condition:([myTwilight:azimuth] >94 and [myTwilight:azimuth] <182) and ($month >= 4 and $month <= 9) and ([Vito333:Temp-Aussen] > 16 and [Bad_WThermostat_Climate:measured-temp] >= 20 and [Bewegungsmelder:brightness] >216 and [Wetter:condition] =~ /teilweise wolkig|überwiegend wolkig|wolkig|teilweise sonnig|überwiegend sonnig|sonnig|heiter/))

funktioniert so aber nicht, liegt hier dran
Zitat... and ($month >= 4 and $month <= 9) ...

vg
fhem-6.1 (configDB+DbLog)  auf ODROID-XU4

Damian

Zitat von: Newbie am 06 Oktober 2018, 23:57:53
Hallo Damian,

funktioniert so aber nicht, liegt hier dran
vg

ja, $month wird offenbar nicht in DOIF_Readings vorbelegt.

Es geht ja in erster Linie um die zyklischen Trigger, die man aus der Abfrage herausnimmt, daher kann man auch definieren:

attr testkleide DOIF_Readings condition:([myTwilight:azimuth] >94 and [myTwilight:azimuth] <182) and ([Vito333:Temp-Aussen] > 16 and [Bad_WThermostat_Climate:measured-temp] >= 20 and [Bewegungsmelder:brightness] >216 and [Wetter:condition] =~ /teilweise wolkig|überwiegend wolkig|wolkig|teilweise sonnig|überwiegend sonnig|sonnig|heiter/))

defmod testkleide DOIF {if ([$SELF:condition] and $month >= 4 and $month <= 9) {...
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

#109
Bei einem Modify, bevor der init-Block ausgeführt wird, wird state auf initialized gesetzt. Das wirkt störend, wenn es in einem anderen DOIF eine Abfrage auf state gibt und kann zur Fehlschaltung führen.

Beispiel
defmod initBlock DOIF init {\
  Log 1, "1 $SELF:".get_State;;\
  set_Reading_Begin;;\
  ::readingsBulkUpdateIfChanged($hash,"state",0);;\
  set_Reading_End(1);;\
  Log 1, "2 $SELF:".get_State;;\
}

Folgedoif
([initBlock:state]) (set lamp on)
DOELSEIF (![initBlock:state]) (set lamp off)

hier wird erst die Lampe kurz eingeschaltet und nach dem Ausführen des init-Blocks wird die Lampe ausgeschaltet.

Wäre es nicht sinnvol beim Perl-Modus auf das setzen von state zu verzichten?
Oder state nur auf initialized zu setzen, wenn state im init-Block nicht gesetzt wird, also length(get_State) gleich 0 ist?

Edit: Oder bei der Initialisierung state ohne Event setzen.

Damian

Muss ich mir mal anschauen.

Wenn man gar nichts macht, steht dann im Status ? ? ?.

Das würde dem minimalistischen Ansatz des Perl-Modus durchaus entsprechen - für den Status ist der Anwender zuständig. Man kann den Status im init-Block selbst setzen und es gibt ja noch das Attribut initialize.

Auf der anderen Seite ist initialized ein definierter Zustand und kommt nur bei der Definition (ggf mit defmod) vor. Beim Hochfahren bleibt ja der alte Zustand bestehen.

Da muss man die Prioritäten abwägen.

Ich tendiere zu der ersten Variante, den Status gar nicht mehr vom Modul zu setzen - also auch nicht auf initialized.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Ja, beim Hochfahren ist es kein Problem.

Wann erscheinen die drei Fragezeichen? Vor dem Ausführen des init-Blocks oder danach, falls state undefined ist.

Damian

Zitat von: Ellert am 08 Oktober 2018, 19:26:24
Ja, beim Hochfahren ist es kein Problem.

Wann erscheinen die drei Fragezeichen? Vor dem Ausführen des init-Blocks oder danach, falls state undefined ist.

Die drei Fragezeichen kommen nicht von DOIF, ich meine, die sind dann zu sehen, wenn gar kein Status gesetzt wird.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#113
Es reicht in Zeile 2847

readingsEndUpdate($hash, 0);

das Event rauszunehmen.

Edit: dann hat man einen definierten Zustand ohne Events zu produzieren - das dürfte die beste Lösung sein.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Ich denke es ist am saubersten, wenn man state nicht als Auslöser verwendet, sondern ein Benutzerreading, das behält bei Modify und Neustart den Wert bei.

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Zitat von: Damian am 08 Oktober 2018, 19:39:40
Es reicht in Zeile 2847

readingsEndUpdate($hash, 0);

das Event rauszunehmen.

Edit: dann hat man einen definierten Zustand ohne Events zu produzieren - das dürfte die beste Lösung sein.

Das kommt mir halbherzig vor.

Mit initialized im state bei modify, gibt es nach der Modifikation, Deaktivierung und Aktivierung immer kurz einen ungewollten Zustand.

Meine These dazu lautet:
Mit den Funktionen set_State und get_State wird die Hoheit über state dem Benutzer übertragen. Das Reading sollte daher vom DOIF nicht mehr benutzt werden.
Also sollte state nicht gelöscht werden, und auch nicht mit disabled, deaktivated oder initialized belegt werden. Das wird im Reading mode dargestellt.

Damian

Zitat von: Ellert am 10 Oktober 2018, 17:16:52
Das kommt mir halbherzig vor.

Mit initialized im state bei modify, gibt es nach der Modifikation, Deaktivierung und Aktivierung immer kurz einen ungewollten Zustand.

Meine These dazu lautet:
Mit den Funktionen set_State und get_State wird die Hoheit über state dem Benutzer übertragen. Das Reading sollte daher vom DOIF nicht mehr benutzt werden.
Also sollte state nicht gelöscht werden, und auch nicht mit disabled, deaktivated oder initialized belegt werden. Das wird im Reading mode dargestellt.

ja, an set ... habe ich nicht gedacht.

Dennoch ist defmod eine Neudefinition, die im laufenden Betrieb nicht stattfinden sollte. Es ist eine Änderung der Konfiguration, die ein internes Löschen diverse Dinge bedeutet - also ein Zurücksetzen des Devices. Diese Information ist für die Nachvollziehbarkeit bei Problemen wichtig.

Mit dem Reading mode kann man die "Initialisierung" leider nicht erkennen, dort steht nur enabled oder disabled aber nicht initialized.

Da müssen wir uns noch eine saubere Lösung für den Perl-Mode überlegen.

Man könnte sich ein neues Reading überlegen, welches diese Informationen des Status übernimmt.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Wenn man im init-Block state setzt, bekommt man initialized nie zu sehen, insofern wäre ein extra Reading sinnvoll oder mode wird auf "enabled initialized" gesetzt, im initialized Fall (attr disabled 0 und modify) und auf "enabled" nach set enable.

Damian

#119
Ich habe mal folgende Version gebaut:

State wird gar nicht mehr vom Modul gesetzt. Es gibt nur noch das Reading mode (enabled, disabled). Z. Zt. ohne weitere Readings nach der Neudefinition.

gerade noch getestet:

[$SELF:state] liefert leeren String

[$SELF] liefert drei Fragezeichen.

Alternativ könnte man state bei defmod ohne Trigger auf initialize setzen.

Des Weiteren habe ich in der Konsequenz die Attribute state, initialized, startup im Perl-Modus entfernt. Es gibt ja jetzt den init-Block. Ich hoffe diese Attribute benutzt noch keiner im Perl-Modus.

Neue Version 0.3 im Anhang zum Antesten.

Edit: Das disable-Attribut wird jetzt auch berücksichtigt -> mode deactivated wie bisher aber ohne Statusänderung
Edit: Jetzt werden Readings sofort angelegt, wenn man das Attribut DOIF_Readings definiert
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF