Auswirkung von set_State nicht sichtbar

Begonnen von chq, 10 November 2018, 20:21:31

Vorheriges Thema - Nächstes Thema

chq

Hallo,

hier ein "list" eines Devices, von dem ich eigentlich erwarten würde, dass es mir seinen Status (wenn ich auf "everything" klicke) anzeigt.

Leider steht dort immer nur "idle" und nie z.B. "Linker Platz 2.Reihe 1.Fenster".

Ausgeführt werden die einzelnen Blöcke, die zu einer entsprechenden Ausgabe führen müssten.

Was mache ich da falsch?

Gruß Chris

Internals:
   DEF        ## [HM_markise:state] eq "closed"

{if([24:00]){set_State("idle")}} ## idle

{if ((!$we and [16:00-22:00]) or $we) ## unter der Woche ab 16 Uhr und an Wochenenden und Feiertagen immer
{
if ([Bewohner:state] eq "home" and [Wetterstation:luminosity] >= "36000" and [Wetterstation:UVR] >= "350" and [Wetterstation:temperature] >= "10" and [HM_drehgriffEsszimmer:state] ne "open")
{
{if([twilight:azimuth] >= "219" and [twilight:azimuth] < "265" and [twilight:elevation:d1] <= "28.7" and [twilight:elevation:d1] > "23.3" and [?HM_rolloEsszimmer:control] > "92") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 92");set_State("Linker Platz 1.Reihe 1.Fenster")}} ## L11
{if([twilight:azimuth] >= "265" and [twilight:azimuth] < "292" and [twilight:elevation:d1] <= "30.3" and [twilight:elevation:d1] > "24.5" and [?HM_rolloEsszimmer:control] > "92") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 92");set_State("Linker Platz 1.Reihe 2.Fenster")}} ## L12
{if([twilight:azimuth] >= "292" and [twilight:azimuth] < "301" and [twilight:elevation:d1] <= "22.3" and [twilight:elevation:d1] > "18.7" and [?HM_rolloEsszimmer:control] > "92") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 92");set_State("Linker Platz 1.Reihe 3.Fenster")}} ## L13
{if([twilight:azimuth] >= "202" and [twilight:azimuth] < "229" and [twilight:elevation:d1] <= "23.7" and [twilight:elevation:d1] > "18.4" and [?HM_rolloEsszimmer:control] > "92") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 92");set_State("Rechter Platz 1.Reihe 1.Fenster")}} ## R11
{if([twilight:azimuth] >= "229" and [twilight:azimuth] < "265" and [twilight:elevation:d1] <= "30.5" and [twilight:elevation:d1] > "26.2" and [?HM_rolloEsszimmer:control] > "92") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 92");set_State("Rechter Platz 1.Reihe 2.Fenster")}} ## R12
{if([twilight:azimuth] >= "265" and [twilight:azimuth] < "288" and [twilight:elevation:d1] <= "30.1" and [twilight:elevation:d1] > "25.5" and [?HM_rolloEsszimmer:control] > "92") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 92");set_State("Rechter Platz 1.Reihe 3.Fenster")}} ## R13

{if([twilight:azimuth] >= "219" and [twilight:azimuth] < "265" and [twilight:elevation:d1] <= "23.3" and [twilight:elevation:d1] > "15.6" and [?HM_rolloEsszimmer:control] > "84") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 84");set_State("Linker Platz 2.Reihe 1.Fenster")}} ## L21
{if([twilight:azimuth] >= "265" and [twilight:azimuth] < "292" and [twilight:elevation:d1] <= "24.5" and [twilight:elevation:d1] > "17.6" and [?HM_rolloEsszimmer:control] > "84") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 84");set_State("Linker Platz 2.Reihe 2.Fenster")}} ## L22
{if([twilight:azimuth] >= "292" and [twilight:azimuth] < "301" and [twilight:elevation:d1] <= "18.7" and [twilight:elevation:d1] > "12.6" and [?HM_rolloEsszimmer:control] > "84") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 84");set_State("Linker Platz 2.Reihe 3.Fenster")}} ## L23
{if([twilight:azimuth] >= "202" and [twilight:azimuth] < "229" and [twilight:elevation:d1] <= "18.4" and [twilight:elevation:d1] > "13.8" and [?HM_rolloEsszimmer:control] > "84") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 84");set_State("Rechter Platz 2.Reihe 1.Fenster")}} ## R21
{if([twilight:azimuth] >= "229" and [twilight:azimuth] < "265" and [twilight:elevation:d1] <= "26.2" and [twilight:elevation:d1] > "18.3" and [?HM_rolloEsszimmer:control] > "84") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 84");set_State("Rechter Platz 2.Reihe 2.Fenster")}} ## R22
{if([twilight:azimuth] >= "265" and [twilight:azimuth] < "288" and [twilight:elevation:d1] <= "25.5" and [twilight:elevation:d1] > "18.5" and [?HM_rolloEsszimmer:control] > "84") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 84");set_State("Rechter Platz 2.Reihe 3.Fenster")}} ## R23

{if([twilight:azimuth] >= "219" and [twilight:azimuth] < "265" and [twilight:elevation:d1] <= "15.6" and [twilight:elevation:d1] > "8.0" and [?HM_rolloEsszimmer:control] > "78") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 78");set_State("Linker Platz 3.Reihe 1.Fenster")}} ## L31
{if([twilight:azimuth] >= "265" and [twilight:azimuth] < "292" and [twilight:elevation:d1] <= "17.6" and [twilight:elevation:d1] > "8.9" and [?HM_rolloEsszimmer:control] > "78") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 78");set_State("Linker Platz 3.Reihe 2.Fenster")}} ## L32
{if([twilight:azimuth] >= "292" and [twilight:azimuth] < "301" and [twilight:elevation:d1] <= "12.6" and [twilight:elevation:d1] > "6.4" and [?HM_rolloEsszimmer:control] > "78") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 78");set_State("Linker Platz 3.Reihe 3.Fenster")}} ## L33
{if([twilight:azimuth] >= "202" and [twilight:azimuth] < "229" and [twilight:elevation:d1] <= "13.8" and [twilight:elevation:d1] > "6.6" and [?HM_rolloEsszimmer:control] > "78") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 78");set_State("Rechter Platz 3.Reihe 1.Fenster")}} ## R31
{if([twilight:azimuth] >= "229" and [twilight:azimuth] < "265" and [twilight:elevation:d1] <= "18.3" and [twilight:elevation:d1] > "10.2" and [?HM_rolloEsszimmer:control] > "78") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 78");set_State("Rechter Platz 3.Reihe 2.Fenster")}} ## R32
{if([twilight:azimuth] >= "265" and [twilight:azimuth] < "288" and [twilight:elevation:d1] <= "18.5" and [twilight:elevation:d1] > "11.0" and [?HM_rolloEsszimmer:control] > "78") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 78");set_State("Rechter Platz 3.Reihe 3.Fenster")}} ## R33
}
}
}
   MODEL      Perl
   NAME       perlSonnenstand
   NR         75
   NTFY_ORDER 50-perlSonnenstand
   STATE      idle
   TYPE       DOIF
   READINGS:
     2018-11-10 20:15:26   Device          twilight
     2018-11-10 00:00:00   block_01        executed
     2018-11-10 20:15:26   block_02        executed
     2018-11-04 14:27:59   doifState       fhemCmd
     2018-11-09 15:47:05   e_Bewohner_state home
     2018-11-10 19:02:50   e_HM_drehgriffEsszimmer_state closed
     2018-11-10 17:10:25   e_Wetterstation_UVR 0.5
     2018-11-10 16:42:41   e_Wetterstation_luminosity 85.3575099975242
     2018-11-10 20:06:25   e_Wetterstation_temperature 10.35
     2018-11-10 20:15:26   e_twilight_azimuth 281.67
     2018-11-10 20:15:26   e_twilight_elevation -34.15
     2018-11-09 23:59:00   mode            enabled
     2018-11-10 00:00:00   state           idle
     2018-11-10 00:00:00   timer_01_c01    11.11.2018 00:00:00
     2018-11-09 22:00:00   timer_02_c02    10.11.2018 16:00:00
     2018-11-09 22:00:00   timer_03_c02    10.11.2018 22:00:00
   Regex:
   condition:
     0          if(::DOIF_time_once($hash,0,$wday)){set_State("idle")}
     1          if ((!$we and ::DOIF_time($hash,1,2,$wday,$hms)) or $we)  {
if (::ReadingValDoIf($hash,'Bewohner','state') eq "home" and ::ReadingValDoIf($hash,'Wetterstation','luminosity') >= "36000" and ::ReadingValDoIf($hash,'Wetterstation','UVR') >= "350" and ::ReadingValDoIf($hash,'Wetterstation','temperature') >= "10" and ::ReadingValDoIf($hash,'HM_drehgriffEsszimmer','state') ne "open")
{
{if(::ReadingValDoIf($hash,'twilight','azimuth') >= "219" and ::ReadingValDoIf($hash,'twilight','azimuth') < "265" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') <= "28.7" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') > "23.3" and ::ReadingValDoIf($hash,'HM_rolloEsszimmer','control') > "92") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 92");set_State("Linker Platz 1.Reihe 1.Fenster")}}  {if(::ReadingValDoIf($hash,'twilight','azimuth') >= "265" and ::ReadingValDoIf($hash,'twilight','azimuth') < "292" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') <= "30.3" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') > "24.5" and ::ReadingValDoIf($hash,'HM_rolloEsszimmer','control') > "92") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 92");set_State("Linker Platz 1.Reihe 2.Fenster")}}  {if(::ReadingValDoIf($hash,'twilight','azimuth') >= "292" and ::ReadingValDoIf($hash,'twilight','azimuth') < "301" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') <= "22.3" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') > "18.7" and ::ReadingValDoIf($hash,'HM_rolloEsszimmer','control') > "92") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 92");set_State("Linker Platz 1.Reihe 3.Fenster")}}  {if(::ReadingValDoIf($hash,'twilight','azimuth') >= "202" and ::ReadingValDoIf($hash,'twilight','azimuth') < "229" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') <= "23.7" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') > "18.4" and ::ReadingValDoIf($hash,'HM_rolloEsszimmer','control') > "92") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 92");set_State("Rechter Platz 1.Reihe 1.Fenster")}}  {if(::ReadingValDoIf($hash,'twilight','azimuth') >= "229" and ::ReadingValDoIf($hash,'twilight','azimuth') < "265" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') <= "30.5" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') > "26.2" and ::ReadingValDoIf($hash,'HM_rolloEsszimmer','control') > "92") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 92");set_State("Rechter Platz 1.Reihe 2.Fenster")}}  {if(::ReadingValDoIf($hash,'twilight','azimuth') >= "265" and ::ReadingValDoIf($hash,'twilight','azimuth') < "288" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') <= "30.1" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') > "25.5" and ::ReadingValDoIf($hash,'HM_rolloEsszimmer','control') > "92") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 92");set_State("Rechter Platz 1.Reihe 3.Fenster")}} 
{if(::ReadingValDoIf($hash,'twilight','azimuth') >= "219" and ::ReadingValDoIf($hash,'twilight','azimuth') < "265" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') <= "23.3" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') > "15.6" and ::ReadingValDoIf($hash,'HM_rolloEsszimmer','control') > "84") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 84");set_State("Linker Platz 2.Reihe 1.Fenster")}}  {if(::ReadingValDoIf($hash,'twilight','azimuth') >= "265" and ::ReadingValDoIf($hash,'twilight','azimuth') < "292" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') <= "24.5" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') > "17.6" and ::ReadingValDoIf($hash,'HM_rolloEsszimmer','control') > "84") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 84");set_State("Linker Platz 2.Reihe 2.Fenster")}}  {if(::ReadingValDoIf($hash,'twilight','azimuth') >= "292" and ::ReadingValDoIf($hash,'twilight','azimuth') < "301" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') <= "18.7" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') > "12.6" and ::ReadingValDoIf($hash,'HM_rolloEsszimmer','control') > "84") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 84");set_State("Linker Platz 2.Reihe 3.Fenster")}}  {if(::ReadingValDoIf($hash,'twilight','azimuth') >= "202" and ::ReadingValDoIf($hash,'twilight','azimuth') < "229" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') <= "18.4" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') > "13.8" and ::ReadingValDoIf($hash,'HM_rolloEsszimmer','control') > "84") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 84");set_State("Rechter Platz 2.Reihe 1.Fenster")}}  {if(::ReadingValDoIf($hash,'twilight','azimuth') >= "229" and ::ReadingValDoIf($hash,'twilight','azimuth') < "265" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') <= "26.2" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') > "18.3" and ::ReadingValDoIf($hash,'HM_rolloEsszimmer','control') > "84") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 84");set_State("Rechter Platz 2.Reihe 2.Fenster")}}  {if(::ReadingValDoIf($hash,'twilight','azimuth') >= "265" and ::ReadingValDoIf($hash,'twilight','azimuth') < "288" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') <= "25.5" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') > "18.5" and ::ReadingValDoIf($hash,'HM_rolloEsszimmer','control') > "84") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 84");set_State("Rechter Platz 2.Reihe 3.Fenster")}} 
{if(::ReadingValDoIf($hash,'twilight','azimuth') >= "219" and ::ReadingValDoIf($hash,'twilight','azimuth') < "265" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') <= "15.6" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') > "8.0" and ::ReadingValDoIf($hash,'HM_rolloEsszimmer','control') > "78") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 78");set_State("Linker Platz 3.Reihe 1.Fenster")}}  {if(::ReadingValDoIf($hash,'twilight','azimuth') >= "265" and ::ReadingValDoIf($hash,'twilight','azimuth') < "292" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') <= "17.6" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') > "8.9" and ::ReadingValDoIf($hash,'HM_rolloEsszimmer','control') > "78") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 78");set_State("Linker Platz 3.Reihe 2.Fenster")}}  {if(::ReadingValDoIf($hash,'twilight','azimuth') >= "292" and ::ReadingValDoIf($hash,'twilight','azimuth') < "301" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') <= "12.6" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') > "6.4" and ::ReadingValDoIf($hash,'HM_rolloEsszimmer','control') > "78") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 78");set_State("Linker Platz 3.Reihe 3.Fenster")}}  {if(::ReadingValDoIf($hash,'twilight','azimuth') >= "202" and ::ReadingValDoIf($hash,'twilight','azimuth') < "229" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') <= "13.8" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') > "6.6" and ::ReadingValDoIf($hash,'HM_rolloEsszimmer','control') > "78") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 78");set_State("Rechter Platz 3.Reihe 1.Fenster")}}  {if(::ReadingValDoIf($hash,'twilight','azimuth') >= "229" and ::ReadingValDoIf($hash,'twilight','azimuth') < "265" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') <= "18.3" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') > "10.2" and ::ReadingValDoIf($hash,'HM_rolloEsszimmer','control') > "78") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 78");set_State("Rechter Platz 3.Reihe 2.Fenster")}}  {if(::ReadingValDoIf($hash,'twilight','azimuth') >= "265" and ::ReadingValDoIf($hash,'twilight','azimuth') < "288" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') <= "18.5" and ::ReadingValDoIf($hash,'twilight','elevation','','d1') > "11.0" and ::ReadingValDoIf($hash,'HM_rolloEsszimmer','control') > "78") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 78");set_State("Rechter Platz 3.Reihe 3.Fenster")}}  }
}

   days:
   devices:
     1           Bewohner Wetterstation HM_drehgriffEsszimmer twilight
     all         Bewohner Wetterstation HM_drehgriffEsszimmer twilight
   helper:
     event      azimuth: 281.67,elevation: -34.15
     globalinit 1
     last_timer 3
     sleeptimer -1
     triggerDev twilight
     triggerEvents:
       azimuth: 281.67
       elevation: -34.15
     triggerEventsState:
       azimuth: 281.67
       elevation: -34.15
   internals:
   interval:
     1          -1
     2          1
   intervalfunc:
   intervaltimer:
   itimer:
   localtime:
     0          1541890800
     1          1541862000
     2          1541883600
   perlblock:
     0         
     1         
   readings:
     1           Bewohner:state Wetterstation:luminosity Wetterstation:UVR Wetterstation:temperature HM_drehgriffEsszimmer:state twilight:azimuth twilight:elevation
     all         Bewohner:state Wetterstation:luminosity Wetterstation:UVR Wetterstation:temperature HM_drehgriffEsszimmer:state twilight:azimuth twilight:elevation
   realtime:
     0          00:00:00
     1          16:00:00
     2          22:00:00
   time:
     0          24:00:00
     1          16:00:00
     2          22:00:00
   timeCond:
     0          0
     1          1
     2          1
   timer:
     0          0
     1          0
     2          0
   timers:
     0           0
     1           1  2
   trigger:
   triggertime:
     1541883600:
       localtime  1541883600
       hash:
     1541890800:
       localtime  1541890800
       hash:
   uiState:
   uiTable:
Attributes:
   startup    set $SELF enable
So einfach wie möglich, so kompliziert wie nötig

Ellert

Wurde in dem Beispiel eine der Bedingungen wahr, welche?

chq

#2
Hallo,

z.B. wird dieser Block ausgeführt:

{if([twilight:azimuth] >= "219" and [twilight:azimuth] < "265" and [twilight:elevation:d1] <= "28.7" and [twilight:elevation:d1] > "23.3" and [?HM_rolloEsszimmer:control] > "92") {set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 92");set_State("Linker Platz 1.Reihe 1.Fenster")}} ## L11

Ich erkenne das daran, dass der Rolladen die entspr. Position anfährt. Es könnte auch einer der folgenden fünf Blöcke ausgeführt werden, da jeweils sechs aufeinanderfolgende Blöcke dieselbe Position anfahren. Klar ist jedoch, dass mind. ein Block eines "Sechserblocks" (siehe Code oben) ausgeführt wird.

Ist vielleicht der Inhalt des darzustellenden Textes das Problem?

Linker Platz 2.Reihe 1.Fenster

Dürfen da vielleicht keine Punkte und/oder Leerzeichen enthalten sein?

Gruß Chris
So einfach wie möglich, so kompliziert wie nötig

Ellert

Dann sollte state eigentlich gesetzt werden.

Mir ist nur aufgefallen, dass Du die if Abragen in je einen Perl-Block packst das ist unüblich.

statt
{if () {}}
{if () {}}
...
so
if () {};
if () {};
...


Wenn Du bei Verschachtelungen einrückst, dann wird es lesbarer, für jemanden der helfen möchte.

Es sollte eigentlich nicht notwendig sein, aber Du könntest probieren set_State() mit einem Semikolon abzuschliessen.
Oder mal die Reihenfolge der Befehle vertauschen und sehen ob sich etwas ändert.

Damian

Bei mir kann ich set_State mit Leerzeichen, Zahlen und Punkten setzen.

Zahlen brauchen beim Vergleich nicht in Anführungszeichen gesetzt werden.

Die überflüssigen geschweiften Klammen hat Ellert schon genannt.

Die vielen gleichartigen Abfragen könnte man eleganter durch eine Funktion ersetzen, die man jeweils nur noch mit den entsprechenden Werten aufruft.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

chq

Danke, da waren gute Tipps dabei. Werde das alles mal austesten. Wird aber eine Weile dauern, da die Bedingungen nur dann erfüllt werden, wenn die Sonne in einem bestimmten Winkel wirklich auch durch die Fenster reinballert. Das ist momentan so ehr nicht der Fall.

Zitat von: Damian am 11 November 2018, 10:12:31Die vielen gleichartigen Abfragen könnte man eleganter durch eine Funktion ersetzen, die man jeweils nur noch mit den entsprechenden Werten aufruft.

Hast Du mir einen heissen Link hierfür?

Gruß Chris
So einfach wie möglich, so kompliziert wie nötig

Damian

Da würde ich nicht auf die Sonne warten. So würden Softwareentwickler nie etwas fertigstellen können ;)

Du kannst dir doch in irgend einem Device (Dummy) die passenden Readings belegen und zum Testen abfragen. Wenn alles läuft, wird wieder auf das richtige Device in der Bedingung gewechselt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

chq

#7
Hallo,

ich habe mir jetzt mal, wie empfohlen ein "Test-DOIF" namens "perlTest" gebaut, die überflüssigen Klammern, sowie auszuführende Befehle außer der Aufforderung "state" zu verändern entfernt.

## [HM_markise:state] eq "closed"

{if(["^perlTest$:^1$"]){set_State("idle")}}

{if ((!$we and [16:00-22:00]) or $we)
{
if ([Bewohner:state] eq "home" and [Wetterstation:luminosity] >= "36000" and [Wetterstation:UVR] >= "350" and [Wetterstation:temperature] >= "10" and [HM_drehgriffEsszimmer:state] ne "open")
{
if(["^perlTest$:^2$"]) {set_State("Linker Platz 1.Reihe 1.Fenster";)}
}
}
}


Schreibe ich "trigger perlTest 1" erscheint "idle".
Schreibe ich "trigger perlTest 2" bleibt "idle" unverändert stehen.

:-\

Gruß Chris

Hier das "list" von "perlTest":

Internals:
   CFGFN     
   DEF        ## [HM_markise:state] eq "closed"

{if(["^perlTest$:^1$"]){set_State("idle")}} ## idle

{if ((!$we and [16:00-22:00]) or $we) ## unter der Woche ab 16 Uhr und an Wochenenden und Feiertagen immer
{
if ([Bewohner:state] eq "home" and [Wetterstation:luminosity] >= "36000" and [Wetterstation:UVR] >= "350" and [Wetterstation:temperature] >= "10" and [HM_drehgriffEsszimmer:state] ne "open")
{
if(["^perlTest$:^2$"]) {set_State("Linker Platz 1.Reihe 1.Fenster";)} ## L11
}
}
}
   MODEL      Perl
   NAME       perlTest
   NR         68862
   NTFY_ORDER 50-perlTest
   STATE      idle
   TYPE       DOIF
   READINGS:
     2018-11-11 14:14:59   Device          Wetterstation
     2018-11-11 14:11:23   block_01        executed
     2018-11-11 14:13:55   block_02        condition c02: syntax error, line 4, at EOF

     2018-11-11 14:13:23   e_Wetterstation_UVR 438.564039450743
     2018-11-11 14:13:55   e_Wetterstation_luminosity 15922.5205397175
     2018-11-11 14:10:50   mode            enabled
     2018-11-11 14:11:23   state           idle
     2018-11-11 14:10:50   timer_01_c02    11.11.2018 16:00:00
     2018-11-11 14:10:50   timer_02_c02    11.11.2018 22:00:00
   Regex:
     cond:
       :
         0:
           "^perlTest$:^1$" ^perlTest$:^1$
         1:
           "^perlTest$:^2$" ^perlTest$:^2$
   condition:
     0          if(::EventDoIf('^perlTest$',$hash,'^1$',0)){set_State("idle")}
     1          if ((!$we and ::DOIF_time($hash,0,1,$wday,$hms)) or $we)  {
if (::ReadingValDoIf($hash,'Bewohner','state') eq "home" and ::ReadingValDoIf($hash,'Wetterstation','luminosity') >= "36000" and ::ReadingValDoIf($hash,'Wetterstation','UVR') >= "350" and ::ReadingValDoIf($hash,'Wetterstation','temperature') >= "10" and ::ReadingValDoIf($hash,'HM_drehgriffEsszimmer','state') ne "open")
{
if(::EventDoIf('^perlTest$',$hash,'^2$',0)) {set_State("Linker Platz 1.Reihe 1.Fenster";)}  }
}

   days:
   devices:
     1           Bewohner Wetterstation HM_drehgriffEsszimmer
     all         Bewohner Wetterstation HM_drehgriffEsszimmer
   helper:
     event      wind_gust: 7.9
     globalinit 1
     last_timer 2
     sleeptimer -1
     triggerDev Wetterstation
     triggerEvents:
       wind_gust: 7.9
     triggerEventsState:
       wind_gust: 7.9
   internals:
   interval:
     0          -1
     1          0
   intervalfunc:
   itimer:
   localtime:
     0          1541948400
     1          1541970000
   perlblock:
     0         
     1         
   readings:
     1           Bewohner:state Wetterstation:luminosity Wetterstation:UVR Wetterstation:temperature HM_drehgriffEsszimmer:state
     all         Bewohner:state Wetterstation:luminosity Wetterstation:UVR Wetterstation:temperature HM_drehgriffEsszimmer:state
   realtime:
     0          16:00:00
     1          22:00:00
   time:
     0          16:00:00
     1          22:00:00
   timeCond:
     0          1
     1          1
   timer:
     0          0
     1          0
   timers:
     1           0  1
   trigger:
   triggertime:
     1541948400:
       localtime  1541948400
       hash:
     1541970000:
       localtime  1541970000
       hash:
   uiState:
   uiTable:
Attributes:
So einfach wie möglich, so kompliziert wie nötig

Damian

{if(["^perlTest$:^1$"]){set_State("idle")}} ## idle
{if(["^perlTest$:^2$"]) {set_State("Linker Platz 1.Reihe 1.Fenster";)}} ## L11


Wenn mit "trigger perlTest 2" der Status hier gesetzt wird, dann weißt du woran das liegt ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

chq

#9
Ehrlich gesagt nein.  :-[
Weil sich davor keine weiteren if-Bedinungen befinden?

Gruß Chris
So einfach wie möglich, so kompliziert wie nötig

Damian

Zitat von: chq am 11 November 2018, 14:32:42
Ehrlich gesagt nein.  :-[
Weil sich davor keine weiteren if-Bedinungen bedinden?

Gruß Chris
Genau. In deiner Konstruktion ist also eine der beiden äußeren if-Abfragen nicht wahr.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

chq

#11
Ok, das habe ich soweit verstanden.

Mein eingangs geschildertes Problem war jedoch, dass Bedinungen erfüllt und Befehle ausgeführt werden, sich aber trotzdem state nicht ändert.

Ich habe das Problem nun auf eine Zeile herunterbrechen können. Beim folgenden DOIF wird sowohl das Event "fhemCmd" gesendet, als auch der Rolladen bewegt. Was offensichtlich nach wie vor nicht geschieht, ist eine Aktualisierung von state:

{if([07:17]) {set_Event("fhemCmd");set_State("Linker Platz 1.Reihe 1.Fenster");fhem_set("HM_rolloEsszimmer pct 92")}}

Gruß Chris

Das list:

Internals:
   CFGFN     
   DEF        {if([07:17]) {set_Event("fhemCmd");set_State("Linker Platz 1.Reihe 1.Fenster");fhem_set("HM_rolloEsszimmer pct 92")}}
   MODEL      Perl
   NAME       perlTest
   NR         6106
   NTFY_ORDER 50-perlTest
   STATE      initialized
   TYPE       DOIF
   READINGS:
     2018-11-12 07:17:00   block_01        executed
     2018-11-12 07:16:53   mode            enabled
     2018-11-12 07:05:48   state           initialized
     2018-11-12 07:17:00   timer_01_c01    13.11.2018 07:17:00
   Regex:
   condition:
     0          if(::DOIF_time_once($hash,0,$wday)) {set_Event("fhemCmd");set_State("Linker Platz 1.Reihe 1.Fenster");fhem_set("HM_rolloEsszimmer pct 92")}
   days:
   devices:
   helper:
     event      timer_1
     globalinit 1
     last_timer 1
     sleeptimer -1
     triggerDev
     triggerEvents:
       timer_1
   internals:
   interval:
   intervalfunc:
   itimer:
   localtime:
     0          1542089820
   perlblock:
     0         
   readings:
   realtime:
     0          07:17:00
   time:
     0          07:17:00
   timeCond:
     0          0
   timer:
     0          0
   timers:
     0           0
   triggertime:
     1542089820:
       localtime  1542089820
       hash:
   uiState:
   uiTable:
Attributes:


Edit: Nur wenn ich den Befehl "set_State("Linker Platz 1.Reihe 1.Fenster")" nach ganz vorne verschiebe, funktioniert es nun.
Ich kann das nicht verstehen, fresse es aber einfach mal so, wie es zu sein scheint.


Also so:

{if([07:17]) {set_State("Linker Platz 1.Reihe 1.Fenster");set_Event("fhemCmd");fhem_set("HM_rolloEsszimmer pct 92")}}

Zitat von: Damian am 11 November 2018, 10:12:31Die vielen gleichartigen Abfragen könnte man eleganter durch eine Funktion ersetzen, die man jeweils nur noch mit den entsprechenden Werten aufruft.

Hast Du mir einen heissen Link hierfür?
So einfach wie möglich, so kompliziert wie nötig

Damian

Bei mir funktioniert auch so etwas:

{if([07:17]) {set_Event("fhemCmd");set_State("Linker Platz 1.Reihe 1.Fenster");fhem_set("HM_rolloEsszimmer pct 92")}}

ohne Probleme. Set wird sauber gesetzt:

ZitatDEF        {if ([09:56]) {set_Event("fhemCmd");set_State("Linker Platz 1.Reihe 1.Fenster");fhem_set("bla pct 92")}}


   MODEL      Perl
   NAME       di_temptest
   NR         451
   NTFY_ORDER 50-di_temptest
   STATE      Linker Platz 1.Reihe 1.Fenster
   TYPE       DOIF
   OLDREADINGS:
   READINGS:
     2018-11-12 09:56:00   block_01        executed
     2018-11-12 09:55:09   mode            enabled
     2018-11-12 09:56:00   state           Linker Platz 1.Reihe 1.Fenster
     2018-11-12 09:56:00   timer_01_c01    13.11.2018 09:56:00

Ich hoffe du editierst über FHEMWEB im DEF-Editor und nicht in der cfg-Datei (dort müssen Semikolons gedoppelt werden)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

chq

Zitat von: Damian am 12 November 2018, 09:58:50Ich hoffe du editierst über FHEMWEB im DEF-Editor und nicht in der cfg-Datei (dort müssen Semikolons gedoppelt werden)

Ja, ich benutze ausschließlich DEF.

Gruß Chris
So einfach wie möglich, so kompliziert wie nötig

abc2006

Zitat von: chq am 12 November 2018, 07:23:03
Hast Du mir einen heissen Link hierfür?

Nein,
aber vielleicht hilft das:

DEF ([Bewohner:state] eq "home" and [Wetterstation:luminosity] >= "36000" and [Wetterstation:UVR] >= "350" and [Wetterstation:temperature] >= "10" and [HM_drehgriffEsszimmer:state] ne "open")
({
myCalcPlatz();
})


in der 99_myUtils:

sub myCalcPlatz(){
my $azimuth = ReadingsVal("twilight","azimuth","error");
my $elevation = ReadingsVal("twilight","elevation","error");
my $control = ReadingsVal("HM_rolloEsszimmer","control","error");
my $place;

if($azimuth eq "error" || $elevation eq "error" || $control eq "error)
{
## gib eine Fehlermeldung
}
if($Control > 92){

if($azimuth >= 219 && $azimuth <265 && $Elevation <=28.7 && $Elevation > 23.3)
{
my $place = "Linker Platz 1.Reihe 1.Fenster";
}
if($azimuth >= [...] && $azimuth <[...] && $Elevation <=[...] && $Elevation > [...])
{
my $place = "Linker Platz 1.Reihe 1.Fenster";
}

}## else $Control
else
{
## gib eine Meldung, dass $Control < 92
}

set_Event("fhemCmd"); ## Hier bin ich nicht sicher, was das Kommando macht. Perl-Eqivalent finden...
## HM-Rollo setzen, machst du in jedem Aufruf gleich (?), spart somit code
fhem("set HM_rolloEsszimmer pct 92");
## den Platz in ein Reading im DOIF packen:
fhem("setreading <aufrufendes DOIF> platz $place"); 
## jetzt kannst du mit
## attr <aufrufendes DOIF> stateFormat platz
## den Status anzeigen lassen...
}


evtl kannst du mit given/when weiter vereinfachen ...
kommt natürlich auch auf deine Bedingungen an ...


Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX