Dämmerung, Dimmer weitere Trigger...

Begonnen von der-Lolo, 08 Oktober 2018, 21:39:09

Vorheriges Thema - Nächstes Thema

der-Lolo

Hallo Community,
ich habe zwei Aussenleuchten, dimmbar per DMX, hier kann ich Werte von 0-255 angeben.
Als "Nachtlicht" soll die Aussenbeleuchtung zwischen 16 und 9 Uhr wenn es dämmert den Wert 50 annehmen.
Es gibt zwei Taster die Garagen Tor und Garten Tor öffnen, egal welcher der beiden betätigt wird es soll hell werden für 5 minuten...
Das hier hab ich bis jetzt:

Internals:
   DEF        ([16:00-09:00] and [twilight:light:d] < "4") (set HaustuerRechtsLicht 50,set HaustuerLinksLicht 50)
DOELSEIF ([GardenDoor] eq "set_on" and [?$SELF] eq "cmd_1")
(set HaustuerRechtsLicht 255,set HaustuerLinksLicht 255)
(set $SELF cmd_1)
DOELSEIF ([GarageDoor] eq "set_on" and [?$SELF] eq "cmd_1")
(set HaustuerRechtsLicht 255,set HaustuerLinksLicht 255)
(set $SELF cmd_1)
DOELSE ()


   MODEL      FHEM
   NAME       ALmodeSwitch
   NR         174
   NTFY_ORDER 50-ALmodeSwitch
   STATE      cmd_4
   TYPE       DOIF
   Helper:
     DBLOG:
       error:
         DbLog:
           TIME       1538941516.55373
           VALUE      IF ([ESPGardenDoor:"^direction:$"] eq "coming") (set HaustuerRechtsLicht 255,set HaustuerLinksLicht 255)  ELSE (set HaustuerRechtsLicht 50,set HaustuerLinksLicht 50,set ALmodeSwitch cmd_1): IF: unknown reading: ESPGardenDoor:"^direction
   READINGS:
     2018-10-08 21:29:43   Device          twilight
     2018-10-08 21:28:22   cmd             4
     2018-10-08 21:28:22   cmd_event       GardenDoor
     2018-10-08 21:28:22   cmd_nr          4
     2018-10-08 21:28:23   e_GardenDoor_STATE off
     2018-10-08 21:28:08   mode            enabled
     2018-10-08 21:28:22   state           cmd_4
     2018-10-08 21:28:08   timer_01_c01    09.10.2018 16:00:00
     2018-10-08 21:28:08   timer_02_c01    09.10.2018 09:00:00
     2018-10-08 21:28:22   wait_timer      no timer
   Regex:
   attr:
     cmdState:
     wait:
       0:
         0
       1:
         0
         30
       2:
         0
         30
     waitdel:
   condition:
     0          ::DOIF_time($hash,0,1,$wday,$hms) and ::ReadingValDoIf($hash,'twilight','light','','d') < "4"
     1          ::InternalDoIf($hash,'GardenDoor','STATE') eq "set_on" and ::InternalDoIf($hash,'ALmodeSwitch','STATE') eq "cmd_1"
     2          ::InternalDoIf($hash,'GarageDoor','STATE') eq "set_on" and ::InternalDoIf($hash,'ALmodeSwitch','STATE') eq "cmd_1"
   days:
   devices:
     0           twilight
     1           GardenDoor
     2           GarageDoor
     all         twilight GardenDoor GarageDoor
   do:
     0:
       0          set HaustuerRechtsLicht 50,set HaustuerLinksLicht 50
     1:
       0          set HaustuerRechtsLicht 255,set HaustuerLinksLicht 255
       1          set ALmodeSwitch cmd_1
     2:
       0          set HaustuerRechtsLicht 255,set HaustuerLinksLicht 255
       1          set ALmodeSwitch cmd_1
     3:
       0         
   helper:
     event      azimuth: 298.61,elevation: -28.77,twilight: 0,twilight_weather: 0,compasspoint: west-northwest
     globalinit 1
     last_timer 2
     sleepdevice GardenDoor
     sleepsubtimer 1
     sleeptimer -1
     timerdev   GardenDoor
     timerevent off
     triggerDev twilight
     DOIF_eventas:
       cmd_nr: 4
       cmd: 4
       cmd_event: GardenDoor
       state: cmd_4
     bm:
       DOIF_Get:
         cnt        2
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        08.10. 21:28:12
         max        1.40666961669922e-05
         tot        2.81333923339844e-05
         mAr:
           HASH(0x767cc08)
           ALmodeSwitch
           ?
       DOIF_Notify:
         cnt        329
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        08.10. 21:28:21
         max        0.0204319953918457
         tot        0.0630874633789062
         mAr:
           HASH(0x767cc08)
           HASH(0x592dfd0)
       DOIF_Set:
         cnt        16
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        08.10. 21:28:12
         max        0.0148189067840576
         tot        0.0156352519989014
         mAr:
           HASH(0x767cc08)
           ALmodeSwitch
           cmd_1
     timerevents:
       off
     timereventsState:
       state: off
     triggerEvents:
       azimuth: 298.61
       elevation: -28.77
       twilight: 0
       twilight_weather: 0
       compasspoint: west-northwest
     triggerEventsState:
       azimuth: 298.61
       elevation: -28.77
       twilight: 0
       twilight_weather: 0
       compasspoint: west-northwest
   internals:
     1           GardenDoor:STATE ALmodeSwitch:STATE
     2           GarageDoor:STATE ALmodeSwitch:STATE
     all         GardenDoor:STATE ALmodeSwitch:STATE GarageDoor:STATE
   interval:
     0          -1
     1          0
   intervalfunc:
   itimer:
   localtime:
     0          1539093600
     1          1539068400
   readings:
     0           twilight:light
     all         twilight:light
   realtime:
     0          16:00:00
     1          09:00:00
   time:
     0          16:00:00
     1          09:00:00
   timeCond:
     0          0
     1          0
   timer:
     0          0
     1          0
   timers:
     0           0  1
   trigger:
   triggertime:
     1539068400:
       localtime  1539068400
       hash:
     1539093600:
       localtime  1539093600
       hash:
   uiState:
   uiTable:
Attributes:
   room       12-AussenLicht
   wait       0:0,30:0,30


ohne jegliche DOELSEIFs funktioniert das natürlich prächtig, sobald ich aber versuche weitere Trigger ins Spiel zu bringen geschehen die komischsten Dinge...
Stimmt meine $SELF Syntax, habe ich wiedermal etwas grundsätzlich falsch verstanden? Wie kann ich verhindern das das DOIF ständig in den DOELSE zweig hüpft, diesen wollte ich nämlich ursprünglich mal zum abschalten benutzen ;-)

Ich habe ausserdem noch einen ESP als iButton Reader am GartenTor - wenn die "direction" coming ist soll es auch hell werden - das habe ich gestern versucht, aber verworfen als ich merkte das es nicht funktioniert. Komisch das das noch im list auftaucht...




Ellert

set $SELF cmd_1 setzt cmd_1 nur kurzzeitig, wenn der Befehl abgearbeitet ist, nimmt state den üblichen Wert an, die Nummer des abgearbeiteten Zweiges.

Esjay

Ich traue mich mal MSwitch ins Spiel zu bringen:

[quote author=Byte09 link=topic=86199.msg839234#msg839234 date=1537801289]
Codeschnipsel:

MSwitch-Configuration  um 'soft' zu dimmen.

Da ich doch einige Dimmer betreibe, die keine ramptime etc unterstützen , bzw nicht über register beinflussbar sind habe ich mal dieses MSwitch gebastelt, welches beliebige Dimmer soft dimmt. die Dimmgeschwindigkeit ist dabei über zwei dropdowns einstellbar ( siehe Bild ). Voraussetzung ist , das das Dimmdevice sowohl das reading ptc hat , als auch den Befehl set ptc ... versteht.

vorgehen : leeres MSwitch-Device erstellen , anhängenden Configfile einspielen - Frage nach zu dimmendem Device beantworten - fertig. Würde mich freuen , wenn es mal jemand testen würde. Umbau auf andere readings/sets ist möglich. Das Configfile benötigt mindestensdie Modulversion V2.0.


über die beiden dropdowns wird zum einen die Verzögerungszeit eingestellt , zum anderen die 'Dimmschritte' per durchlauf.

10 - 00:00:10 -alle 10 sekunden wird um 10% gedimmt

Bei entsprechender restlicher Systemkonfiguration ( genericDeviceType-light etc. ) ist dieses Device direkt über Alexa ansprechbar : Schalte Device XX%


PS:In einer Variante dieses Devices betreibe ich auch meine Tradfri etc. Lampen (MQTT) . Diese Version hat einen 'vogeschalteten' Linearschalter, da diese über MQTT einen Dimmbereich von 0 - 256 haben , Alexa z.B aber nur bis 100% versteht ( glaube ich ). Bei Interesse oder Bedarf -> kurze Anfrage hier.

[code]#I Achtung, des zu steuernde Device muss das Reading ptc haben und über set DEVICE ptc WERT angesteuert werden können !
#Q HM_1F675D#bitte dieses Device gegen ein vorhandenes Dimmer-Device ersetzen :#device
#V V2.00
#VS V2.00
#S .Device_Affected -> FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,HM_1F675D-AbsCmd1,MSwitch_Self-AbsCmd1
#S .Device_Affected_Details -> FreeCmd-AbsCmd1#[NF]cmd#[NF]cmd#[NF]{;;my $ziel = ReadingsVal("$SELF","ziel",0); # bis wohin gedimmt werden soll;;my $ist = ReadingsVal("HM_1F675D","pct",0); # zustand der lampe;;;my $steps = ReadingsVal("$SELF","steps",1); # dimmschritte pro durchgang;;Log3( "SELF", 5, "SELF: ziel ".$ziel );;;Log3( "SELF", 5, "SELF: ist ".$ist );;;if ($ist == $ziel ) # lösche wiederholung wenn ziel erreicht;; {;; fhem("set $SELF del_delays");;; return;;; };;if ($ziel > $ist );;{;;# setze zustand der lampe - steps;;$ist = $ist + $steps;;;$ist =int($ist);;;   if ($ziel < $ist );;   {;;   $ist = $ziel;;;   };;};;if ($ziel < $ist );;{;;# setze zustand der lampe - steps;;$ist = $ist - $steps; ;;$ist =int($ist);;;   if ($ziel > $ist );;   {;;   $ist = $ziel;;;   };;};;Log3( "SELF", 5, "SELF: SETTING ".$ist );;;fhem("set HM_1F675D pct $ist");;;}#[NF]#[NF]delay1#[NF]delay1#[NF]00:00:00#[NF]00:00:00#[NF]#[NF]#[NF]0#[NF]0#[NF]3#[NF]0#[ND]FreeCmd-AbsCmd2#[NF]cmd#[NF]cmd#[NF]setreading $SELF ziel [$SELF:Parameter]#[NF]set $SELF del_delays#[NF]delay1#[NF]delay1#[NF]00:00:00#[NF]00:00:00#[NF]#[NF]#[NF]#[NF]#[NF]1#[NF]0#[ND]HM_1F675D-AbsCmd1#[NF]no_action#[NF]off#[NF]#[NF]#[NF]delay1#[NF]delay1#[NF]00:00:00#[NF]00:00:00#[NF]#[NF]#[NF]#[NF]#[NF]4#[NF]0#[ND]MSwitch_Self-AbsCmd1#[NF]exec_cmd1#[NF]no_action#[NF]#[NF]#[NF]delay1#[NF]delay1#[NF][$SELF:seconds]#[NF]00:00:00#[NF]#[NF]#[NF]#[NF]#[NF]2#[NF]0
#S .Device_Events -> no_trigger
#S .First_init -> done
#S .Trigger_Whitelist -> undef
#S .Trigger_cmd_off -> no_trigger
#S .Trigger_cmd_on -> no_trigger
#S .Trigger_condition -> undef
#S .Trigger_off -> no_trigger
#S .Trigger_on -> no_trigger
#S .Trigger_time -> undef
#S .V_Check -> V2.00
#S Trigger_device -> no_trigger
#S Trigger_log -> off
#S last_event -> MSwitch_Self-AbsCmd1_conditionon
#S .sysconf -> #test#[se]#[nl]#[nl]$special="pct#[dp]slider#[ko]0#[ko]1#[ko]100#[sp]steps#[dp]1#[ko]2#[ko]3#[ko]4#[ko]5#[ko]6#[ko]7#[ko]8#[ko]9#[ko]10#[sp]seconds#[dp]00#[dp]00#[dp]01#[ko]00#[dp]00#[dp]02#[ko]00#[dp]00#[dp]03#[ko]00#[dp]00#[dp]04#[ko]00#[dp]00#[dp]05#[ko]00#[dp]00#[dp]06#[ko]00#[dp]00#[dp]07#[ko]00#[dp]00#[dp]08#[ko]00#[dp]00#[dp]09#[ko]00#[dp]00#[dp]10#[ko]00#[dp]00#[dp]30"#[sp]#[se]#[nl]#[nl]#[nl]#[nl]if#[sp]($cmd#[sp]eq#[sp]"steps")#[nl]{#[nl]MSwitch_LOG(#[sp]$name#[ko]#[sp]5#[ko]#[sp]"setting#[sp]STEPS#[sp]#[dp]#[sp]$cmd#[sp]$args[0]"#[sp])#[se]#[nl]readingsSingleUpdate(#[sp]$hash#[ko]#[sp]"steps"#[ko]#[sp]$args[0]#[ko]#[sp]1#[sp])#[se]#[nl]return#[sp]"exit"#[se]#[nl]}#[nl]#[nl]if#[sp]($cmd#[sp]eq#[sp]"seconds")#[nl]{#[nl]MSwitch_LOG(#[sp]$name#[ko]#[sp]5#[ko]#[sp]"setting#[sp]STEPS#[sp]#[dp]#[sp]$cmd#[sp]$args[0]"#[sp])#[se]#[nl]readingsSingleUpdate(#[sp]$hash#[ko]#[sp]"seconds"#[ko]#[sp]$args[0]#[ko]#[sp]1#[sp])#[se]#[nl]return#[sp]"exit"#[se]#[nl]}#[nl]#[nl]#[nl]#[nl]if#[sp]($cmd#[sp]eq#[sp]"on"#[sp]#[wa]#[wa]#[sp]$cmd#[sp]eq#[sp]"off"#[sp]#[wa]#[wa]#[sp]$cmd#[sp]eq#[sp]"pct")#[nl]{#[nl]$args[0]#[sp]=""#[sp]if#[sp]#[sp]!defined#[sp]$args[0]#[se]#[nl]my#[sp]$arg#[sp]=#[sp]$args[0]#[se]#[nl]#[sp]if#[sp]($cmd#[sp]eq#[sp]"on"#[sp]#[wa]#[wa]#[sp]$cmd#[sp]eq#[sp]"off"#[sp]#[sp]#[wa]#[wa]#[sp]$cmd#[sp]eq#[sp]"pct")#[nl]#[sp]{#[nl]#[sp]if#[sp]($cmd#[sp]eq#[sp]"pct"#[sp]&&#[sp]$arg#[sp]eq#[sp]#[st]0#[st])#[nl]#[sp]{#[nl]#[sp]$cmd#[sp]=#[st]off#[st]#[se]#[nl]#[sp]#[sp]}#[nl]if#[sp]($cmd#[sp]eq#[sp]"pct"#[sp]&&#[sp]$arg#[sp]ne#[sp]#[st]0#[st])#[nl]{#[nl]$cmd#[sp]=#[st]on#[st]#[se]#[nl]}#[sp]#[sp]#[sp]#[nl]#[sp]if#[sp](#[sp]$cmd#[sp]eq#[sp]#[st]on#[st]#[sp]&&#[sp]$arg#[sp]eq#[sp]#[st]#[st])#[nl]{#[nl]$args[0]#[sp]=#[sp]ReadingsVal(#[sp]$name#[ko]#[sp]#[st]pct#[st]#[ko]#[sp]100)#[se]#[nl]}#[nl]#[nl]if#[sp](#[sp]$cmd#[sp]eq#[sp]#[st]off#[st]#[sp]&&#[sp]$arg#[sp]eq#[sp]#[st]#[st]#[sp]#[sp]#[sp]#[sp])#[nl]{#[nl]$args[0]#[sp]=#[sp]0#[se]#[nl]}#[nl]readingsSingleUpdate(#[sp]$hash#[ko]#[sp]"pct"#[ko]#[sp]$args[0]#[ko]#[sp]1#[sp])#[se]#[nl]}#[nl]}#[nl]#[nl]#[nl]return#[sp]"end"#[se]#[nl]#[nl]
#S state -> on
#S Sys_Extension -> on
#A MSwitch_Expert -> 1
#A webCmd -> on:off:pct:steps:seconds
#A MSwitch_Debug -> 0
#A disable -> 0
#A MSwitch_Include_Webcmds -> 1
#A MSwitch_Delete_Delays -> 0
#A room -> 1_Test
#A MSwitch_Extensions -> 0
#A MSwitch_Lock_Quickedit -> 1
#A MSwitch_Mode -> Full
#A MSwitch_Ignore_Types -> notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul
#A MSwitch_Help -> 0
#A MSwitch_Include_MSwitchcmds -> 0
#A MSwitch_Include_Devicecmds -> 1
#A MSwitch_Safemode -> 0


gruss Byte09
[/quote][/code]

Grüße

der-Lolo

Puh, ich hatte gehofft wenn ich das DOIF nach den wait in cmd_1 schicke bleibt es da bis ein weiterer Trigger kommt...
Weil bedingung von cmd_1 ja wahr ist...

bzgl. mswitch - ich bin noch nicht ganz sicher - aber wenn ich den Text richtig verstehe ist es nicht das was ich will..
Ich möchte ja nicht die dim Rampe um eine Zeit in die länge ziehen sondern so etwas wie eine "spar" schaltung wenn nicht viel Licht gebraucht wird.
Also Hell dunkel schalten je nach bedarf...


Damian

Ich würde eher empfehlen strukturiert zu programmieren, als einen Endlichen-Automaten zu bauen, den man schon nach 4 Zeilen nicht mehr durchschaut.

z. B. im Perl-Modus:

DOIF
{ if ([16:00-09:00] and [$SELF:dunkel]) {
    fhem_set "HaustuerRechtsLicht,HaustuerLinksLicht 50"; set_State("Nachtlicht");
  } else {
    fhem_set "HaustuerRechtsLicht,HaustuerLinksLicht 0"; set_State("off");
  }
}
{ if (([GardenDoor] eq "set_on" or [GarageDoor] eq "set_on") and get_State() eq "Nachtlicht") {
     fhem_set "HaustuerRechtsLicht,HaustuerLinksLicht 255"; set_State("on");
     set_Exec ("Timer",30,'fhem_set"HaustuerRechtsLicht,HaustuerLinksLicht 50";set_State("Nachtlicht")');
  }
}
attr DOIF_Readings dunkel:[twilight:light:d] < 4
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#5
Und weil es so viel Spaß macht jetzt mit noch mehr Struktur: :)

DOIF
subs {
  sub licht {
    my ($helligkeit,$status)=@_;
    fhem_set "HaustuerRechtsLicht,HaustuerLinksLicht $helligkeit";
    set_State "$status";
  }
}
{ if ([16:00-09:00] and [$SELF:dunkel]) {
    licht (50,"Nachtlicht");
  } else {
    licht (0,"off");
  }
}
{ if (([GardenDoor] eq "set_on" or [GarageDoor] eq "set_on") and get_State() eq "Nachtlicht") {
     licht(255,"on");
     set_Exec ("Timer",30,'licht(50,"Nachtlicht")');
  }
}
attr DOIF_Readings dunkel:[twilight:light:d] < 4
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

der-Lolo

Guten Morgen Damian,
vielen Dank für das konstrukt - ich habe gerade versucht es in betrieb zu nehmen, da es eigentlich zu hell ist habe ich
attr ALmodeSwitch DOIF_Readings dunkel:[twilight:light:d] < 7
gesetzt, ich hatte nun erwartet das innerhalb des DOIF ein Reading dunkel auftaucht, das ist leider nicht der Fall..
Ich vermute das deswegen das ganze konstrukt nicht funktioniert, zur TestUhrzeit wechselte die schaltung auf "off"
Insgesamt gefällt mir das aber und ich bleibe am Ball...


Damian

Zitat von: der-Lolo am 10 Oktober 2018, 08:34:23
Guten Morgen Damian,
vielen Dank für das konstrukt - ich habe gerade versucht es in betrieb zu nehmen, da es eigentlich zu hell ist habe ich
attr ALmodeSwitch DOIF_Readings dunkel:[twilight:light:d] < 7
gesetzt, ich hatte nun erwartet das innerhalb des DOIF ein Reading dunkel auftaucht, das ist leider nicht der Fall..
Ich vermute das deswegen das ganze konstrukt nicht funktioniert, zur TestUhrzeit wechselte die schaltung auf "off"
Insgesamt gefällt mir das aber und ich bleibe am Ball...

ja, das Reading dunkel, wird erst erstellt, wenn der erste Trigger von [twilight:light:d] kommt.

Ich denke, ich werde zukünftig DOIF_Readings bereits beim Definieren des Attributes auswerten lassen, dann würde sofort das jeweilige Reading entstehen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

der-Lolo

Ja, das las ich hier gerade auch...

Zitat von: Damian am 19 August 2018, 19:20:45
Ein einmal gesetztes Reading bleibt doch auch nach dem Neustart erhalten. Ich werde vermutlich in der kommenden DOIF-Version, bei DOIF_Readings ein definiertes Reading bereits bei der Definition setzen.

Ist es denn möglich dieses "dunkel" per Hand zu setzen?

setreading ALmodeSwitch dunkel 1


Muss dann dort eine 1 rein..?

Damian

#9
Zitat von: der-Lolo am 10 Oktober 2018, 08:57:23
Ja, das las ich hier gerade auch...

Ist es denn möglich dieses "dunkel" per Hand zu setzen?

setreading ALmodeSwitch dunkel 1


Muss dann dort eine 1 rein..?

1 ist wahr, 0 ist falsch

Edit: Du kannst in deinem DOIF auch einen init-Block definieren, dieser wird beim Hochfahren ausgeführt:

DOIF
init {set_Reading("dunkel",[?twilight:light:d] < 7)}
...



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

der-Lolo

Danke Dir, gerade getestet und funktioniert...
Da ich das aber ja nun per Hand gesetzt habe nochmal die frage ob folgende Syntax richtig ist...
aus dem list des DOIF
Attributes:
   DOIF_Readings dunkel:([twilight:light:d] < 4)
   room       12-AussenLicht

Damian

Zitat von: der-Lolo am 10 Oktober 2018, 09:04:03
Danke Dir, gerade getestet und funktioniert...
Da ich das aber ja nun per Hand gesetzt habe nochmal die frage ob folgende Syntax richtig ist...
aus dem list des DOIF
Attributes:
   DOIF_Readings dunkel:([twilight:light:d] < 4)
   room       12-AussenLicht


Sollte so funktionieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Zitat von: Damian am 10 Oktober 2018, 08:59:43
1 ist wahr, 0 ist falsch

Edit: Du kannst in deinem DOIF auch einen init-Block definieren, dieser wird beim Hochfahren ausgeführt:

DOIF
init {set_Reading("dunkel",[?twilight:light:d] < 7)}
...


mit
DOIF
init {set_Reading("dunkel",[?twilight:light:d] < 7,1)}
...


wird auch ein Event erzeugt. Mit der aktuellen Version von heute, ist Selbsttriggerung im Perl-Modus immer an. Dadurch würde sofort beim Hochfahren der Ereignisblock mit der dunkel-Abfrage ausgewertet werden.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Warum war das Ausgangs-DOIF so kompliziert?

([16:00-09:00] and [twilight:light:d] < "4")
(set HaustuerRechtsLicht 50,set HaustuerLinksLicht 50)
DOELSEIF ([GardenDoor] eq "set_on" or [GarageDoor] eq "set_on")
(set HaustuerRechtsLicht 255,set HaustuerLinksLicht 255)
(set $SELF cmd_1)
attr wait 0:0,30


set HaustuerRechtsLicht 50,set HaustuerLinksLicht 50
könnte man (zumindest hier) noch durch
set Haustuer.*sLicht 50
vereinfachen.
Was fehlt, wäre ein "Ganz aus".

Zitat von: Damian am 10 Oktober 2018, 08:53:07Ich denke, ich werde zukünftig DOIF_Readings bereits beim Definieren des Attributes auswerten lassen, dann würde sofort das jeweilige Reading entstehen.
Zumindest für set checkall wäre es noch gut.

Damian

set $SELF cmd... im eigenen Modul zu nutzen ist kritisch zu sehen, es funktioniert nur wie hier bei Verzögerungen, ansonsten wird wegen Rekursion zuletzt der Zustand im Status abgelegt von wo der Aufruf erfolgte und nicht der vom aufgerufenen set $SELF cmd... Das dürfte bei Anwendern für Verwirrung sorgen, denn nicht jeder achtet auf solche Feinheiten.

Im Perl-Modus gibt es dieses Problem nicht - das Modul setzt nicht selbst den Status beim Schalten, sondern der Anwender. Abgesehen davon ist es besser, wie hier am Beispiel von mir aufgezeigt, wiederverwendbaren Code in Funktionen auszulagern.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF