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
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....
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.
Eine dynamische Verzögerung von sunset kannst du einfacher über das wait-Attribut realisieren. Siehe https://fhem.de/commandref_DE.html#DOIF_timerWithWait.
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.
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.
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