DOIF: Zeitangabe in Bedingung im Ausführungsteil und Strukturierung

Begonnen von h002, 10 März 2022, 13:20:34

Vorheriges Thema - Nächstes Thema

h002

Ich bekomme den Fehler "IF: unknown Device: 09" bei Prüfung des folgenden DOIF-Teils. Bedeutet dies, dass ich keine Zeitangabe (Zeitraum) im IF eines Ausführungsteils hinterlegen kann und doch auf den Perl-Modus zurückgreifen muss?


( [dim_Warmwassertemperatur] or [dim_Ruecklauftemperatur] ) (
setreading HeizungSteuerung diff_SOLL_IST {([dim_Ruecklaufsolltemperatur] + [dim_HeizungHysterese] - [dim_Ruecklauftemperatur])},
IF ( [09:30-13:45] and [dim_status_heatpump:state] == 2 and [HeizungSteuerung:diff_SOLL_IST] < 0.2 and [PROPLANTA:fc0_rad] > 2.9 and [dim_Warmwassertemperatur:state] < 49 ) (
set dim_WarmwasserHysterese 0,
set dim_WarmwasserSollTemperatur 60,
msg Heizung: Rücklauftemperatur fast erreicht. Es fehlen noch ([HeizungSteuerung:diff_SOLL_IST]). Warmwasser: [dim_Warmwassertemperatur:state]
)
)


Zur Vollständigkeit noch mal das komplette DOIF


Internals:
   DEF        ##wenn Heizung aktiviert wird
([dim_status_heatpump:state] == 2)
(msg Heizung wurde aktiviert)
##wenn Warmwasser aktiviert wird
DOELSEIF ([dim_status_heatpump:state] == 4)
(msg Warmwassererwärmung wurde aktiviert)
##wenn Nacherwärmung Warmwasser
DOELSEIF ([dim_block_heatpump:state] == 13)
(msg Nacherwärmung Warmwasser aktiviert)
(set dim_Parallelverschiebung 21)
(set dim_HeizungHysterese 3)
##wenn Hochdruck z.B. nach Nacherwärmung Warmwasser
DOELSEIF ([dim_block_heatpump:state] == 19)
(set dim_Parallelverschiebung 21)
(set dim_HeizungHysterese 3)
DOELSEIF ([dim_status_heatpump:state] == 1)
(msg Dimplex wurde deaktiviert)
(set dim_Parallelverschiebung 21)
(set dim_HeizungHysterese 3)
(set dim_WarmwasserSollTemperatur 48)
(set dim_WarmwasserHysterese 4)
##20 Uhr prüfen, wie stark die globale Strahlung am Folgetag ist
DOELSEIF ([20:00]) (
IF ( [PROPLANTA:fc1_rad] > 2.9 ) (
IF ( [HeizungSteuerung:AbsenkungAktiv] eq "ja" ) (
set dimplexSIW8TES dimhp_trigger_value 1-hc-lower,
set dimplexSIW8TES dimhp_trigger_monday time1,
set dimplexSIW8TES dimhp_trigger_tuesday time1,
set dimplexSIW8TES dimhp_trigger_wednesday time1,
set dimplexSIW8TES dimhp_trigger_thursday time1,
set dimplexSIW8TES dimhp_trigger_friday time1,
set dimplexSIW8TES dimhp_trigger_saturday time1,
set dimplexSIW8TES dimhp_trigger_sunday time1
)
IF ( [HeizungSteuerung:AnhebungAktiv] eq "ja" ) (
set dimplexSIW8TES dimhp_trigger_value 1-hc-raise,
set dimplexSIW8TES dimhp_trigger_monday time1,
set dimplexSIW8TES dimhp_trigger_tuesday time1,
set dimplexSIW8TES dimhp_trigger_wednesday time1,
set dimplexSIW8TES dimhp_trigger_thursday time1,
set dimplexSIW8TES dimhp_trigger_friday time1,
set dimplexSIW8TES dimhp_trigger_saturday time1,
set dimplexSIW8TES dimhp_trigger_sunday time1
)

) ELSE (
set dimplexSIW8TES dimhp_trigger_value 1-hc-lower,
set dimplexSIW8TES dimhp_trigger_monday no,
set dimplexSIW8TES dimhp_trigger_tuesday no,
set dimplexSIW8TES dimhp_trigger_wednesday no,
set dimplexSIW8TES dimhp_trigger_thursday no,
set dimplexSIW8TES dimhp_trigger_friday no,
set dimplexSIW8TES dimhp_trigger_saturday no,
set dimplexSIW8TES dimhp_trigger_sunday no,

set dimplexSIW8TES dimhp_trigger_value 1-hc-raise,
set dimplexSIW8TES dimhp_trigger_monday no,
set dimplexSIW8TES dimhp_trigger_tuesday no,
set dimplexSIW8TES dimhp_trigger_wednesday no,
set dimplexSIW8TES dimhp_trigger_thursday no,
set dimplexSIW8TES dimhp_trigger_friday no,
set dimplexSIW8TES dimhp_trigger_saturday no,
set dimplexSIW8TES dimhp_trigger_sunday no,
##Aktuell Uhrzeit setzen Uhrzeit
set dimplexSIW8TES dimhp_time_hour $hour,
set dimplexSIW8TES dimhp_timeset_hour 1,
set dimplexSIW8TES dimhp_time_minute $min,
set dimplexSIW8TES dimhp_timeset_minute 1
)
)
DOELSEIF ( [dim_Warmwassertemperatur] or [dim_Ruecklauftemperatur] ) (
setreading HeizungSteuerung diff_SOLL_IST {([dim_Ruecklaufsolltemperatur] + [dim_HeizungHysterese] - [dim_Ruecklauftemperatur])},
IF ( [09:30-13:45] and [dim_status_heatpump:state] == 2 and [HeizungSteuerung:diff_SOLL_IST] < 0.2 and [PROPLANTA:fc0_rad] > 2.9 and [dim_Warmwassertemperatur:state] < 49 ) (
set dim_WarmwasserHysterese 0,
set dim_WarmwasserSollTemperatur 60,
msg Heizung: Rücklauftemperatur fast erreicht. Es fehlen noch ([HeizungSteuerung:diff_SOLL_IST]). Warmwasser: [dim_Warmwassertemperatur:state]
)
)
DOELSE
   FUUID      620fc9a2-f33f-8b20-0eb2-d2136a448da8f3c4
   MODEL      FHEM
   NAME       HeizungSteuerung
   NOTIFYDEV  dim_Ruecklauftemperatur,dim_Warmwassertemperatur,global,dim_status_heatpump,dim_block_heatpump
   NR         182
   NTFY_ORDER 50-HeizungSteuerung
   STATE      cmd_7
   TYPE       DOIF
   VERSION    25756 2022-02-28 08:27:14
   OLDREADINGS:
   READINGS:
     2022-03-08 18:08:15   AbsenkungAktiv  ja
     2022-03-08 12:25:55   AnhebungAktiv   nein
     2022-03-10 13:23:29   Device          dim_Ruecklauftemperatur
     2022-03-10 13:23:29   cmd             7
     2022-03-10 13:23:29   cmd_event       dim_Ruecklauftemperatur
     2022-03-10 13:23:29   cmd_nr          7
     2022-03-10 13:23:29   diff_SOLL_IST   3.9
     2022-03-10 13:23:29   e_dim_Ruecklauftemperatur_STATE 24.3
     2022-03-10 13:19:13   e_dim_Warmwassertemperatur_STATE 60.6
     2022-03-10 13:23:29   error            IF ( [09:30-13:45] and [dim_status_heatpump:state] == 2 and [HeizungSteuerung:diff_SOLL_IST] < 0.2 and [PROPLANTA:fc0_rad] > 2.9 and [dim_Warmwassertemperatur:state] < 49 ) ( set dim_WarmwasserHysterese 0, set dim_WarmwasserSollTemperatur 60, msg Heizung: Rücklauftemperatur fast erreicht. Es fehlen noch ([HeizungSteuerung:diff_SOLL_IST]). Warmwasser: [dim_Warmwassertemperatur:state] ): IF: unknown Device: 09
     2022-03-10 13:13:24   mode            enabled
     2022-03-10 13:23:29   state           cmd_7
     2022-03-10 13:13:24   timer_01_c06    10.03.2022 20:00:00
   Regex:
     accu:
     collect:
     cond:
       dim_Ruecklauftemperatur:
         0:
         1:
         2:
         3:
         4:
         5:
         6:
           &STATE     ^dim_Ruecklauftemperatur$
       dim_Warmwassertemperatur:
         0:
         1:
         2:
         3:
         4:
         5:
         6:
           &STATE     ^dim_Warmwassertemperatur$
       dim_block_heatpump:
         2:
           state      ^dim_block_heatpump$:^state:
         3:
           state      ^dim_block_heatpump$:^state:
       dim_status_heatpump:
         0:
           state      ^dim_status_heatpump$:^state:
         1:
           state      ^dim_status_heatpump$:^state:
         4:
           state      ^dim_status_heatpump$:^state:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'dim_status_heatpump','state') == 2
     1          ::ReadingValDoIf($hash,'dim_status_heatpump','state') == 4
     2          ::ReadingValDoIf($hash,'dim_block_heatpump','state') == 13
     3          ::ReadingValDoIf($hash,'dim_block_heatpump','state') == 19
     4          ::ReadingValDoIf($hash,'dim_status_heatpump','state') == 1
     5          ::DOIF_time_once($hash,0,$wday)
     6           ::InternalDoIf($hash,'dim_Warmwassertemperatur','STATE') or ::InternalDoIf($hash,'dim_Ruecklauftemperatur','STATE')
   days:
   do:
     0:
       0          msg Heizung wurde aktiviert
     1:
       0          msg Warmwassererwärmung wurde aktiviert
     2:
       0          msg Nacherwärmung Warmwasser aktiviert
       1          set dim_Parallelverschiebung 21
       2          set dim_HeizungHysterese 3
     3:
       0          set dim_Parallelverschiebung 21
       1          set dim_HeizungHysterese 3
     4:
       0          msg Dimplex wurde deaktiviert
       1          set dim_Parallelverschiebung 21
       2          set dim_HeizungHysterese 3
       3          set dim_WarmwasserSollTemperatur 48
       4          set dim_WarmwasserHysterese 4
     5:
       0            IF ( [PROPLANTA:fc1_rad] > 2.9 ) ( IF ( [HeizungSteuerung:AbsenkungAktiv] eq "ja" ) ( set dimplexSIW8TES dimhp_trigger_value 1-hc-lower, set dimplexSIW8TES dimhp_trigger_monday time1, set dimplexSIW8TES dimhp_trigger_tuesday time1, set dimplexSIW8TES dimhp_trigger_wednesday time1, set dimplexSIW8TES dimhp_trigger_thursday time1, set dimplexSIW8TES dimhp_trigger_friday time1, set dimplexSIW8TES dimhp_trigger_saturday time1, set dimplexSIW8TES dimhp_trigger_sunday time1 ) IF ( [HeizungSteuerung:AnhebungAktiv] eq "ja" ) ( set dimplexSIW8TES dimhp_trigger_value 1-hc-raise, set dimplexSIW8TES dimhp_trigger_monday time1, set dimplexSIW8TES dimhp_trigger_tuesday time1, set dimplexSIW8TES dimhp_trigger_wednesday time1, set dimplexSIW8TES dimhp_trigger_thursday time1, set dimplexSIW8TES dimhp_trigger_friday time1, set dimplexSIW8TES dimhp_trigger_saturday time1, set dimplexSIW8TES dimhp_trigger_sunday time1 ) ) ELSE ( set dimplexSIW8TES dimhp_trigger_value 1-hc-lower, set dimplexSIW8TES dimhp_trigger_monday no, set dimplexSIW8TES dimhp_trigger_tuesday no, set dimplexSIW8TES dimhp_trigger_wednesday no, set dimplexSIW8TES dimhp_trigger_thursday no, set dimplexSIW8TES dimhp_trigger_friday no, set dimplexSIW8TES dimhp_trigger_saturday no, set dimplexSIW8TES dimhp_trigger_sunday no, set dimplexSIW8TES dimhp_trigger_value 1-hc-raise, set dimplexSIW8TES dimhp_trigger_monday no, set dimplexSIW8TES dimhp_trigger_tuesday no, set dimplexSIW8TES dimhp_trigger_wednesday no, set dimplexSIW8TES dimhp_trigger_thursday no, set dimplexSIW8TES dimhp_trigger_friday no, set dimplexSIW8TES dimhp_trigger_saturday no, set dimplexSIW8TES dimhp_trigger_sunday no, set dimplexSIW8TES dimhp_time_hour $hour, set dimplexSIW8TES dimhp_timeset_hour 1, set dimplexSIW8TES dimhp_time_minute $min, set dimplexSIW8TES dimhp_timeset_minute 1 )
     6:
       0            setreading HeizungSteuerung diff_SOLL_IST {([dim_Ruecklaufsolltemperatur] + [dim_HeizungHysterese] - [dim_Ruecklauftemperatur])}, IF ( [09:30-13:45] and [dim_status_heatpump:state] == 2 and [HeizungSteuerung:diff_SOLL_IST] < 0.2 and [PROPLANTA:fc0_rad] > 2.9 and [dim_Warmwassertemperatur:state] < 49 ) ( set dim_WarmwasserHysterese 0, set dim_WarmwasserSollTemperatur 60, msg Heizung: Rücklauftemperatur fast erreicht. Es fehlen noch ([HeizungSteuerung:diff_SOLL_IST]). Warmwasser: [dim_Warmwassertemperatur:state] )
     7:
       0         
   helper:
     NOTIFYDEV  dim_Ruecklauftemperatur,dim_Warmwassertemperatur,global,dim_status_heatpump,dim_block_heatpump
     event      24.3
     globalinit 1
     last_timer 1
     sleeptimer -1
     timerdev   dim_Ruecklauftemperatur
     timerevent 24.3
     triggerDev dim_Ruecklauftemperatur
     DOIF_eventa:
       cmd_nr: 7
       cmd: 7
       cmd_event: dim_Ruecklauftemperatur
       error:  IF ( [09:30-13:45] and [dim_status_heatpump:state] == 2 and [HeizungSteuerung:diff_SOLL_IST] < 0.2 and [PROPLANTA:fc0_rad] > 2.9 and [dim_Warmwassertemperatur:state] < 49 ) ( set dim_WarmwasserHysterese 0, set dim_WarmwasserSollTemperatur 60, msg Heizung: Rücklauftemperatur fast erreicht. Es fehlen noch ([HeizungSteuerung:diff_SOLL_IST]). Warmwasser: [dim_Warmwassertemperatur:state] ): IF: unknown Device: 09
       cmd_7
     DOIF_eventas:
       cmd_nr: 7
       cmd: 7
       cmd_event: dim_Ruecklauftemperatur
       error:  IF ( [09:30-13:45] and [dim_status_heatpump:state] == 2 and [HeizungSteuerung:diff_SOLL_IST] < 0.2 and [PROPLANTA:fc0_rad] > 2.9 and [dim_Warmwassertemperatur:state] < 49 ) ( set dim_WarmwasserHysterese 0, set dim_WarmwasserSollTemperatur 60, msg Heizung: Rücklauftemperatur fast erreicht. Es fehlen noch ([HeizungSteuerung:diff_SOLL_IST]). Warmwasser: [dim_Warmwassertemperatur:state] ): IF: unknown Device: 09
       state: cmd_7
     timerevents:
       24.3
     timereventsState:
       state: 24.3
     triggerEvents:
       24.3
     triggerEventsState:
       state: 24.3
   internals:
     all         dim_Warmwassertemperatur:STATE dim_Ruecklauftemperatur:STATE
   intervalfunc:
   localtime:
     0          1646938800
   readings:
     all         dim_status_heatpump:state dim_block_heatpump:state
   realtime:
     0          20:00:00
   time:
     0          20:00:00
   timeCond:
     0          5
   timer:
     0          0
   timers:
     5           0
   trigger:
   triggertime:
     1646938800:
       localtime  1646938800
       hash:
   uiState:
   uiTable:
Attributes:
   do         always
   readingList AnhebungAktiv AbsenkungAktiv
   room       Dimplex,E3DC
   setList    AnhebungAktiv:ja,nein AbsenkungAktiv:ja,nein

rabehd

Schieb das mal ins Unterforum DOIF.

Mir graut schon, wenn ich diese vielen IFs sehe. Schön ist das nicht.
Vermutlich geht es nicht eine Zeitbedingung im Ausführungsteil zu benutzten.
Meine Empfehlung: Umbau des DOIF.
Auch funktionierende Lösungen kann man hinterfragen.

h002

Zitat von: rabehd am 10 März 2022, 13:38:43
Mir graut schon, wenn ich diese vielen IFs sehe. Schön ist das nicht.
Vermutlich geht es nicht eine Zeitbedingung im Ausführungsteil zu benutzten.
Meine Empfehlung: Umbau des DOIF.

Was meinst du mit Umbau? Wie könnte ich besser strukturieren?

Für meine Problemstellung spielen die anderen Bedingungen keine Rolle, da sie funktionieren. Mir geht es hauptsächlich um die Zeitangabe im Ausführungsteil. Dazu habe ich in der commandref nichts gefunden. Da die FHEM-Methode mittels [device:reading] funktioniert, dachte ich auch die Zeitangabe funktioniert analog.

Aber generell würde mich jetzt schon noch zusätzlich die bessere Strukturierung interessieren. ;-)

Damian

Zitat von: h002 am 10 März 2022, 13:47:20
Was meinst du mit Umbau? Wie könnte ich besser strukturieren?

Für meine Problemstellung spielen die anderen Bedingungen keine Rolle, da sie funktionieren. Mir geht es hauptsächlich um die Zeitangabe im Ausführungsteil. Dazu habe ich in der commandref nichts gefunden. Da die FHEM-Methode mittels [device:reading] funktioniert, dachte ich auch die Zeitangabe funktioniert analog.

Aber generell würde mich jetzt schon noch zusätzlich die bessere Strukturierung interessieren. ;-)

IF kann grundsätzlich nicht mit Zeiten umgehen, das ist eine DOIF-Eigenschaft. Im DOIF-Perlmodus geht das.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

h002

Zitat von: Damian am 10 März 2022, 14:29:29
IF kann grundsätzlich nicht mit Zeiten umgehen, das ist eine DOIF-Eigenschaft. Im DOIF-Perlmodus geht das.

Folgendes habe ich mit dem Perlmodus auch erfolglos versucht. Hier kommt es zu dem Fehler "Illegal octal digit '9' at (eval 4052927) line 1, at end of line
syntax error at (eval 4052927) line 1, near "09:"


Vermutlich meinst du den Perl-Modus wie im Wiki beschrieben (https://wiki.fhem.de/wiki/DOIF/Perl-Modus). Es geht also auch nicht, wenn ich Perl im Ausführungsteil verwende, oder?


Internals:
   DEF        ( [dim_Warmwassertemperatur] or [dim_Ruecklauftemperatur] ) {
if ( [09:30-13:45] and [dim_status_heatpump:state] == 2 and [HeizungSteuerung:diff_SOLL_IST] < 0.2 and [PROPLANTA:fc0_rad] > 2.9 and [dim_Warmwassertemperatur:state] < 49 ) {
fhem("msg test");
}
}
DOELSE
   FUUID      622a02ea-f33f-8b20-763d-90c081e4865b83d5
   MODEL      FHEM
   NAME       testDOIF
   NOTIFYDEV  global,dim_Warmwassertemperatur,dim_Ruecklauftemperatur
   NR         230178
   NTFY_ORDER 50-testDOIF
   STATE      cmd_1
   TYPE       DOIF
   VERSION    25756 2022-02-28 08:27:14
   READINGS:
     2022-03-10 14:56:42   cmd             1
     2022-03-10 14:56:42   cmd_event       testDOIF
     2022-03-10 14:56:42   cmd_nr          1
     2022-03-10 14:56:42   error           { if ( [09:30-13:45] and 1 == 2 and 4 < 0.2 and 3.4 > 2.9 and 60.3 < 49 ) { fhem("msg test"); } }: Illegal octal digit '9' at (eval 4052927) line 1, at end of line
syntax error at (eval 4052927) line 1, near "09:"
syntax error at (eval 4052927) line 1, near "} }"

     2022-03-10 14:56:33   mode            enabled
     2022-03-10 14:56:42   state           cmd_1
   Regex:
     accu:
     collect:
     cond:
       dim_Ruecklauftemperatur:
         0:
           &STATE     ^dim_Ruecklauftemperatur$
       dim_Warmwassertemperatur:
         0:
           &STATE     ^dim_Warmwassertemperatur$
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0           ::InternalDoIf($hash,'dim_Warmwassertemperatur','STATE') or ::InternalDoIf($hash,'dim_Ruecklauftemperatur','STATE')
   do:
     0:
       0          { if ( [09:30-13:45] and [dim_status_heatpump:state] == 2 and [HeizungSteuerung:diff_SOLL_IST] < 0.2 and [PROPLANTA:fc0_rad] > 2.9 and [dim_Warmwassertemperatur:state] < 49 ) { fhem("msg test"); } }
     1:
       0         
   helper:
     NOTIFYDEV  global,dim_Warmwassertemperatur,dim_Ruecklauftemperatur
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   
     timerevent
     timerevents
     timereventsState
     triggerDev
     DOIF_eventa:
       cmd_nr: 1
       cmd: 1
       cmd_event: testDOIF
       error: { if ( [09:30-13:45] and 1 == 2 and 4 < 0.2 and 3.4 > 2.9 and 60.3 < 49 ) { fhem("msg test"); } }: Illegal octal digit '9' at (eval 4052927) line 1, at end of line
syntax error at (eval 4052927) line 1, near "09:"
syntax error at (eval 4052927) line 1, near "} }"

       cmd_1
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: testDOIF
       error: { if ( [09:30-13:45] and 1 == 2 and 4 < 0.2 and 3.4 > 2.9 and 60.3 < 49 ) { fhem("msg test"); } }: Illegal octal digit '9' at (eval 4052927) line 1, at end of line
syntax error at (eval 4052927) line 1, near "09:"
syntax error at (eval 4052927) line 1, near "} }"

       state: cmd_1
   internals:
     all         dim_Warmwassertemperatur:STATE dim_Ruecklauftemperatur:STATE
   uiState:
   uiTable:
Attributes:

h002

Eigentlich ist meine Frage beantwortet. Der Perl-Modus ist für mich persönlich geeigneter und ich werde meine DOIFs umstellen. Den Schupser hab ich gebraucht. :-)

Danke euch beiden ...

h002

Ich würde das Thema Sturkturierung gerne noch mal aufgreifen, um das Setzen einiger Readings im DOIF übersichtlicher zu gestalten. Mein DOIF habe ich jetzt im Perl-Modus gestaltet.


Aktuell sieht es so aus:

Internals:
   DEF        start_heizen {
if ( [dim_status_heatpump:state] == 2 ) {
fhem_set"signal send Heizung wurde aktiviert";
}
}
start_warmwasser {
if ( [dim_status_heatpump:state] == 4 ) {
fhem_set"signal send Warmwasser wurde aktiviert";
}
}
start_nacherwaermung_block {
if ( [dim_block_heatpump:state] == 13 or [dim_block_heatpump:state] == 19) {
fhem_set"signal send Nacherwärmung Warmwasser wurde aktiviert oder Hochdruck. ".[dim_block_heatpump];
fhem_set"dim_Parallelverschiebung 21";
fhem_set"dim_HeizungHysterese 3";
}
}
stop_heizung {
if ( [dim_status_heatpump:state] == 1) {
fhem_set"signal send Heizung deaktiviert";
fhem_set"dim_Parallelverschiebung 21";
fhem_set"dim_HeizungHysterese 3";
fhem_set"dim_WarmwasserSollTemperatur 48";
fhem_set"dim_WarmwasserHysterese 4";
}
}
dimplex_zeitplan_setzen {
if ( [20:00] ) {
if ( [PROPLANTA:fc1_rad] > 2.9 ) {
if ( [$SELF:AbsenkungAktiv] eq "ja" ) {
fhem_set"dimplexSIW8TES dimhp_trigger_value 1-hc-lower";
##fhem_set"dimplexSIW8TES dimhp_trigger_(monday|tuesday|wednesday|thursday|friday|saturday|sunday) time1";
fhem_set"dimplexSIW8TES dimhp_trigger_monday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_tuesday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_wednesday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_thursday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_friday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_saturday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_sunday time1";
} elsif ( [$SELF:AbsenkungAktiv] eq "nein" ) {
fhem_set"dimplexSIW8TES dimhp_trigger_value 1-hc-lower";
##fhem_set"dimplexSIW8TES dimhp_trigger_monday,dimhp_trigger_tuesday,dimhp_trigger_wednesday,dimhp_trigger_thursday,dimhp_trigger_friday,dimhp_trigger_saturday,dimhp_trigger_sunday no";
fhem_set"dimplexSIW8TES dimhp_trigger_monday no";
fhem_set"dimplexSIW8TES dimhp_trigger_tuesday no";
fhem_set"dimplexSIW8TES dimhp_trigger_wednesday no";
fhem_set"dimplexSIW8TES dimhp_trigger_thursday no";
fhem_set"dimplexSIW8TES dimhp_trigger_friday no";
fhem_set"dimplexSIW8TES dimhp_trigger_saturday no";
fhem_set"dimplexSIW8TES dimhp_trigger_sunday no";
}
if ( [$SELF:AnhebungAktiv] eq "ja" ) {
fhem_set"dimplexSIW8TES dimhp_trigger_value 1-hc-raise";
##fhem_set"dimplexSIW8TES dimhp_trigger_(monday|tuesday|wednesday|thursday|friday|saturday|sunday) time1";
fhem_set"dimplexSIW8TES dimhp_trigger_monday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_tuesday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_wednesday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_thursday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_friday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_saturday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_sunday time1";
} elsif ( [$SELF:AnhebungAktiv] eq "nein" ) {
fhem_set"dimplexSIW8TES dimhp_trigger_value 1-hc-raise";
##fhem_set"dimplexSIW8TES dimhp_trigger_monday,dimhp_trigger_tuesday,dimhp_trigger_wednesday,dimhp_trigger_thursday,dimhp_trigger_friday,dimhp_trigger_saturday,dimhp_trigger_sunday no";
fhem_set"dimplexSIW8TES dimhp_trigger_monday no";
fhem_set"dimplexSIW8TES dimhp_trigger_tuesday no";
fhem_set"dimplexSIW8TES dimhp_trigger_wednesday no";
fhem_set"dimplexSIW8TES dimhp_trigger_thursday no";
fhem_set"dimplexSIW8TES dimhp_trigger_friday no";
fhem_set"dimplexSIW8TES dimhp_trigger_saturday no";
fhem_set"dimplexSIW8TES dimhp_trigger_sunday no";
}
} else {
fhem_set"dimplexSIW8TES dimhp_trigger_value 1-hc-lower";
##fhem_set"dimplexSIW8TES dimhp_trigger_monday,dimhp_trigger_tuesday,dimhp_trigger_wednesday,dimhp_trigger_thursday,dimhp_trigger_friday,dimhp_trigger_saturday,dimhp_trigger_sunday no";
fhem_set"dimplexSIW8TES dimhp_trigger_monday no";
fhem_set"dimplexSIW8TES dimhp_trigger_tuesday no";
fhem_set"dimplexSIW8TES dimhp_trigger_wednesday no";
fhem_set"dimplexSIW8TES dimhp_trigger_thursday no";
fhem_set"dimplexSIW8TES dimhp_trigger_friday no";
fhem_set"dimplexSIW8TES dimhp_trigger_saturday no";
fhem_set"dimplexSIW8TES dimhp_trigger_sunday no";

fhem_set"dimplexSIW8TES dimhp_trigger_value 1-hc-raise";
##fhem_set"sdimplexSIW8TES dimhp_trigger_(monday|tuesday|wednesday|thursday|friday|saturday|sunday) no";
fhem_set"dimplexSIW8TES dimhp_trigger_monday no";
fhem_set"dimplexSIW8TES dimhp_trigger_tuesday no";
fhem_set"dimplexSIW8TES dimhp_trigger_wednesday no";
fhem_set"dimplexSIW8TES dimhp_trigger_thursday no";
fhem_set"dimplexSIW8TES dimhp_trigger_friday no";
fhem_set"dimplexSIW8TES dimhp_trigger_saturday no";
fhem_set"dimplexSIW8TES dimhp_trigger_sunday no";
}
}
}

dimplex_nacherwaermung_aktivieren {
if ( [dim_Warmwassertemperatur] or [dim_Ruecklauftemperatur] ) {
set_Reading("diff_SOLL_IST",([dim_Ruecklaufsolltemperatur] + [dim_HeizungHysterese] - [dim_Ruecklauftemperatur]),1);
if ( [08:45-14:30] and [dim_status_heatpump:state] == 2 and [$SELF:diff_SOLL_IST] < 0.2 and [PROPLANTA:fc0_rad] > 2.9 and [dim_Warmwassertemperatur:state] < 49 ) {
fhem_set"dim_WarmwasserSollTemperatur 60";
fhem_set"dim_WarmwasserHysterese 0";
fhem_set"signal send Heizung: Rücklauftemperatur fast erreicht. Es fehlen noch ". get_Reading("diff_SOLL_IST"). " Grad. Warmwasser: ".[dim_Warmwassertemperatur:state]." Grad.";
}
}
}
   FUUID      620fc9a2-f33f-8b20-0eb2-d2136a448da8f3c4
   MODEL      Perl
   NAME       HeizungSteuerung
   NOTIFYDEV  dim_Ruecklauftemperatur,dim_Warmwassertemperatur,global,dim_HeizungHysterese,dim_status_heatpump,HeizungSteuerung,dim_block_heatpump,PROPLANTA,dim_Ruecklaufsolltemperatur
   NR         182
   NTFY_ORDER 50-HeizungSteuerung
   STATE      initialized
   TYPE       DOIF
   VERSION    25756 2022-02-28 08:27:14
   OLDREADINGS:
   READINGS:
     2022-03-10 23:41:42   AbsenkungAktiv  ja
     2022-03-08 12:25:55   AnhebungAktiv   nein
     2022-03-11 11:10:52   diff_SOLL_IST   -30.4
     2022-03-11 11:10:59   mode            enabled
     2022-03-11 11:11:00   state           initialized
     2022-03-11 11:11:00   timer_01_c05    11.03.2022 20:00:00
     2022-03-11 11:11:00   timer_02_c06    12.03.2022 08:45:00
     2022-03-11 11:11:00   timer_03_c06    11.03.2022 14:30:00
   Regex:
     accu:
     collect:
     cond:
       HeizungSteuerung:
         4:
           AbsenkungAktiv ^HeizungSteuerung$:^AbsenkungAktiv:
           AnhebungAktiv ^HeizungSteuerung$:^AnhebungAktiv:
         5:
           diff_SOLL_IST ^HeizungSteuerung$:^diff_SOLL_IST:
       PROPLANTA:
         4:
           fc1_rad    ^PROPLANTA$:^fc1_rad:
         5:
           fc0_rad    ^PROPLANTA$:^fc0_rad:
       dim_HeizungHysterese:
         5:
           &STATE     ^dim_HeizungHysterese$
       dim_Ruecklaufsolltemperatur:
         5:
           &STATE     ^dim_Ruecklaufsolltemperatur$
       dim_Ruecklauftemperatur:
         5:
           &STATE     ^dim_Ruecklauftemperatur$
       dim_Warmwassertemperatur:
         5:
           &STATE     ^dim_Warmwassertemperatur$
           state      ^dim_Warmwassertemperatur$:^state:
       dim_block_heatpump:
         2:
           &STATE     ^dim_block_heatpump$
           state      ^dim_block_heatpump$:^state:
       dim_status_heatpump:
         0:
           state      ^dim_status_heatpump$:^state:
         1:
           state      ^dim_status_heatpump$:^state:
         3:
           state      ^dim_status_heatpump$:^state:
         5:
           state      ^dim_status_heatpump$:^state:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0         
if ( ::ReadingValDoIf($hash,'dim_status_heatpump','state') == 2 ) {
fhem_set"signal send Heizung wurde aktiviert";
}

     1         
if ( ::ReadingValDoIf($hash,'dim_status_heatpump','state') == 4 ) {
fhem_set"signal send Warmwasser wurde aktiviert";
}

     2         
if ( ::ReadingValDoIf($hash,'dim_block_heatpump','state') == 13 or ::ReadingValDoIf($hash,'dim_block_heatpump','state') == 19) {
fhem_set"signal send Nacherwärmung Warmwasser wurde aktiviert oder Hochdruck. ".::InternalDoIf($hash,'dim_block_heatpump','STATE');
fhem_set"dim_Parallelverschiebung 21";
fhem_set"dim_HeizungHysterese 3";
}

     3         
if ( ::ReadingValDoIf($hash,'dim_status_heatpump','state') == 1) {
fhem_set"signal send Heizung deaktiviert";
fhem_set"dim_Parallelverschiebung 21";
fhem_set"dim_HeizungHysterese 3";
fhem_set"dim_WarmwasserSollTemperatur 48";
fhem_set"dim_WarmwasserHysterese 4";
}

     4         
if ( ::DOIF_time_once($hash,0,$wday) ) {
if ( ::ReadingValDoIf($hash,'PROPLANTA','fc1_rad') > 2.9 ) {
if ( ::ReadingValDoIf($hash,'HeizungSteuerung','AbsenkungAktiv') eq "ja" ) {
fhem_set"dimplexSIW8TES dimhp_trigger_value 1-hc-lower";
fhem_set"dimplexSIW8TES dimhp_trigger_monday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_tuesday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_wednesday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_thursday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_friday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_saturday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_sunday time1";
} elsif ( ::ReadingValDoIf($hash,'HeizungSteuerung','AbsenkungAktiv') eq "nein" ) {
fhem_set"dimplexSIW8TES dimhp_trigger_value 1-hc-lower";
fhem_set"dimplexSIW8TES dimhp_trigger_monday no";
fhem_set"dimplexSIW8TES dimhp_trigger_tuesday no";
fhem_set"dimplexSIW8TES dimhp_trigger_wednesday no";
fhem_set"dimplexSIW8TES dimhp_trigger_thursday no";
fhem_set"dimplexSIW8TES dimhp_trigger_friday no";
fhem_set"dimplexSIW8TES dimhp_trigger_saturday no";
fhem_set"dimplexSIW8TES dimhp_trigger_sunday no";
}
if ( ::ReadingValDoIf($hash,'HeizungSteuerung','AnhebungAktiv') eq "ja" ) {
fhem_set"dimplexSIW8TES dimhp_trigger_value 1-hc-raise";
fhem_set"dimplexSIW8TES dimhp_trigger_monday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_tuesday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_wednesday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_thursday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_friday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_saturday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_sunday time1";
} elsif ( ::ReadingValDoIf($hash,'HeizungSteuerung','AnhebungAktiv') eq "nein" ) {
fhem_set"dimplexSIW8TES dimhp_trigger_value 1-hc-raise";
fhem_set"dimplexSIW8TES dimhp_trigger_monday no";
fhem_set"dimplexSIW8TES dimhp_trigger_tuesday no";
fhem_set"dimplexSIW8TES dimhp_trigger_wednesday no";
fhem_set"dimplexSIW8TES dimhp_trigger_thursday no";
fhem_set"dimplexSIW8TES dimhp_trigger_friday no";
fhem_set"dimplexSIW8TES dimhp_trigger_saturday no";
fhem_set"dimplexSIW8TES dimhp_trigger_sunday no";
}
} else {
fhem_set"dimplexSIW8TES dimhp_trigger_value 1-hc-lower";
fhem_set"dimplexSIW8TES dimhp_trigger_monday no";
fhem_set"dimplexSIW8TES dimhp_trigger_tuesday no";
fhem_set"dimplexSIW8TES dimhp_trigger_wednesday no";
fhem_set"dimplexSIW8TES dimhp_trigger_thursday no";
fhem_set"dimplexSIW8TES dimhp_trigger_friday no";
fhem_set"dimplexSIW8TES dimhp_trigger_saturday no";
fhem_set"dimplexSIW8TES dimhp_trigger_sunday no";

fhem_set"dimplexSIW8TES dimhp_trigger_value 1-hc-raise";
fhem_set"dimplexSIW8TES dimhp_trigger_monday no";
fhem_set"dimplexSIW8TES dimhp_trigger_tuesday no";
fhem_set"dimplexSIW8TES dimhp_trigger_wednesday no";
fhem_set"dimplexSIW8TES dimhp_trigger_thursday no";
fhem_set"dimplexSIW8TES dimhp_trigger_friday no";
fhem_set"dimplexSIW8TES dimhp_trigger_saturday no";
fhem_set"dimplexSIW8TES dimhp_trigger_sunday no";
}
}

     5         
if ( ::InternalDoIf($hash,'dim_Warmwassertemperatur','STATE') or ::InternalDoIf($hash,'dim_Ruecklauftemperatur','STATE') ) {
set_Reading("diff_SOLL_IST",(::InternalDoIf($hash,'dim_Ruecklaufsolltemperatur','STATE') + ::InternalDoIf($hash,'dim_HeizungHysterese','STATE') - ::InternalDoIf($hash,'dim_Ruecklauftemperatur','STATE')),1);
if ( ::DOIF_time($hash,1,2,$wday,$hms) and ::ReadingValDoIf($hash,'dim_status_heatpump','state') == 2 and ::ReadingValDoIf($hash,'HeizungSteuerung','diff_SOLL_IST') < 0.2 and ::ReadingValDoIf($hash,'PROPLANTA','fc0_rad') > 2.9 and ::ReadingValDoIf($hash,'dim_Warmwassertemperatur','state') < 49 ) {
fhem_set"dim_WarmwasserSollTemperatur 60";
fhem_set"dim_WarmwasserHysterese 0";
fhem_set"signal send Heizung: Rücklauftemperatur fast erreicht. Es fehlen noch ". get_Reading("diff_SOLL_IST"). " Grad. Warmwasser: ".::ReadingValDoIf($hash,'dim_Warmwassertemperatur','state')." Grad.";
}
}

   days:
   helper:
     NOTIFYDEV  dim_Ruecklauftemperatur,dim_Warmwassertemperatur,global,dim_HeizungHysterese,dim_status_heatpump,HeizungSteuerung,dim_block_heatpump,PROPLANTA,dim_Ruecklaufsolltemperatur
     globalinit 1
     last_timer 3
     sleeptimer -1
   internals:
     all         dim_block_heatpump:STATE dim_Warmwassertemperatur:STATE dim_Ruecklauftemperatur:STATE dim_Ruecklaufsolltemperatur:STATE dim_HeizungHysterese:STATE
   interval:
     1          -1
     2          1
   intervalfunc:
   localtime:
     0          1647025200
     1          1647071100
     2          1647005400
   perlblock:
     0          start_heizen
     1          start_warmwasser
     2          start_nacherwaermung_block
     3          stop_heizung
     4          dimplex_zeitplan_setzen
     5          dimplex_nacherwaermung_aktivieren
   readings:
     all         dim_status_heatpump:state dim_block_heatpump:state PROPLANTA:fc1_rad HeizungSteuerung:AbsenkungAktiv HeizungSteuerung:AnhebungAktiv HeizungSteuerung:diff_SOLL_IST PROPLANTA:fc0_rad dim_Warmwassertemperatur:state
   realtime:
     0          20:00:00
     1          08:45:00
     2          14:30:00
   time:
     0          20:00:00
     1          08:45:00
     2          14:30:00
   timeCond:
     0          4
     1          5
     2          5
   timer:
     0          0
     1          0
     2          0
   timers:
     4           0
     5           1  2
   triggertime:
     1647005400:
       localtime  1647005400
       hash:
     1647025200:
       localtime  1647025200
       hash:
     1647071100:
       localtime  1647071100
       hash:
   uiState:
   uiTable:
Attributes:
   do         always
   readingList AnhebungAktiv AbsenkungAktiv AnhebungAktiveren AbsenkungAktivieren
   room       Dimplex,E3DC
   setList    AnhebungAktiv:ja,nein AbsenkungAktiv:ja,nein AnhebungAktivieren:ja,nein AbsenkungAktivieren:ja,nein


Die Teile


fhem_set"dimplexSIW8TES dimhp_trigger_tuesday no";
fhem_set"dimplexSIW8TES dimhp_trigger_wednesday no";
...


oder


fhem_set"dimplexSIW8TES dimhp_trigger_tuesday time1";
fhem_set"dimplexSIW8TES dimhp_trigger_wednesday time1";
...


kommen immer mal vor. Wie kann ich diese ähnlich gelagerten Readings übersichtlicher in das DOIF packen? Ich woltle erst so was wie


fhem_set"dimplexSIW8TES dimhp_trigger_(monday|tuesday|wednesday|thursday|friday|saturday|sunday).* time1";


ähnlich der DEVSPEC versuchen, aber das ist wohl syntaktisch nicht vorgesehen. ;-) Hat jemand einen Ansatz zum Probieren für mich?

Damian

Ich würde Blöcke, die die gleichen Trigger haben zusammenlegen: Wie start_heizen und start_warmwasser

Regex-Angaben funtionieren auch in fhem_set, also z. B. fhem_set "bla.* on"

Solche Angaben schlucken unnötig Performance:

if ( [20:00] ) {
if ( [PROPLANTA:fc1_rad] > 2.9 ) {
if ( [$SELF:AbsenkungAktiv] eq "ja" ) {...


Hier triggert unnötig sowohl [PROPLANTA:fc1_rad] als auch [$SELF:AbsenkungAktiv], denn nur um 20:00 kann die if-Abfrage erfolgen. Daher in solchen Fällen mit ? die Trigger rausnehmen.

Gemeinsamen Programmcode sollte man in subs auslagern.


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

h002

Danke für deine Tipps.

Zitat von: Damian am 11 März 2022, 17:54:35
Regex-Angaben funtionieren auch in fhem_set, also z. B. fhem_set "bla.* on"
Damit meinst du aber auch nur den Teil des Devices? Ich würde ja gerne bei den Readings wie oben erwähnt (fhem_set"dimplexSIW8TES dimhp_trigger_(monday|tuesday|wednesday|thursday|friday|saturday|sunday).* time1";) Regex zum Setzen von Werten nutzen.

Also so ähnlich wie deletereading dimplexSIW8TES dimhp_trigger_(monday|tuesday|wednesday|thursday|friday|saturday|sunday).* funktionieren würde.

Damian

Zitat von: h002 am 11 März 2022, 19:54:32
Danke für deine Tipps.
Damit meinst du aber auch nur den Teil des Devices? Ich würde ja gerne bei den Readings wie oben erwähnt (fhem_set"dimplexSIW8TES dimhp_trigger_(monday|tuesday|wednesday|thursday|friday|saturday|sunday).* time1";) Regex zum Setzen von Werten nutzen.

Also so ähnlich wie deletereading dimplexSIW8TES dimhp_trigger_(monday|tuesday|wednesday|thursday|friday|saturday|sunday).* funktionieren würde.

Das ist FHEM-Syntax, die Regexangaben zu Devices werden als devspec bezeichnet. fhem_set ist entspricht dem set-Befehl, für alle anderen FHEM-Befehle sollte man die fhem-Funktion nutzen. Damit hat man die volle Funktionalität wie in der Kommandozeile.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF