Hauptmenü

[gelöst] Doif Frage

Begonnen von bommel-bs, 15 April 2020, 10:30:54

Vorheriges Thema - Nächstes Thema

bommel-bs

Hallo,

ich möchte meinen Küchen-Heizkörper per doif steuern.
Folgende Definition habe ich dafür gemacht:

Internals:
   DEF        ([5:00 | AT ] and [HomeOffice] eq "1")
     (setreading di_Kueche_Heizung muss_an 1)
DOELSEIF([05:00 | AT] and [wech] eq "da" and [StefanUrlaub] eq "1")
     (setreading di_Kueche_Heizung muss_an 1)
DOELSEIF([di_Kueche_Heizung:muss_an] eq "1")
     {my $Today = $mday.".".$month.".".($year - 2000);
     fhem("set Kueche_Wandthermostat_Climate controlParty 20.0 $Today 08:00 $Today 19:30")}
     (setreading di_Kueche_Heizung muss_an 0)
   FUUID      5e7c9f57-f33f-78f8-ff51-9bb0cc4199cb953d
   MODEL      FHEM
   NAME       di_Kueche_Heizung
   NOTIFYDEV  HomeOffice,global,di_Kueche_Heizung,wech,StefanUrlaub
   NR         651
   NTFY_ORDER 50-di_Kueche_Heizung
   STATE      cmd_2
   TYPE       DOIF
   VERSION    21224 2020-02-18 18:45:49
   READINGS:
     2020-04-15 05:00:00   cmd             2
     2020-04-15 05:00:00   cmd_event       timer_2
     2020-04-15 05:00:00   cmd_nr          2
     2020-04-14 18:50:25   mode            enabled
     2020-04-15 05:00:00   muss_an         1
     2020-04-15 05:00:00   state           cmd_2
     2020-04-15 05:00:00   timer_01_c01    16.04.2020 05:00:00|AT
     2020-04-15 05:00:00   timer_02_c02    16.04.2020 05:00:00|AT
   Regex:
     accu:
     cond:
       HomeOffice:
         0:
           &STATE     ^HomeOffice$
       StefanUrlaub:
         1:
           &STATE     ^StefanUrlaub$
       di_Kueche_Heizung:
         2:
           muss_an    ^di_Kueche_Heizung$:^muss_an:
       wech:
         1:
           &STATE     ^wech$
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday,"AT") and ::InternalDoIf($hash,'HomeOffice','STATE') eq "1"
     1          ::DOIF_time_once($hash,1,$wday,"AT") and ::InternalDoIf($hash,'wech','STATE') eq "da" and ::InternalDoIf($hash,'StefanUrlaub','STATE') eq "1"
     2          ::ReadingValDoIf($hash,'di_Kueche_Heizung','muss_an') eq "1"
   days:
     0          AT
     1          AT
   do:
     0:
       0          setreading di_Kueche_Heizung muss_an 1
     1:
       0          setreading di_Kueche_Heizung muss_an 1
     2:
       0          {my $Today = $mday.".".$month.".".($year - 2000);      fhem("set Kueche_Wandthermostat_Climate controlParty 20.0 $Today 08:00 $Today 19:30")}
       1          setreading di_Kueche_Heizung muss_an 0
     3:
   helper:
     DEVFILTER  ^global$|^di_Kueche_Heizung$|^wech$|^HomeOffice$|^StefanUrlaub$
     NOTIFYDEV  global|di_Kueche_Heizung|wech|HomeOffice|StefanUrlaub
     event      timer_2
     globalinit 1
     last_timer 2
     sleeptimer -1
     timerdev   
     timerevent timer_2
     triggerDev
     timerevents:
       timer_2
     timereventsState:
       timer_2
     triggerEvents:
       timer_2
     triggerEventsState:
       timer_2
   internals:
     all         HomeOffice:STATE wech:STATE StefanUrlaub:STATE
   interval:
   intervalfunc:
   localtime:
     0          1587006000
     1          1587006000
   readings:
     all         di_Kueche_Heizung:muss_an
   realtime:
     0          05:00:00
     1          05:00:00
   time:
     0          5:00
     1          05:00:00
   timeCond:
     0          0
     1          1
   timer:
     0          0
     1          0
   timers:
     0           0
     1           1
   triggertime:
     1587006000:
       localtime  1587006000
       hash:
   uiState:
   uiTable:
Attributes:
   do         always
   room       99_System


Morgens um 5 Uhr wir das Reading di_Kueche_Heizung muss_an auf 1 gesetzt.Leider funktioniert der zweite Teil nicht. DOELSEIF([di_Kueche_Heizung:muss_an] eq "1") wird leider nicht ausgeführt. Unterstützt DOIF meine Idee nicht oder habe ich micht nur vertan / verschreiben?

Danke für die Hilfe
Stefan

Damian

DOIF führt standardmäßig immer nur einen Zweig aus. Wenn du zwei Dinge gleichzeitig ausführen willst, musst du sie in einen Zweig packen und dann per IF die einzelnen Anweisungen ausführen.

Alternativen: eine andere Zeit nehmen oder DOIF-Perl nutzen
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

KernSani

Ich verstehe nicht ganz, was du erreichen willst... Im ersten DOELSEIF-Zweig setzt du das reading und im zweiten DOELSEIF möchtest du auf das Setzen dieses readings reagieren?
Mögliche Probleme hierbei:
* CMD_2 (also der erste DOELSEIF-Zweig) ist bereits ausgeführt, daher kann nicht auch noch CMD_3 ausgeführt werden
* zumindest bei notify erzeugt setreading kein Event, wenn ein reading im auslösenden Device gesetzt wird, das heisst es wird auch nicht erneut getriggert. Abhilfe steht in der Commandref:
ZitatUse "sleep 0.1; setreading X Y Z" in this case.
. Vielleicht hilft das ja...
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

bommel-bs

danke,

die Verzögerung um 0.1 Sekunden brachte das gewünschte Ergebnis.