Hallo zusammen,
ich möchte das bei zwei Temperaturen geschalten wird, leider funktioniert es nicht.
Was ist falsch ?
define SolarHeizungssteuerung DOIF ([04:00-20:00] and [TemperatursensorSolar_T1:temperature] > 71.5) (set Solarheizung on;; sleep 5400;; set Solarheizung off) DOELSEIF ([TemperatursensorSolar_T1:temperature] < 48) (set Solarheizung off)
Vorab Danke für die Hilfe
Hi,
Du solltest dazu besser ein list SolarHeizungssteuerung liefern, da sieht man mehr.
Den waittimer sollest Du entweder mit on-for-timer machen, oder wenn das Gerät das nicht unterstützt mit dem wait attribute, in etwa so:
define SolarHeizungssteuerung DOIF ([04:00-20:00] and [TemperatursensorSolar_T1:temperature] > 71.5) (set Solarheizung on)(set Solarheizung off) DOELSEIF ([TemperatursensorSolar_T1:temperature] < 48) (set Solarheizung off)
attr SolarHeizungssteuerung wait 0,5400:0
Gruß Otto
Hallo Otto,
hier das Ergebnis aus dem List:
Internals:
DEF ([04:00-20:00] and [TemperatursensorSolar_T1:temperature] > 71.5) (set Solarheizung on; sleep 5400; set Solarheizung off) DOELSEIF ([TemperatursensorSolar_T1:temperature] < 48) (set Solarheizung off)
FUUID 5ec13e64-f33f-2b59-0b95-a7fe451e5817b7f8
MODEL FHEM
NAME SolarHeizungssteuerung
NOTIFYDEV global,TemperatursensorSolar_T1
NR 571
NTFY_ORDER 50-SolarHeizungssteuerung
STATE cmd_1
TYPE DOIF
VERSION 22195 2020-06-18 16:38:55
READINGS:
2020-08-09 18:21:26 Device TemperatursensorSolar_T1
2020-08-08 15:52:56 cmd 1
2020-08-08 15:52:56 cmd_event TemperatursensorSolar_T1
2020-08-08 15:52:56 cmd_nr 1
2020-08-09 18:21:26 e_TemperatursensorSolar_T1_temperature 71.4
2020-08-08 15:48:50 mode enabled
2020-08-08 15:52:56 state cmd_1
2020-08-09 03:01:40 timer_01_c01 09.08.2020 04:00:00
2020-08-09 03:01:40 timer_02_c01 09.08.2020 20:00:00
Regex:
accu:
cond:
TemperatursensorSolar_T1:
0:
temperature ^TemperatursensorSolar_T1$:^temperature:
1:
temperature ^TemperatursensorSolar_T1$:^temperature:
attr:
waitdel:
condition:
0 ::DOIF_time($hash,0,1,$wday,$hms) and ::ReadingValDoIf($hash,'TemperatursensorSolar_T1','temperature') > 71.5
1 ::ReadingValDoIf($hash,'TemperatursensorSolar_T1','temperature') < 48
days:
do:
0:
0 set Solarheizung on; sleep 5400; set Solarheizung off
1:
0 set Solarheizung off
2:
helper:
DEVFILTER ^global$|^TemperatursensorSolar_T1$
NOTIFYDEV global|TemperatursensorSolar_T1
event T: 71.4,temperature: 71.4
globalinit 1
last_timer 2
sleeptimer -1
timerdev TemperatursensorSolar_T1
timerevent T: 71.7,temperature: 71.7
triggerDev TemperatursensorSolar_T1
timerevents:
T: 71.7
temperature: 71.7
timereventsState:
state: T: 71.7
temperature: 71.7
triggerEvents:
T: 71.4
temperature: 71.4
triggerEventsState:
state: T: 71.4
temperature: 71.4
internals:
interval:
0 -1
1 0
intervalfunc:
intervaltimer:
localtime:
0 1596938400
1 1596996000
perlblock:
readings:
all TemperatursensorSolar_T1:temperature
realtime:
0 04:00:00
1 20:00:00
time:
0 04:00:00
1 20:00:00
timeCond:
0 0
1 0
timer:
0 0
1 0
timers:
0 0 1
trigger:
triggertime:
1596996000:
localtime 1596996000
hash:
uiTable:
Mit
(set Solarheizung on, sleep 5400; set Solarheizung off)
sollte es funktionieren
Aber die Lösung von Otto ist besser
Hatte das Ganze auch ohne sleep probiert, also nur set Solarheizung on, hat auch nur bedingt funktioniert.
Was komisch ist, wenn ich def ändere also beispielsweise eine andere Temperatur hinterlege, funktioniert es.
Am nächsten Tag funktioniert es nicht mehr.
Dir fehlt wahrscheinlich ein attr do always.
Ich vermute dein Ding geht im Moment nur wenn inzwischen die Temperatur unter 48 kommt, weil das eine Statusänderung verursacht.
Du hast leider das Attributes Teil vom "list" gekürzt
Hallo,
eventuell attr do always ?
Mfg
Hans-Jürgen
Was meint ihr mit do always ?
Entweder Attribut do always (siehe CommandRef)
Oder ein leeres DOELSE (siehe auch CommandRef).
Das 2. wäre sogar mMn hier besser.
https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung
do always ist bei zyklisch sendenden Sensoren hier TemperatursensorSolar_T1:temperature "verboten"
Was empfiehlst du Damian ?
Bin nicht Damian, aber:
bei zyklisch sendenden Sensoren wie Temperatursensoren führt ein do always dazu, dass bei jeder Temperaturänderung wiederum ein Befehl, hier "set Solarheizung on", geschickt wird. Das ist in meisten Fällen nicht gewünscht, deswegen sagt er "verboten".
Ich empfehle:
1 - CommandRef lesen, um zu verstehen wie ein DOIF funktioniert. Mindestens den von mir verlinkten Absatz, wo die Thematik "do always und DOELSE" erklärt wird.
2 - leeres DOELSE
Habe nochmal verschiedene Dinge probiert allerdings ohne Erfolg.
Kann es sein das ich genau das EVENT mit 71.5 benötige damit geschalten wird ?
Evntuell gibt es auch ein anderen Lösungsansatz für das was ich hier umsetzen möchte.
Würde mich freuen wenn Ihr mir etwas postet.
Danke
Zitat von: Mellowback am 22 August 2020, 17:13:14
Kann es sein das ich genau das EVENT mit 71.5 benötige damit geschalten wird ?
Nein, du brauchst nur ein leeres DOELSE.
Wenn das nicht geht, bitte erklären was nicht geht, und "list" vom DOIF im "falschen" Zustand posten
Ab 71.5 grad soll die Pumpe eingeschaltet werden. Leider schaltet er nicht obwohl schon 75 grad und mehr.
Internals:
DEF ([04:00-20:00] and [TemperatursensorSolar_T1:Temperature] > 71) (set Solarheizung on) DOELSEIF ([TemperatursensorSolar_T1:Temperature] < 48) (set Solarheizung off)
FUUID 5ec13e64-f33f-2b59-0b95-a7fe451e5817b7f8
MODEL FHEM
NAME SolarHeizungssteuerung
NOTIFYDEV TemperatursensorSolar_T1,global
NR 570
NTFY_ORDER 50-SolarHeizungssteuerung
STATE initialized
TYPE DOIF
VERSION 22588 2020-08-12 19:25:15
READINGS:
2020-08-22 17:39:49 cmd 0
2020-08-22 17:39:49 mode enabled
2020-08-22 17:39:49 state initialized
2020-08-23 03:01:17 timer_01_c01 23.08.2020 04:00:00
2020-08-23 03:01:17 timer_02_c01 23.08.2020 20:00:00
2020-08-23 04:00:00 warning condition c01: Argument "" isn't numeric in numeric gt (>)
Regex:
accu:
cond:
TemperatursensorSolar_T1:
0:
Temperature ^TemperatursensorSolar_T1$:^Temperature:
1:
Temperature ^TemperatursensorSolar_T1$:^Temperature:
condition:
0 ::DOIF_time($hash,0,1,$wday,$hms) and ::ReadingValDoIf($hash,'TemperatursensorSolar_T1','Temperature') > 71
1 ::ReadingValDoIf($hash,'TemperatursensorSolar_T1','Temperature') < 48
days:
do:
0:
0 set Solarheizung on
1:
0 set Solarheizung off
2:
helper:
DEVFILTER ^global$|^TemperatursensorSolar_T1$
NOTIFYDEV global|TemperatursensorSolar_T1
event timer_1
globalinit 1
last_timer 2
sleeptimer -1
triggerDev
triggerEvents:
timer_1
triggerEventsState:
timer_1
interval:
0 -1
1 0
intervalfunc:
intervaltimer:
localtime:
0 1598148000
1 1598205600
perlblock:
readings:
all TemperatursensorSolar_T1:Temperature
realtime:
0 04:00:00
1 20:00:00
time:
0 04:00:00
1 20:00:00
timeCond:
0 0
1 0
timer:
0 0
1 0
timers:
0 0 1
triggertime:
1598205600:
localtime 1598205600
hash:
uiTable:
Attributes:
Zitat 2020-08-23 04:00:00 warning condition c01: Argument "" isn't numeric in numeric gt (>)
[TemperatursensorSolar_T1:Temperature] liefert keinen Wert. Schreibfehler? Klein/gross Buchstaben Problem? Wenn ich mit deinem ersten "list" vergleiche, war
temperature klein geschrieben, jetzt gross.
Ich sehe immer noch kein leeres DOELSE
Ok habe wieder temperature klein geschrieben.
Ergebnis:
Internals:
DEF ([04:00-20:00] and [TemperatursensorSolar_T1:temperature] > 71) (set Solarheizung on) DOELSEIF ([TemperatursensorSolar_T1:temperature] < 48) (set Solarheizung off)
FUUID 5ec13e64-f33f-2b59-0b95-a7fe451e5817b7f8
MODEL FHEM
NAME SolarHeizungssteuerung
NOTIFYDEV TemperatursensorSolar_T1,global
NR 570
NTFY_ORDER 50-SolarHeizungssteuerung
STATE initialized
TYPE DOIF
VERSION 22588 2020-08-12 19:25:15
READINGS:
2020-08-23 18:15:08 cmd 0
2020-08-23 18:15:08 mode enabled
2020-08-23 18:15:08 state initialized
2020-08-23 18:15:08 timer_01_c01 24.08.2020 04:00:00
2020-08-23 18:15:08 timer_02_c01 23.08.2020 20:00:00
Regex:
accu:
cond:
TemperatursensorSolar_T1:
0:
temperature ^TemperatursensorSolar_T1$:^temperature:
1:
temperature ^TemperatursensorSolar_T1$:^temperature:
condition:
0 ::DOIF_time($hash,0,1,$wday,$hms) and ::ReadingValDoIf($hash,'TemperatursensorSolar_T1','temperature') > 71
1 ::ReadingValDoIf($hash,'TemperatursensorSolar_T1','temperature') < 48
days:
do:
0:
0 set Solarheizung on
1:
0 set Solarheizung off
2:
helper:
DEVFILTER ^global$|^TemperatursensorSolar_T1$
NOTIFYDEV global|TemperatursensorSolar_T1
globalinit 1
last_timer 2
sleeptimer -1
interval:
0 -1
1 0
intervalfunc:
localtime:
0 1598234400
1 1598205600
readings:
all TemperatursensorSolar_T1:temperature
realtime:
0 04:00:00
1 20:00:00
time:
0 04:00:00
1 20:00:00
timeCond:
0 0
1 0
timer:
0 0
1 0
timers:
0 0 1
triggertime:
1598205600:
localtime 1598205600
hash:
1598234400:
localtime 1598234400
hash:
uiTable:
Attributes:
room Technikraum
Meinst du ich soll aus dem DOELSEIF ein DOELSE machen ?
Nein, ich meine Du schreibst noch ein DOELSE danach am Ende.
Aber er sollte zumindest das erste Mal schalten. Zeig mal bitte ein "list TemperatursensorSolar_T1"
List schaut wie folgt aus:
Internals:
DEF 6C27E501
FUUID 5eb7ae51-f33f-2b59-6429-12cd166abc9566ee
NAME TemperatursensorSolar_T1
NOTIFYDEV global
NR 564
NTFY_ORDER 50-TemperatursensorSolar_T1
STATE Temperatur: 52.8 °C
TYPE CUL_HM
chanNo 01
device TemperatursensorSolar
READINGS:
2020-08-23 19:06:21 state T: 52.8
2020-08-23 19:06:21 temperature 52.8
helper:
peerFriend
peerOpt p:THSensor
regLst
cmds:
TmplKey :no:1598144476.02832
TmplTs 1598144476.02832
cmdKey 1:0:0::TemperatursensorSolar:00A8:01:
cmdLst:
burstXmit noArg
clear [(readings|trigger|register|oldRegs|rssi|msgEvents|{msgErrors}|attack|all)]
getConfig noArg
getRegRaw (List0|List1|List2|List3|List4|List5|List6) [-peerChn-]
peerBulk -peer1,peer2,..- [({set}|unset)]
peerChan 0 -actChn- [({single})] [({set}|unset)] [actor|remote|both]
regBulk -list-.-peerChn- -addr1:data1- -addr2:data2-...
regSet [(prep|{exec})] -regName- -value- [-peerChn-]
tplDel -tplDel-
lst:
condition slider,0,1,255
peer
peerOpt
tplDel
rtrvLst:
cmdList [({short}|long)]
deviceInfo [({short}|long)]
param -param-
reg -addr- -list- [-peerChn-]
regList noArg
regTable noArg
regVal -addr- -list- [-peerChn-]
saveConfig [-filename-]
tplInfo noArg
expert:
def 1
det 0
raw 1
tpl 0
role:
chn 1
tmpl:
Attributes:
model HM-WDS30-OT2-SM
peerIDs 00000000,
room Homekit,Technikraum
stateFormat Temperatur: temperature °C
Wie würde der Code mit dem DOELSE dann ausschauen ?
Für heute wird doch die Zeit nicht mehr wahr?
Wie gesagt, einfach DOELSE am Ende
Vorher:
([04:00-20:00] and [TemperatursensorSolar_T1:temperature] > 71) (set Solarheizung on) DOELSEIF ([TemperatursensorSolar_T1:temperature] < 48) (set Solarheizung off)
Nachher:
([04:00-20:00] and [TemperatursensorSolar_T1:temperature] > 71) (set Solarheizung on) DOELSEIF ([TemperatursensorSolar_T1:temperature] < 48) (set Solarheizung off) DOELSE
Zitat von: Otto123 am 23 August 2020, 19:24:14
Für heute wird doch die Zeit nicht mehr wahr?
Klar, timer01_c01 liegt in der Zukunft. Das ist aber nur der nächste Trigger, und er sollte trotzdem schalten, wenn temperatur sich meldet.
Temperatur ist aber im Moment zwischen 71 und 48. Dann ist nichts wahr, und ohne DOELSE geht er nicht in cmd_3
Zitat von: amenomade am 23 August 2020, 19:57:42
er sollte trotzdem schalten, wenn temperatur sich meldet.
Das wundert mich auch, ich sehe keinen Temperaturtriggerevent e_TemperatursensorSolar_T1_temperature!
Also haben wir doch kein Event ?
Ich werde morgen den Wert auf 61 setzen und Euch Feedback ob morgen geschalten wurde.
Danke
Der Sensor meldet per default ca. alle 2,5 min. Also Eventmonitor auf und Du weißt in 2,5 min Bescheid! :o
Scheint zu passen, siehe Bild.
Jepp, alles ok jetzt. (ein "list" ist immer besser als ein Bild)
Die aktuelle Definition ist nicht 100% sauber. Mit DOELSE wird bei 71 und 48 Grad ggf. zwischen zwei Zuständen getoggelt. Wann soll genau Off-Befehl außerhalb der Zeitspanne kommen?
Außerhalb der Zeit soll garnicht geschalten werden.
Zitat von: Mellowback am 23 August 2020, 23:31:49
Außerhalb der Zeit soll garnicht geschalten werden.
Wird aber unter 48 Grad.