neue Features: ereignisgesteuertes Perl - DOIF-Perl

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

Vorheriges Thema - Nächstes Thema

Damian

#90
Ich habe mir gestern die Sache mit den Timern noch mal genau angeschaut. Es ist eigentlich überflüssig zwei verschieden Timerarten zu definieren. Mit set_Exec hat man alles, was man braucht. Will man ein verzögertes Event absetzen, dann reicht die Angabe mit set_Exec.

Beispiel: "blabla"-Event nach 30 Sekunden:

set_Exec("myevent",30,'set_Event("blabla")');

Damit entfallen die Funktionen: set_Timer, get_Timer, del_Timer

und der Anwender muss nur noch die Timerfunktionen: set_Exec, get_Exec, del_Exec kennen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#91
Neue Version eingecheckt: Funktionen: set_Timer, get_Timer, del_Timer sind rausgeflogen, Commandref zum Perl-Modus wurde überarbeitet

Edit: Beispiel zum Melden geöffneter Fenster wurde in der Commandref von set_Timer auf set_Exec umgestellt (ist sogar kürzer geworden :) )

Verzögerte Fenster-offen-Meldung mit Wiederholung für mehrere Fenster:

define di_window DOIF
subs {
  sub logwin {                                       # Definition der Funkton namens "logwin"
    my ($window)=@_;                                 # übernehme Parameter in die Variable $window
    Log 3,"Fenster offen, bitte schließen: $window"; # protokolliere Fenster-Offen-Meldung
    set_Exec ("$window",1800,"logwin",$window);      # setze Timer auf 30 Minuten für eine wiederholte Meldung
  }
}
{ if (["_window$:open"]) {set_Exec ("$DEVICE",600,'logwin("$DEVICE")')}} # wenn, Fenster geöffnet wird, dann setze Timer auf Funktion zum Loggen namens "logwin"
{ if (["_window$:closed"]) {del_Exec ("$DEVICE")}}                       # wenn, Fenster geschlossen wird, dann lösche Timer
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Wo gibt man use-Aweisungen für das Package DOIF am sinnvollsten an?

Wenn man die use-Anweisungen in der Definition angibt, kann es unübersichtlich werden und sie könnten mehrfach in verschiedenen Definitionen stehen.

Damian

#93
Zitat von: Ellert am 29 September 2018, 18:11:31
Wo gibt man use-Aweisungen für das Package DOIF am sinnvollsten an?

Wenn man die use-Anweisungen in der Definition angibt, kann es unübersichtlich werden und sie könnten mehrfach in verschiedenen Definitionen stehen.

Kommt drauf an, was du konkret mit use bekannt geben willst?

Z. Zt. in jedem Block, wo man sie benötigt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Wenn ich

define test
  subs {
    use WWW::Mechanize;
    sub1 () { ... }
  }


dann steht WWW::Mechanize im Package DOIF zur Verfügung, soweit ich es beobachtet habe, also auch in einer anderen DOIF-Perl Definition, die WWW::Mechanize benötigt. Das weiss man später vielleicht nicht mehr und gibt unnötig in einer weiteren Gerätedefinition an.

Ist es dann nicht sinvoller das in eine Datei 99_myDOIFUtils.pm auszulagern und hier die benutzten Perl-Module zu sammeln?

package DOIF;
use WWW::Mechanize;
use ...

Damian

Zitat von: Ellert am 29 September 2018, 19:22:43
Wenn ich

define test
  subs {
    use WWW::Mechanize;
    sub1 () { ... }
  }


dann steht WWW::Mechanize im Package DOIF zur Verfügung, soweit ich es beobachtet habe, also auch in einer anderen DOIF-Perl Definition, die WWW::Mechanize benötigt. Das weiss man später vielleicht nicht mehr und gibt unnötig in einer weiteren Gerätedefinition an.

Ist es dann nicht sinvoller das in eine Datei 99_myDOIFUtils.pm auszulagern und hier die benutzten Perl-Module zu sammeln?

package DOIF;
use WWW::Mechanize;
use ...


ja, warum nicht, das Gleiche gilt für Funktionen, die man in verschiedenen DOIF-Devices nutzen will.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Newbie

Hallo Damian und die anderen Perl-Experten,

ich lese hier immer fleisig mit und habe auch schon diverse DOIF`s auf den Perl-Modus umgestellt.

Aber bei diesem bin ich bisher am Timer gescheitert, irgendein Device triggert immer innerhalb der 15min und der Timer wird neu gesetzt, so das die Rollos nie schließen.

defmod WZ_Sonnenrollo DOIF ([myTwilight:azimuth] >135 and [myTwilight:azimuth] <278 and ($month >= 4 and $month <= 9)\
and [Vito333:Temp-Aussen] > 16 and [WZ_Weather:measured-temp] >= 21 and [Bewegungsmelder:brightness] >216\
and [Wetter:condition] =~ /teilweise wolkig|überwiegend wolkig|wolkig|teilweise sonnig|überwiegend sonnig|sonnig|heiter/)\
(set WZ1_Rollo:FILTER=STATE!=Zu off;; set WZ2_Rollo:FILTER=STATE!=25 25) DOELSE (set WZ1_Rollo:FILTER=STATE!=Auf on;; set WZ2_Rollo:FILTER=STATE!=Auf on)
attr WZ_Sonnenrollo alias Wohnzimmer-Süd
attr WZ_Sonnenrollo cmdIcon An:FS20.on Aus:FS20.off
attr WZ_Sonnenrollo cmdState An|Aus|Fehler
attr WZ_Sonnenrollo disable 0
attr WZ_Sonnenrollo group Sonnenschutz
attr WZ_Sonnenrollo room Erdgeschoss->Wohnzimmer
attr WZ_Sonnenrollo timerWithWait 1
attr WZ_Sonnenrollo wait 0:750

setstate WZ_Sonnenrollo Aus
setstate WZ_Sonnenrollo 2018-10-05 14:48:12 Device Vito333
setstate WZ_Sonnenrollo 2018-10-03 10:13:47 cmd 2
setstate WZ_Sonnenrollo 2018-10-03 10:13:47 cmd_event Vito333
setstate WZ_Sonnenrollo 2018-10-03 10:13:47 cmd_nr 2
setstate WZ_Sonnenrollo 2018-10-05 14:45:07 e_Bewegungsmelder_brightness 234
setstate WZ_Sonnenrollo 2018-10-05 14:48:11 e_Vito333_Temp-Aussen 19.5
setstate WZ_Sonnenrollo 2018-10-05 14:48:00 e_WZ_Weather_measured-temp 23.3
setstate WZ_Sonnenrollo 2018-10-05 14:30:33 e_Wetter_condition heiter
setstate WZ_Sonnenrollo 2018-10-05 14:44:47 e_myTwilight_azimuth 211.06
setstate WZ_Sonnenrollo 2018-10-03 10:00:10 mode enabled
setstate WZ_Sonnenrollo 2018-10-03 10:13:47 state Aus
setstate WZ_Sonnenrollo 2018-10-03 10:13:47 wait_timer no timer



Wie muss ich das im Perl-Modus umsetzen, damit der doelse-Zweig-Timer innerhalb der max. 15min nicht immer wieder neu gestartet wird?

vg Jens

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

Damian

Du musst erst herausfinden, welches Device deine Bedingung (wahr/falsch) innerhalb kurzer Zeit verändert. So solange das nicht klar ist, wird auch der Perl-Modus nicht helfen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Newbie

Ich glaub ich hab gefunden was ich die ganze Zeit überlesen habe.

!get_Exec("Timer")

Werde mal testen.

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

Newbie

Hallo,

kurze Rückmeldung. Ich habe aus dem hier

defmod AZ_Sonnenrollo DOIF (([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/))\
(set AZ_Rollo:FILTER=level>10 10)\
DOELSE (set AZ_Rollo:FILTER=STATE!=Auf on)
attr AZ_Sonnenrollo alias Ankeide
attr AZ_Sonnenrollo cmdIcon An:FS20.on Aus:FS20.off
attr AZ_Sonnenrollo cmdState An|Aus|Fehler
attr AZ_Sonnenrollo group Sonnenschutz
attr AZ_Sonnenrollo room Erdgeschoss->Ankleidezimmer
attr AZ_Sonnenrollo timerWithWait 1
attr AZ_Sonnenrollo wait 0:750

setstate AZ_Sonnenrollo Aus
setstate AZ_Sonnenrollo 2018-10-06 13:27:28 Device Vito333
setstate AZ_Sonnenrollo 2018-09-30 13:37:24 cmd 2
setstate AZ_Sonnenrollo 2018-09-30 13:37:24 cmd_event Vito333
setstate AZ_Sonnenrollo 2018-09-30 13:37:24 cmd_nr 2
setstate AZ_Sonnenrollo 2018-10-06 13:25:51 e_Bad_WThermostat_Climate_measured-temp 21.8
setstate AZ_Sonnenrollo 2018-10-06 13:23:42 e_Bewegungsmelder_brightness 235
setstate AZ_Sonnenrollo 2018-10-06 13:27:26 e_Vito333_Temp-Aussen 19.7
setstate AZ_Sonnenrollo 2018-10-06 13:01:03 e_Wetter_condition überwiegend wolkig
setstate AZ_Sonnenrollo 2018-10-06 13:24:47 e_myTwilight_azimuth 188.8
setstate AZ_Sonnenrollo 2018-09-30 13:11:54 mode enabled
setstate AZ_Sonnenrollo 2018-09-30 13:37:24 state Aus
setstate AZ_Sonnenrollo 2018-09-30 13:37:24 wait_timer no timer



das gemacht

defmod testkleide DOIF {if (([myTwilight:azimuth] >94 and [myTwilight:azimuth] <182)\
and ($month >= 4 and $month <= 10)\
and ([Vito333:Temp-Aussen] > 14 \
and [Bad_WThermostat_Climate:measured-temp] >= 18 and [Bewegungsmelder:brightness] >216\
and [Wetter:condition] =~ /teilweise wolkig|überwiegend wolkig|wolkig|teilweise sonnig|überwiegend sonnig|sonnig|heiter/))\
{set_State("on");; fhem_set("AZ_Rollo:FILTER=level>10 10")}\
else {if ([?$SELF:state] eq "on" and !get_Exec("Timer")) {set_State ("off");; set_Exec("Timer",rand(750),'fhem_set("AZ_Rollo:FILTER=STATE!=Auf on")')}}}

setstate testkleide off
setstate testkleide 2018-10-06 13:27:54 Device Bad_WThermostat_Climate
setstate testkleide 2018-10-06 13:27:54 block_01 executed
setstate testkleide 2018-10-06 13:27:54 e_Bad_WThermostat_Climate_measured-temp 21.8
setstate testkleide 2018-10-06 13:23:42 e_Bewegungsmelder_brightness 235
setstate testkleide 2018-10-06 13:27:26 e_Vito333_Temp-Aussen 19.7
setstate testkleide 2018-10-06 13:01:03 e_Wetter_condition überwiegend wolkig
setstate testkleide 2018-10-06 13:24:47 e_myTwilight_azimuth 188.8
setstate testkleide 2018-10-05 21:10:08 mode enabled
setstate testkleide 2018-10-06 13:04:47 state off



Rollo ist heute runter und auch wieder hoch gefahren.  :)

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

Damian

#100
Zitat von: Newbie am 06 Oktober 2018, 13:33:24

Rollo ist heute runter und auch wieder hoch gefahren.  :)

vg Jens

Dann hat sich ja der Umstieg bezahlt gemacht. :)

Edit: Allerdings wird ggf. alle paar Minuten der Status auf on gesetzt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Newbie

#101
Hallo Damian

ZitatAllerdings wird ggf. alle paar Minuten der Status auf on gesetzt.

gut aufgepaßt, 1 setzen. :)

Hab ich aber zwischenzeitlich schon angepaßt.
defmod testkleide DOIF {if ([?$SELF:state] ne "on" and([myTwilight:azimuth] >94...

Richtig?
fhem-6.1 (configDB+DbLog)  auf ODROID-XU4

Damian

Zitat von: Newbie am 06 Oktober 2018, 14:35:08
Hallo Damian

gut aufgepaßt, 1 setzen. :)

Hab ich aber zwischenzeitlich schon angepaßt.
defmod testkleide DOIF {if ([?$SELF:state] ne "on" and([myTwilight:azimuth] >94...

Richtig?

Das ist eine von vielen Möglichkeiten.

Besonderes elegant finde ich die Nutzung von DOIF_Readings bei zyklisch sendenden Sensoren:


attr 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/))

und dann nur noch

defmod testkleide DOIF {if ([$SELF:condition]) {...


DOIF_Readings ist genau für diesen Fall konzipiert, denn es gibt nur einen internen Trigger, wenn sich der Zustand des Readings (hier: condition) ändert. Damit kann man schön auch die Fälle im Perl-Modus abdecken, für die der FHEM-Modus ohne always konzipiert wurde. Damit erübrigen sich die if-Abfragen des eigenen Zustands.





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

Newbie

... und wieder was gelernt.

Danke für dein tolles Modul und deine Geduld beim Support.


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

Damian

Zitat von: Newbie am 06 Oktober 2018, 17:08:04
... und wieder was gelernt.

Danke für dein tolles Modul und deine Geduld beim Support.


vg Jens

Es wird langsam an der Zeit ein Umsteiger-Handbuch zu verfassen. :)

Ich fange hier mal mit einem simplen Beispiel für eine Radio-Fernbedienung an:

FHEM-Mode:
DOIF ([FB] eq "on") (set radio on) DOELSEIF ([FB] eq "off") (set radio off)
attr do always


Perl-Mode
DOIF {fhem_set"radio ".[FB]}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF