(Gelöst)Frage zu Änderung Dummy-Readings als Parameter für sunset-Zeitermittlung

Begonnen von Stefan Knoll, 13 Mai 2020, 13:25:22

Vorheriges Thema - Nächstes Thema

Stefan Knoll

Hallo,

kann sein, ich habe etwas falsch verstanden, daher Frage in die Runde.

Ich verwende DOIFs für die Steuerung meiner Rolläden. Da die Bedingungen zum Hoch- und Runterfahren jeweils unterschiedlich sind, wird jeder Rolladen über ein eigenes DOIF gesteuert. Eine Gemeinsamkeit ist aber der Zeitpunkt für das Hochfahren am Morgen und das Runterfahren abends (die vorliegende Problemschilderung bezieht sich auf letzteres). Die DOIFs haben soweit bisher funktioniert. Allerdings möchte ich davon wegkommen, bei einer Änderung der gewünschten Zeit jedes DOIF einzeln ändern zu müssen. Deshalb sollen die bisher verwendete Literale durch Variablen ersetzt werden. Dazu möchte ich einen Dummy verwenden, der die verschiedenen Parameterwerte in Readings enthält (hier: "ShuttersParmTableDUMMY").


Internals:
   FUUID      5eba6740-f33f-7a15-91a3-dc0a84cfd265e000
   NAME       ShuttersParmTableDUMMY
   NR         1053
   STATE      1320 0
0 05:30 22:00 REAL  CIVIL
   TYPE       dummy
   READINGS:
     2020-05-13 12:18:11   additionalWestSideOffsetSecs 0
     2020-05-12 19:20:28   earliestShutterOpeningTime 05:30
     2020-05-12 19:20:44   latestShutterClosingTime 22:00
     2020-05-13 13:11:32   shutterClosingSunsetType CIVIL
     2020-05-12 19:26:55   shutterOpeningSunriseType REAL
     2020-05-13 12:02:28   standardSunriseOffsetSecs 1320
     2020-05-13 12:18:03   standardSunsetOffsetSecs 0
Attributes:
   event-on-update-reading .*
   readingList standardSunriseOffsetSecs standardSunsetOffsetSecs additionalWestSideOffsetSecs  earliestShutterOpeningTime latestShutterClosingTime shutterOpeningSunriseType  shutterClosingSunsetType
   room       Variablen
   setList    standardSunriseOffsetSecs:slider,0,60,3600 standardSunsetOffsetSecs:slider,0,60,3600 additionalWestSideOffsetSecs:slider,0,-60,-3600 earliestShutterOpeningTime:time latestShutterClosingTime:time shutterOpeningSunriseType:REAL,CIVIL,NAUTIC,ASTRONOMIC shutterClosingSunsetType:REAL,CIVIL,NAUTIC,ASTRONOMIC
   stateFormat standardSunriseOffsetSecs standardSunsetOffsetSecs
additionalWestSideOffsetSecs earliestShutterOpeningTime latestShutterClosingTime shutterOpeningSunriseType  shutterClosingSunsetType


Im DOIF soll das bisherige

(
        ([{sunset("REAL",600)}])
    )
    ## THEN
    ( set kueche.rollo pct 0)


also durch



    (
        ([{sunset(
            ReadingsVal("ShuttersParmTableDUMMY", "shutterClosingSunsetType","REAL") ,
            ReadingsVal("ShuttersParmTableDUMMY", "standardSunsetOffsetSecs","0") +
            ReadingsVal("ShuttersParmTableDUMMY", "additionalWestSideOffsetSecs","0")
        )}])
    )
    ## THEN
    ( set kueche.rollo pct 0 )


ersetzt werden. Nach Erfassung der entsprechenden Reading-Werte im Dummy "ShuttersParmTableDUMMY" und Vornahme der dokumentierten Änderung im DOIF funktioniert das auch, d. h. der entsprechende Timer im DOIF wird richtig berechnet.

Allerdings hätte ich erwartet (damit die vorgenommene Änderung überhaupt sinnvoll ist), dass eine Änderung der hier im Funktionsaufruf sunset() verwendeten Readings (z. B. "set ShuttersParmTableDUMMY shutterClosingSunsetType CIVIL") den DOIF triggert, was zu einer Neuberechnung des Timers führt. Tatsächlich wird ein entsprechendes Event erzeugt...


2020-05-13 12:23:21 dummy ShuttersParmTableDUMMY shutterClosingSunsetType: CIVIL


... jedoch wird der DOIF nicht getriggert und der Timer entsprechend nicht neu berechnet. Auch ein "Checkall" bringt nichts. Zur Anpassung des Timer muss ich im DOIF den Änderungsmodus starten und verlassen (ohne dabei eine Änderung vornehmen zu müssen). Nach einem anschließendem Refresh im Browser wird die neu berechnete Zeit angezeigt.

Meine Frage ist also: hab ich was falsch gemacht bzw. vergessen oder funktioniert das schlichtweg nicht so, wie ich mir das vorgestellt habe?

Hier zur Vollständigkeit noch der List des DOIFs:


Internals:
   DEF        ## CMD_1 ===============================================================================
## HOCHFAHREN WENN MORGENS DIE WETTERABHÄNGIGE HELLIGKEIT DEN SCHWELLWERT ÜBERSCHREITET

    ## IF
    (
        ([{sunrise("REAL",0,"05:30","23:59")}])
    )
    ## THEN
    ( set kueche.rollo pct 100 )

DOELSEIF

## CMD_2 ==============================================================================
## SOFORTIGES VOLLSTÄNDIGES HOCHFAHREN WENN JEMAND TAGSÜBER HEIMKOMMT

    ## IF
    ( [Anwesenheit] eq "present"  and
      [?$SELF:cmd] eq "6" )
    ## THEN
    ( set kueche.rollo pct 100 )

DOELSEIF

## CMD_3 ==============================================================================
## SOFORTIGES HALBES HOCHFAHREN WENN JEMAND TAGSÜBER HEIMKOMMT

    ## IF
    ( [Anwesenheit] eq "present" and
      [?$SELF:cmd] eq "7" )
    ## THEN
    ( set kueche.rollo pct 50 )

DOELSEIF

## CMD_4 ==============================================================================
## VERZÖGERTES HOCHFAHREN AUS ÄUSSEREN GRÜNDEN

    ## IF
    (
        (
            ( ## ZUR HEIZUNGSUNTERSTÜTZUNG
                [wohn.fh] eq "on" and
                [garten.tempdiffsensor.west.high.low:temperature] >= [garten.tempdiff.lower.value.dy:state] and
                [?$SELF:cmd] eq "6"
            ) or
            ( ## HOCHFAHREN DES ROLLOS WENN DIE BEDINGUNGEN ZUM SONNENABHÄNGIGEN RUNTERFAHREN NICHT MEHR GEGEBEN SIND
                [wohn.fh] ne "on" and
                (
                    (
                        [garten.tempdiffsensor.west.high.low:temperature] + [garten.tempdiffsensor.west.low:temperature] < 40 or
                        [garten.tempdiffsensor.west.high.low:temperature] < [garten.tempdiff.lower.value.dy:state] or
                        [garten.tempdiffsensor.west.low:temperature] < [outside_temperatur_upper_threshold_dy:state]
                    ) or
                    [mytwilight:azimuth] < 190
                ) and
                ( [?$SELF:cmd] eq "3" or
                  [?$SELF:cmd] eq "5" or
                  [?$SELF:cmd] eq "7"
                )
            )
        ) and
        [?mytwilight:twilight_weather] >= [twilight_weather_threshold_evening.dy:state]
    )
    ## THEN
    ( set kueche.rollo pct 100 )
 
DOELSEIF

## CMD_5 ==============================================================================
## VERZÖGERTES HERUNTERFAHREN ZU 1/2

    (
        ( ## BEI ÜBERSCHREITUNG DES UNTEREN SCHWELLWERTS FÜR DIE SONNENINTENSITÄT
            (     
                [garten.tempdiffsensor.west.high.low:temperature] + [garten.tempdiffsensor.west.low:temperature] >= 40 and
                [garten.tempdiffsensor.west.high.low:temperature] >= [garten.tempdiff.lower.value.dy:state] and
                [garten.tempdiffsensor.west.low:temperature] >= [outside_temperatur_upper_threshold_dy:state]
            ) and
            [mytwilight:azimuth] >= 190 and
            [wohn.fh] eq "off" and
            [Anwesenheit] eq "present"
        ) and
        [?mytwilight:twilight_weather] >= [twilight_weather_threshold_evening.dy:state] and
        [?kueche.rollo:pct] != 50
    )   
    ## THEN
    ( set kueche.rollo pct 50 )

DOELSEIF

## CMD_6 ==============================================================================
## VERZÖGERTES VOLLSTÄNDIGES HERUNTERFAHREN ZUR HEIZUNGSUNTERSTÜTZUNG

    (         
        [garten.tempdiffsensor.west.low:temperature] < [wohn.thermostat.climate:measured-temp] - [tempdiff_inside_outside_threshold_dy:state] and
        [wohn.fh] eq "on" and
        [Anwesenheit] eq "absent" and
        [?mytwilight:twilight] >= [twilight_weather_threshold_evening.dy:state]
    )
    ## THEN
    ( set kueche.rollo pct 0 )

DOELSEIF

## CMD_7 ==============================================================================
## VERZÖGERTES VOLLSTÄNDIGES HERUNTERFAHREN ALS SONNENSCHUTZ

    (
        (   
            [garten.tempdiffsensor.west.high.low:temperature] + [garten.tempdiffsensor.west.low:temperature] >= 40 and
            [garten.tempdiffsensor.west.high.low:temperature] >= [garten.tempdiff.lower.value.dy:state] and
            [garten.tempdiffsensor.west.low:temperature] >= [outside_temperatur_upper_threshold_dy:state]
        ) and
        [mytwilight:azimuth] >= 190 and
        [wohn.fh] eq "off" and
        [Anwesenheit] eq "absent" and
        [?mytwilight:twilight] >= [twilight_weather_threshold_evening.dy:state]   
    )
    ## THEN
    ( set kueche.rollo pct 0 )

DOELSEIF

## CMD_8 ==============================================================================
## HERUNTERFAHREN DES ROLLOS ANHAND DER WETTERABHÄNGIGEN HELLIGKEIT

    ## IF
    (
        ([{sunset(
            ReadingsVal("ShuttersParmTableDUMMY", "shutterClosingSunsetType","REAL") ,
            ReadingsVal("ShuttersParmTableDUMMY", "standardSunsetOffsetSecs","0") +
            ReadingsVal("ShuttersParmTableDUMMY", "additionalWestSideOffsetSecs","0")
          ##  [ShuttersParmTableDUMMY:standardSunsetOffsetSecs]
          ##
        )}])
    )
    ## THEN
    ( set kueche.rollo pct 0 )

   FUUID      5c694254-f33f-7a15-f27b-f8038bc633228d9d
   MODEL      FHEM
   NAME       kueche.rollo.di
   NOTIFYDEV  wohn.fh,global,garten.tempdiffsensor.west.high.low,garten.tempdiff.lower.value.dy,wohn.thermostat.climate,mytwilight,twilight_weather_threshold_evening.dy,outside_temperatur_upper_threshold_dy,garten.tempdiffsensor.west.low,Anwesenheit,tempdiff_inside_outside_threshold_dy
   NR         817
   NTFY_ORDER 50-kueche.rollo.di
   STATE      initialized
   TYPE       DOIF
   VERSION    21224 2020-02-18 18:45:49
   READINGS:
     2020-05-13 13:22:49   Device          wohn.thermostat.climate
     2020-05-13 13:11:55   cmd             0
     2020-05-13 13:21:58   e_garten.tempdiffsensor.west.high.low_temperature 0.7
     2020-05-13 13:21:58   e_garten.tempdiffsensor.west.low_temperature 11.4
     2020-05-13 13:20:28   e_mytwilight_azimuth 184.97
     2020-05-13 13:15:13   e_wohn.fh_STATE on
     2020-05-13 13:22:49   e_wohn.thermostat.climate_measured-temp 22.3
     2020-05-13 13:11:55   mode            enabled
     2020-05-13 13:11:55   state           initialized
     2020-05-13 13:11:55   timer_01_c01    14.05.2020 05:40:58
     2020-05-13 13:11:55   timer_02_c08    13.05.2020 21:21:32
   Regex:
     accu:
     cond:
       Anwesenheit:
         1:
           &STATE     ^Anwesenheit$
         2:
           &STATE     ^Anwesenheit$
         4:
           &STATE     ^Anwesenheit$
         5:
           &STATE     ^Anwesenheit$
         6:
           &STATE     ^Anwesenheit$
       garten.tempdiff.lower.value.dy:
         3:
           state      ^garten.tempdiff.lower.value.dy$:^state:
         4:
           state      ^garten.tempdiff.lower.value.dy$:^state:
         6:
           state      ^garten.tempdiff.lower.value.dy$:^state:
       garten.tempdiffsensor.west.high.low:
         0:
         1:
         2:
         3:
           temperature ^garten.tempdiffsensor.west.high.low$:^temperature:
         4:
           temperature ^garten.tempdiffsensor.west.high.low$:^temperature:
         5:
         6:
           temperature ^garten.tempdiffsensor.west.high.low$:^temperature:
         7:
       garten.tempdiffsensor.west.low:
         0:
         1:
         2:
         3:
           temperature ^garten.tempdiffsensor.west.low$:^temperature:
         4:
           temperature ^garten.tempdiffsensor.west.low$:^temperature:
         5:
           temperature ^garten.tempdiffsensor.west.low$:^temperature:
         6:
           temperature ^garten.tempdiffsensor.west.low$:^temperature:
         7:
       mytwilight:
         0:
         1:
         2:
         3:
           azimuth    ^mytwilight$:^azimuth:
         4:
           azimuth    ^mytwilight$:^azimuth:
         5:
         6:
           azimuth    ^mytwilight$:^azimuth:
         7:
       outside_temperatur_upper_threshold_dy:
         3:
           state      ^outside_temperatur_upper_threshold_dy$:^state:
         4:
           state      ^outside_temperatur_upper_threshold_dy$:^state:
         6:
           state      ^outside_temperatur_upper_threshold_dy$:^state:
       tempdiff_inside_outside_threshold_dy:
         5:
           state      ^tempdiff_inside_outside_threshold_dy$:^state:
       twilight_weather_threshold_evening.dy:
         3:
           state      ^twilight_weather_threshold_evening.dy$:^state:
         4:
           state      ^twilight_weather_threshold_evening.dy$:^state:
         5:
           state      ^twilight_weather_threshold_evening.dy$:^state:
         6:
           state      ^twilight_weather_threshold_evening.dy$:^state:
       wohn.fh:
         0:
         1:
         2:
         3:
           &STATE     ^wohn.fh$
         4:
           &STATE     ^wohn.fh$
         5:
           &STATE     ^wohn.fh$
         6:
           &STATE     ^wohn.fh$
         7:
       wohn.thermostat.climate:
         0:
         1:
         2:
         3:
         4:
         5:
           measured-temp ^wohn.thermostat.climate$:^measured-temp:
         6:
         7:
   attr:
     cmdState:
     wait:
       0:
         rand(300)
       1:
         0
       2:
         0
       3:
         900
       4:
         900
       5:
         900
       6:
         900
       7:
         rand(300)
     waitdel:
   condition:
     0                    (::DOIF_time_once($hash,0,$wday))     
     1           ::InternalDoIf($hash,'Anwesenheit','STATE') eq "present"  and       ::ReadingValDoIf($hash,'kueche.rollo.di','cmd') eq "6"
     2           ::InternalDoIf($hash,'Anwesenheit','STATE') eq "present" and       ::ReadingValDoIf($hash,'kueche.rollo.di','cmd') eq "7"
     3                   (             (                  ::InternalDoIf($hash,'wohn.fh','STATE') eq "on" and                 ::ReadingValDoIf($hash,'garten.tempdiffsensor.west.high.low','temperature') >= ::ReadingValDoIf($hash,'garten.tempdiff.lower.value.dy','state') and                 ::ReadingValDoIf($hash,'kueche.rollo.di','cmd') eq "6"             ) or              (                  ::InternalDoIf($hash,'wohn.fh','STATE') ne "on" and                 (                     (                         ::ReadingValDoIf($hash,'garten.tempdiffsensor.west.high.low','temperature') + ::ReadingValDoIf($hash,'garten.tempdiffsensor.west.low','temperature') < 40 or                         ::ReadingValDoIf($hash,'garten.tempdiffsensor.west.high.low','temperature') < ::ReadingValDoIf($hash,'garten.tempdiff.lower.value.dy','state') or                         ::ReadingValDoIf($hash,'garten.tempdiffsensor.west.low','temperature') < ::ReadingValDoIf($hash,'outside_temperatur_upper_threshold_dy','state')                      ) or                     ::ReadingValDoIf($hash,'mytwilight','azimuth') < 190                 ) and                 ( ::ReadingValDoIf($hash,'kueche.rollo.di','cmd') eq "3" or                    ::ReadingValDoIf($hash,'kueche.rollo.di','cmd') eq "5" or                    ::ReadingValDoIf($hash,'kueche.rollo.di','cmd') eq "7"                  )             )         ) and          ::ReadingValDoIf($hash,'mytwilight','twilight_weather') >= ::ReadingValDoIf($hash,'twilight_weather_threshold_evening.dy','state')     
     4                    (              (                       ::ReadingValDoIf($hash,'garten.tempdiffsensor.west.high.low','temperature') + ::ReadingValDoIf($hash,'garten.tempdiffsensor.west.low','temperature') >= 40 and                 ::ReadingValDoIf($hash,'garten.tempdiffsensor.west.high.low','temperature') >= ::ReadingValDoIf($hash,'garten.tempdiff.lower.value.dy','state') and                 ::ReadingValDoIf($hash,'garten.tempdiffsensor.west.low','temperature') >= ::ReadingValDoIf($hash,'outside_temperatur_upper_threshold_dy','state')             ) and             ::ReadingValDoIf($hash,'mytwilight','azimuth') >= 190 and             ::InternalDoIf($hash,'wohn.fh','STATE') eq "off" and             ::InternalDoIf($hash,'Anwesenheit','STATE') eq "present"          ) and         ::ReadingValDoIf($hash,'mytwilight','twilight_weather') >= ::ReadingValDoIf($hash,'twilight_weather_threshold_evening.dy','state') and         ::ReadingValDoIf($hash,'kueche.rollo','pct') != 50     
     5                             ::ReadingValDoIf($hash,'garten.tempdiffsensor.west.low','temperature') < ::ReadingValDoIf($hash,'wohn.thermostat.climate','measured-temp') - ::ReadingValDoIf($hash,'tempdiff_inside_outside_threshold_dy','state') and         ::InternalDoIf($hash,'wohn.fh','STATE') eq "on" and         ::InternalDoIf($hash,'Anwesenheit','STATE') eq "absent" and          ::ReadingValDoIf($hash,'mytwilight','twilight') >= ::ReadingValDoIf($hash,'twilight_weather_threshold_evening.dy','state')     
     6                   (                ::ReadingValDoIf($hash,'garten.tempdiffsensor.west.high.low','temperature') + ::ReadingValDoIf($hash,'garten.tempdiffsensor.west.low','temperature') >= 40 and             ::ReadingValDoIf($hash,'garten.tempdiffsensor.west.high.low','temperature') >= ::ReadingValDoIf($hash,'garten.tempdiff.lower.value.dy','state') and             ::ReadingValDoIf($hash,'garten.tempdiffsensor.west.low','temperature') >= ::ReadingValDoIf($hash,'outside_temperatur_upper_threshold_dy','state')         ) and         ::ReadingValDoIf($hash,'mytwilight','azimuth') >= 190 and         ::InternalDoIf($hash,'wohn.fh','STATE') eq "off" and         ::InternalDoIf($hash,'Anwesenheit','STATE') eq "absent" and         ::ReadingValDoIf($hash,'mytwilight','twilight') >= ::ReadingValDoIf($hash,'twilight_weather_threshold_evening.dy','state')         
     7                    (::DOIF_time_once($hash,1,$wday))     
   days:
   do:
     0:
       0           set kueche.rollo pct 100
     1:
       0           set kueche.rollo pct 100
     2:
       0           set kueche.rollo pct 50
     3:
       0           set kueche.rollo pct 100
     4:
       0           set kueche.rollo pct 50
     5:
       0           set kueche.rollo pct 0
     6:
       0           set kueche.rollo pct 0
     7:
       0           set kueche.rollo pct 0
     8:
   helper:
     DEVFILTER  ^global$|^garten.tempdiff.lower.value.dy$|^garten.tempdiffsensor.west.high.low$|^wohn.fh$|^wohn.thermostat.climate$|^Anwesenheit$|^garten.tempdiffsensor.west.low$|^outside_temperatur_upper_threshold_dy$|^twilight_weather_threshold_evening.dy$|^mytwilight$|^tempdiff_inside_outside_threshold_dy$
     NOTIFYDEV  global|garten.tempdiff.lower.value.dy|garten.tempdiffsensor.west.high.low|wohn.fh|wohn.thermostat.climate|Anwesenheit|garten.tempdiffsensor.west.low|outside_temperatur_upper_threshold_dy|twilight_weather_threshold_evening.dy|mytwilight|tempdiff_inside_outside_threshold_dy
     event      desired-temp: 22.5,humidity: 46,measured-temp: 22.3,T: 22.3 desired: 22.5,dewpoint: 10.1
     globalinit 1
     last_timer 2
     sleeptimer -1
     triggerDev wohn.thermostat.climate
     triggerEvents:
       desired-temp: 22.5
       humidity: 46
       measured-temp: 22.3
       T: 22.3 desired: 22.5
       dewpoint: 10.1
     triggerEventsState:
       desired-temp: 22.5
       humidity: 46
       measured-temp: 22.3
       state: T: 22.3 desired: 22.5
       dewpoint: 10.1
   internals:
     all         Anwesenheit:STATE wohn.fh:STATE
   intervalfunc:
   localtime:
     0          1589427658
     1          1589397692
   readings:
     all         garten.tempdiffsensor.west.high.low:temperature garten.tempdiff.lower.value.dy:state garten.tempdiffsensor.west.low:temperature outside_temperatur_upper_threshold_dy:state mytwilight:azimuth twilight_weather_threshold_evening.dy:state wohn.thermostat.climate:measured-temp tempdiff_inside_outside_threshold_dy:state
   realtime:
     0          05:40:58
     1          21:21:32
   time:
     0          {sunrise("REAL",0,"05:30","23:59")}
     1          {sunset(ReadingsVal("ShuttersParmTableDUMMY","shutterClosingSunsetType","REAL"),ReadingsVal("ShuttersParmTableDUMMY","standardSunsetOffsetSecs","0")+ReadingsVal("ShuttersParmTableDUMMY","additionalWestSideOffsetSecs","0"))}
   timeCond:
     0          0
     1          7
   timer:
     0          0
     1          0
   timers:
     0           0
     7           1
   trigger:
   triggertime:
     1589397692:
       localtime  1589397692
       hash:
     1589427658:
       localtime  1589427658
       hash:
   uiState:
   uiTable:
Attributes:
   DbLogInclude 1
   alias      Steuerung Küchenrollo
   disable    0
   do         always
   event-on-change-reading .*kueche.rollo.di cmd_.*
   event-on-update-reading .*kueche.rollo.di cmd_.*
   group      Steuerungslogik
   icon       fts_window_roof_shutter
   room       Logik,Steuerung Rolladen
   wait       rand(300):0:0:900:900:900:900:rand(300)


Viele Grüße
Stefan

KernSani

Ich hätte einen anderen/zusätzlichen Vorschlag: Fasse deine Rollläden in STRUCTURES zusammen und steuere diese an, dann sparst du dir viele DOIFs.


Kurz, weil mobil....
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Stefan Knoll

Zitat von: KernSani am 13 Mai 2020, 13:44:48
Ich hätte einen anderen/zusätzlichen Vorschlag: Fasse deine Rollläden in STRUCTURES zusammen und steuere diese an, dann sparst du dir viele DOIFs.


Kurz, weil mobil....

Danke für den Tipp, das mache ich bereits wo sinnvoll, aber da die Abhängigkeiten recht unterschiedlich sind, ist das kein gangbarer Workaround für mich.

Damian

Eine dynamische Verzögerung von sunset kannst du einfacher über das wait-Attribut realisieren. Siehe https://fhem.de/commandref_DE.html#DOIF_timerWithWait.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Stefan Knoll

Zitat von: Damian am 13 Mai 2020, 16:57:37
Eine dynamische Verzögerung von sunset kannst du einfacher über das wait-Attribut realisieren. Siehe https://fhem.de/commandref_DE.html#DOIF_timerWithWait.

Das mach ich bereits auch so (siehe Listing vom DOIF), aber auch das muss ich ja in jedem einzelnen DOIF pflegen. Mir ist schon klar, dass ich die gewünschten Timer ohne die Verwendung der Dummy-Readings als Parameter erzielen kann, aber ich hätte halt gerne eine zentrale Pflege der übergreifend verwendeten Variablen. Wenn das nicht hinhaut, dann geht die Welt davon nicht unter, aber trotzdem würde mich interessieren, ob das jetzt nicht funktioniert, weil ich's falsch gemacht habe oder ob es halt einfach nicht vorgesehen ist.


Damian

Bei der Definition:

([{sunset(
            ReadingsVal("ShuttersParmTableDUMMY", "shutterClosingSunsetType","REAL") ,
            ReadingsVal("ShuttersParmTableDUMMY", "standardSunsetOffsetSecs","0") +
            ReadingsVal("ShuttersParmTableDUMMY", "additionalWestSideOffsetSecs","0")
        )}])


fehlt ein Trigger des Timers, deswegen bekommt DOIF Änderungen der Readings nicht mit.

Du kannst es aber über DOIF_Readings und indirekte Timer realisieren:

defmod di_sunset DOIF ([[$SELF:Timer]])
attr di_sunset DOIF_Readings Timer: sunset([ShuttersParmTableDUMMY:shutterClosingSunsetType,"REAL"],[ShuttersParmTableDUMMY:standardSunsetOffsetSecs,0]+[ShuttersParmTableDUMMY:additionalWestSideOffsetSecs,0])


Die Berechnung der Verzögerung hättest du übrigens genauso allgemein innerhalb von wait vornehmen können.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Stefan Knoll

Vielen Dank für die Hilfe, aber ich habe mich inzwischen dafür entschieden, die möglichen Ausprägungen des Sunset- bzw. Sunrise-Typen direkt im Variablen-Dummy mit Hochkommata zu hinterlegen. Damit muss ich die ReadingsVal-Funktion nicht verwenden (der Grund dafür war ursprünglich dass ohne Hochkommata die Fehlermeldung 'Bareword not allowed while "strict subs"' kam.
Die Variable ist jetzt z. B. "REAL" anstelle von REAL und damit führt dann auch...


([{sunset(
            [ShuttersParmTableDUMMY:shutterClosingSunsetType],
            [ShuttersParmTableDUMMY:standardSunsetOffsetSecs] + [ShuttersParmTableDUMMY:additionalWestSideOffsetSecs]
        )}])


... dazu, dass ein "checkall" die timer aktualisiert.

Viele Grüße
Stefan