neue Features: ereignisgesteuertes Perl - DOIF-Perl

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

Vorheriges Thema - Nächstes Thema

Damian

Zitat von: weini am 21 Juli 2020, 17:21:14
Gibt es eine Möglichkeit, im Perl-Modus auf den Status zu triggern?
Ich möchte mir ein "Überwachtungs-DOIF" für meinen ganzen CUL/LaCrosse/sDuino etc. Zoo definieren. Die einzelnen Module haben schlauerweise unterschiedliche Stati für "alles ok". Mal ist das "Initialized", mal "Connected" usw. Das lässt sich mit dem Template-Ansatz von DOIF im Prinzip sehr schön erschlagen.

Mein Problem ist nur, dass bei einem Disconnect eines Devices kein Event erzeugt wird, sondern das verantwortliche Modul nur einfach den state entsprechen setzt.
Ist der Perl-Modus damit ausgehebelt?

VG, weini

ohne irgendein Event vom Device (muss nicht state sein) kann das DOIF-Modul nicht wissen, ob etwas zu tun ist, da kannst du nur in regelmäßigen Abständen per Timer vom DOIF-Modul nachschauen lassen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

weini

Das gilt aber nur für den Perl-Modus, richtig?

Im normalen Modus bekommt mein DOIF den Ausfalls eines CUL wunderbar mit. Nur braucht ich da halt dann auch ein DOIF je Device.

Damian

Zitat von: weini am 21 Juli 2020, 18:02:21
Das gilt aber nur für den Perl-Modus, richtig?

Im normalen Modus bekommt mein DOIF den Ausfalls eines CUL wunderbar mit. Nur braucht ich da halt dann auch ein DOIF je Device.

Es gibt diesbezüglich keinen Unterschied zwischen Perl-Modus und FHEM-Modus, wenn es im FHEM-Modus funktioniert, dann funktioniert es auch im Perl-Modus. Dann stimmt deine Aussage nicht, das es keine Events gäbe.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

weini

Klar, du hast völlig recht!
Ich dachte, dass ich das anders beobachtete hatte. Habe es aber gerade nochmal nachvollzogen.

weini

Ich habe jetzt festgestellt, dass das Problem mit dem nicht gesendeten Event beim Disconnect spezifisch für das LaCrosse Modul zu sein scheint. Bei allen anderen Devices kommen entsprechende Events und die Logik funktioniert.

Hier das DOIF Template, mit dem ich die Überwachung mache:

defmod dif_CUL_monitoring DOIF subs {\
   sub raiseAlert($)  # Alarmmeldung per Email & ins Log\
   {\
     my ($dev_name)=@_;;\
::SendEMail('postmaster@domain.de', "$dev_name", "$dev_name  hat Verbindung verloren");;\
Log 3,"$dev_name hat Verbindung verloren";;\
return 0;;\
   }\
}\
DEF TPL_cul ( ## Definition des Templates namens TPL_cul zum Monitoring der CUL Devices\
cul_$1 {                                 ## DOIF Block\
                                         ## Parameter: CUL_Name Status\
                                         ## Nr.:       $1       $2\
  if ([$1] ne "$2") {                    ## wenn Status nicht dem normalen Betriebsstatus entspricht\
    set_Exec("timer_$1", 600, 'raiseAlert', "$1");;\
  } elsif ([$1] eq "$2") {              ## Status ist wieder ok\
    del_Exec("timer_$1");;\
  }\
} ## Ende des CUL-Blocks\
) ## Ende der Templatedefinition\
\
## Generierung der Steuerung pro Beschattungsszene mit Hilfe des obigen Templates\
TPL_cul (lcg_LaCrosse,initialized)\
TPL_cul (nanoCUL433,Initialized)\
TPL_cul (nanoCUL868,Initialized)\
TPL_cul (sduinoCC1101,opened)\
TPL_cul (hmUART,opened)\
TPL_cul (fhemMQTT,Initialized)\
TPL_cul (snipsMQTT,opened)\
TPL_cul (hcconn,Connected)\
## ... hier können weitere Szenarien durch hinzufügen weiterer Zeilen generiert werden


Für den LaCrosse setze ich jetzt zusätzlich ein Watchdog Device auf, damit sollte der dann auch unter Kontrolle sein.

Danke wieder mal an Damian für die neue Template Logik. Für mich bringt sie in einigen Fällen nochmal genau die Features, um Dinge noch besser zusammenzufassen und doch flexibel zu bleiben.

Damian

Zitat von: Damian am 13 Oktober 2018, 23:41:35
neue Version eingecheckt: Perl-Modus: state wird vom Modul nicht angepackt (auch nicht gelöscht), Attribute state, initialize, startup wurden entfernt, set initialize wurde ebenfalls entfernt

Ich würde gerne deaktivierte DOIFs (attr disable 1) im Perl-Modus, wie auch schon im FHEM-Modus, im Status mit "deactivated" kennzeichnen wollen und nach dem dem Löschen des disable-Attributes dann logischerweise wieder auf "initialized" setzen.

Hintergrund:

Z. Zt. muss man in Details-Anzeige eines Moduls hineingehen, um zu sehen, ob ein Modul überhaupt aktiv ist oder nicht - das finde ich verwirrend, weil man auf den ersten Blick nicht erkennen kann, ob ein Modul überhaupt arbeitet oder nicht. So habe ich mich schon öfters gewundert, warum ein DOIF nicht funktionierte.  Ein deaktiviertes Modul kann ohnehin keine aktuellen und damit sinnvollen Informationen im Status haben.

Gibt es konkrete Gründe, die dagegen sprechen ein deaktiviertes Modul im Perl-Modus mit "deactivated" im Status zu kennzeichnen?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

Aus meiner Praxis heraus würde ich diese Änderung sehr begrüßen.

Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Damian

Zitat von: cwagner am 12 September 2020, 10:55:14
Aus meiner Praxis heraus würde ich diese Änderung sehr begrüßen.

Christian

ja, das sind auch meine Erfahrungen.

Ursprünglich war die Überlegung dem User maximale Freiheit beim Setzen des Status über set_State zu überlassen, daher hatte ich das Verändern des Status im Perl-Modus durch das Modul weitgehend ausgebaut.

Im deaktivierten Zustand ist das Beibehalten eines alten Zustands im Status allerdings eher verwirrend als nützlich.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

KyleK

Ich bin ebenfalls für diese Änderung, macht die Sache viel übersichtlicher.
FHEM on Raspberry Pi 3B+
CUL868
7x MAX! Thermostat, 8x MAX! Fensterkontakte
Conbee II + deConz, TradFri Lampen, Osram Smart+ Steckdosen

Ellert

#204
Zitat von: Damian am 12 September 2020, 10:29:34
Ich würde gerne deaktivierte DOIFs (attr disable 1) im Perl-Modus, wie auch schon im FHEM-Modus, im Status mit "deactivated" kennzeichnen wollen und nach dem dem Löschen des disable-Attributes dann logischerweise wieder auf "initialized" setzen.

Hintergrund:

Z. Zt. muss man in Details-Anzeige eines Moduls hineingehen, um zu sehen, ob ein Modul überhaupt aktiv ist oder nicht - das finde ich verwirrend, weil man auf den ersten Blick nicht erkennen kann, ob ein Modul überhaupt arbeitet oder nicht. So habe ich mich schon öfters gewundert, warum ein DOIF nicht funktionierte.  Ein deaktiviertes Modul kann ohnehin keine aktuellen und damit sinnvollen Informationen im Status haben.

Gibt es konkrete Gründe, die dagegen sprechen ein deaktiviertes Modul im Perl-Modus mit "deactivated" im Status zu kennzeichnen?




Das Reading state auf dectivated zu setzen wäre mir egal.

Wenn das Attribut disabled gelöscht wird, dann sollte state nur dann auf initialized gesetzt werden, wenn im init Block state nicht initialisiert wird.

Es könne sonst zu unerwünschten Effekten kommen, wenn abhängige DOIF auf logisch falsch im state vertrauen.

Konsequenter wäre es einen end-Block zu schaffen der dem Benutzer die Möglichkeit bietet state vor disabled, shutdown usw. zu setzen.

ZitatZ. Zt. muss man in Details-Anzeige eines Moduls hineingehen ...

Mit dem Attribut stateFormat mode hat man die Möglichkeit deactivated anzeigen zu lassen ohne das jetzige Verhalten zu ändern

Damian

Zitat von: Ellert am 12 September 2020, 18:45:36
Das Reading state auf dectivated zu setzen wäre mir egal.

Wenn das Attribut disabled gelöscht wird, dann sollte state nur dann auf initialized gesetzt werden, wenn im init Block state nicht initialisiert wird.

Es könne sonst zu unerwünschten Effekten kommen, wenn abhängige DOIF auf logisch falsch im state vertrauen.

Konsequenter wäre es einen end-Block zu schaffen der dem Benutzer die Möglichkeit bietet state vor disabled, shutdown usw. zu setzen.

Mit dem Attribut stateFormat mode hat man die Möglichkeit deactivated anzeigen zu lassen ohne das jetzige Verhalten zu ändern

Was ich machen kann ist, den aktuellen Status z. B. im Reading last_state beim Deaktivieren zu sichern und beim Aktivieren wieder in Status zurück zu kopieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Ja, das wäre erstmal eine Lösung, vielleicht in einem 2. Schritt, falls meine Bedenken sich bestätigen.

Damian

#207
Hier mal eine Version zum Testen.

Der init-Block wurde beim Aktivieren immer schon ausgeführt, damit wird ggf. mein kurz zuvor auf "initialized" ohne Event gesetzter Status überschrieben.

Gestestet mit:

defmod di_disable DOIF init {set_State"ok"}\
{[10:00];; fhem_set "bla on"}


Das Sichern des Status habe ich nicht eingebaut.

Das Reading mode wird wie bisher weiterhin mit Event auf "enabled" bzw. "deactivated" gesetzt, darauf kann man immer triggern.

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

Damian

#208
Noch mal zur Information:

Die neue DOIF-Version ist bereits produktiv. Zu beachten ist, dass der Status nur dann auf "deactivated" gesetzt wird, wenn man im aktiven System das Attribut disable für ein DOIF-Device auf 1 setzt. Bei DOIF-Modulen, die zuvor schon deaktiviert waren, ändert sich der Status nicht. Möchte man auch diese Module mit "deactivated" im Status haben, so muss man das Attribut disable löschen und wieder auf  1 setzen. All das gilt nur für den Perl-Modus, im FHEM-Modus wurden deaktivierte DOIF-Module immer schon auf "deactivated" im Status gesetzt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#209
Bitte beachten: https://forum.fhem.de/index.php/topic,114263.0.html

Wenn keiner schreit, dann werde ich es wie vorgeschlagen umsetzen.

Es würde nur jemanden betreffen, wenn er bisher set_Exec mit vier Parametern benutzt hätte.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF