Hallo,
Ich verstehe IF aus anderen Programmierungen, aber in Fhem habe sowohl Probleme mit IF als DOIF
Ich habe zwar schon ein paar Dinge definiert, aber die funktionieren nicht, wie sie sollen.
Bsp:
Internals:
DEF ([Ventil_1_Schalter] eq "on" and
[(ReadingsNum("Temp_Ausgang_Puffer","Temperatur_Ausgang_Puffer",""))] > [(ReadingsNum("Boiler_Temperatur","Temperatur_Boiler",""))]
+ [Hysterese])
(set Boilerladepumpe_Schalter on)
DOELSE (set Boilerladepumpe_Schalter off)
NAME Schalt_Boilerladepumpe
NR 727
NTFY_ORDER 50-Schalt_Boilerladepumpe
STATE cmd_2
TYPE DOIF
READINGS:
2017-10-22 04:30:00 Device Ventil_1_Schalter
2017-10-21 14:02:47 cmd 2
2017-10-21 14:02:47 cmd_event Hysterese
2017-10-21 14:02:47 cmd_nr 2
2017-10-21 14:03:45 e_Hysterese_STATE 2
2017-10-22 04:30:00 e_Ventil_1_Schalter_STATE on
2017-10-21 14:02:47 state cmd_2
2017-10-22 00:00:46 timer_01_c01 23.10.2017 00:00:42
2017-10-22 00:00:46 timer_02_c01 23.10.2017 00:00:44
condition:
0 InternalDoIf($hash,'Ventil_1_Schalter','STATE') eq "on" and DOIF_time_once($hash,0,$wday) > DOIF_time_once($hash,1,$wday) + InternalDoIf($hash,'Hysterese','STATE')
days:
devices:
0 Ventil_1_Schalter Hysterese
all Ventil_1_Schalter Hysterese
do:
0:
0 set Boilerladepumpe_Schalter on
1:
0 set Boilerladepumpe_Schalter off
helper:
event on
globalinit 1
last_timer 2
sleeptimer -1
timerdev Ventil_1_Schalter
timerevent on
triggerDev Ventil_1_Schalter
timerevents:
on
timereventsState:
state: on
triggerEvents:
on
triggerEventsState:
state: on
internals:
0 Ventil_1_Schalter:STATE Hysterese:STATE
all Ventil_1_Schalter:STATE Hysterese:STATE
interval:
itimer:
localtime:
0 1508709642.56
1 1508709644.88
readings:
realtime:
0 00:00:42
1 00:00:44
regexp:
0:
all:
state:
STATE:
time:
0 (ReadingsNum("Temp_Ausgang_Puffer","Temperatur_Ausgang_Puffer",""))
1 (ReadingsNum("Boiler_Temperatur","Temperatur_Boiler",""))
timeCond:
0 0
1 0
timer:
0 0
1 0
timers:
0 0 1
trigger:
triggertime:
1508709642.56:
localtime 1508709642.56
hash:
1508709644.88:
localtime 1508709644.88
hash:
Attributes:
event-on-change-reading 1
room 2.03_Heizung_Schalter
dazu meine Definition:
define Schalt_Boilerladepumpe DOIF ([Ventil_1_Schalter] eq "on" and \
[(ReadingsNum("Temp_Ausgang_Puffer","Temperatur_Ausgang_Puffer",""))] > [(ReadingsNum("Boiler_Temperatur","Temperatur_Boiler",""))] \
+ [Hysterese]) \
(set Boilerladepumpe_Schalter on) \
DOELSE (set Boilerladepumpe_Schalter off)
Wenn ich nun das list und die definition so ansehe, vermisse ich im List die Temperaturangaben.
In der Definition werden mir diese aber angebeben:
Bsp: Temp_Ausgang_Puffer: 51,2
Boiler_Temperatur: 41,8
Die Hysterese ist auf 2 Grad derzeit gestellt.
Ventil_1: on
Also müsste das DOIF nach meinem Gedankengang auf cmd1 gehen
Macht es aber nicht.
Um genau zu sein, das DOIF macht gar nichts.
Wo habe ich meinen Fehler?
Setze den Vergleich mal noch in eine eigene klammer.
DEF ([Ventil_1_Schalter] eq "on" and
([(ReadingsNum("Temp_Ausgang_Puffer","Temperatur_Ausgang_Puffer",""))] > [(ReadingsNum("Boiler_Temperatur","Temperatur_Boiler",""))]
+ [Hysterese]))
Gesendet von meinem S3_32 mit Tapatalk
Hmm ...
Könntest recht haben. Damit sind die einzelnen Vergleiche sauber getrennt.
Klammern habe ich mal eingefügt.
Das Ergebnis wird sich morgen oder übermorgen zeigen.
Für heute habe ich es bereits per Hand gemacht.
Ich würde es so machen:
defmod Schalt_Boilerladepumpe DOIF ([Ventil_1_Schalter] eq "on" and [Temp_Ausgang_Puffer:Temperatur_Ausgang_Puffer] > \
([Boiler_Temperatur:Temperatur_Boiler] + [Hysterese])) (set Boilerladepumpe_Schalter on) DOELSE (set Boilerladepumpe_Schalter off)
Wobei mir Deine Geräte und Readings komisch vorkommen.
Zeig mal bitte je ein list von Boiler_Temperatur und Temp_Ausgang_Puffer
Wenn die Hysterese wirklich eine sein soll würde ich dann auch ein DOELSEIF machen
([Ventil_1_Schalter] eq "off" or [Temp_Ausgang_Puffer:Temperatur_Ausgang_Puffer] < [Boiler_Temperatur:Temperatur_Boiler])
Gruß Otto
Zitat von: Otto123 am 22 Oktober 2017, 14:53:38
Wobei mir Deine Geräte und Readings komisch vorkommen.
Zeig mal bitte je ein list von Boiler_Temperatur und Temp_Ausgang_Puffer
Hier das List von Boiler_Temperatur:
Internals:
DEF 10.0.0.201 80 espBridge ESP_Keller_Temp_Boiler
ESP_BUILD 147
ESP_SLEEP 0
ESP_UNIT 0
ESP_VERSION 9
HOST 10.0.0.201
IDENT ESP_Keller_Temp_Boiler
INTERVAL 120
IODev espBridge
LASTInputDev espBridge
MSGCNT 672
NAME Boiler_Temperatur
NOTIFYDEV global
NR 652
NTFY_ORDER 50-Boiler_Temperatur
PORT 80
STATE Temperatur: 50.6 °
SUBTYPE device
TYPE ESPEasy
VERSION 1.33
espBridge_MSGCNT 672
espBridge_TIME 2017-10-22 16:21:43
Helper:
DBLOG:
temperature_T:
DbLogging:
TIME 1508682103.69011
VALUE 50.6
READINGS:
2017-10-22 16:21:43 Temperatur_Boiler 50.560
2017-09-07 17:42:47 alarm 0
2017-10-22 16:21:14 presence present
2017-10-22 16:21:43 state Tem: 50.560
2017-09-05 23:59:18 temperature 57.8125
2017-10-22 16:21:43 temperature_T 50.6
2017-02-11 11:50:37 temphigh 75
2017-02-11 11:50:22 templow 40
helper:
fpc 1508600930
pm:
Encode 1
JSON 1
received:
Temperatur_Boiler 1508682103
Attributes:
IODev espBridge
Interval 120
group Boiler
icon sani_boiler_temp
presenceCheck 1
readingSwitchText 1
room 2.01_Heizung,3.01_Solaranlage
setState 3
sortby 2
stateFormat {sprintf("Temperatur: %.1f °",ReadingsVal("Boiler_Temperatur","temperature_T",0))}
userReadings temperature_T:Temperatur_Boiler.* { int ( 10 * ReadingsVal("Boiler_Temperatur","Temperatur_Boiler",0) + 0.5 ) / 10 }
und von Temp_Ausgang_Puffer:
Internals:
DEF 10.0.0.201 80 espBridge ESP_Keller_Temp_Ausgang_Puffer
ESP_BUILD 147
ESP_SLEEP 0
ESP_UNIT 0
ESP_VERSION 9
HOST 10.0.0.201
IDENT ESP_Keller_Temp_Ausgang_Puffer
INTERVAL 120
IODev espBridge
LASTInputDev espBridge
MSGCNT 675
NAME Temp_Ausgang_Puffer
NOTIFYDEV global
NR 677
NTFY_ORDER 50-Temp_Ausgang_Puffer
PORT 80
STATE Temperatur: 36.7 °
SUBTYPE device
TYPE ESPEasy
VERSION 1.33
espBridge_MSGCNT 675
espBridge_TIME 2017-10-22 16:21:23
Helper:
DBLOG:
temperature_T:
DbLogging:
TIME 1508682083.66894
VALUE 36.7
READINGS:
2017-10-22 16:21:23 Temperatur_Ausgang_Puffer 36.690
2017-10-22 16:22:15 presence present
2017-10-22 16:22:15 state Tem: 36.690
2017-10-22 16:21:23 temperature_T 36.7
helper:
fpc 1508600930
pm:
Encode 1
JSON 1
received:
Temperatur_Ausgang_Puffer 1508682083
Attributes:
IODev espBridge
Interval 120
icon temp_temperature
presenceCheck 1
readingSwitchText 1
room 2.01_Heizung
setState 3
stateFormat {sprintf("Temperatur: %.1f °",ReadingsVal("Temp_Ausgang_Puffer","temperature_T",0))}
userReadings temperature_T:Temperatur_Ausgang_Puffer.* { int ( 10 * ReadingsVal("Temp_Ausgang_Puffer","Temperatur_Ausgang_Puffer",0) + 0.5 ) / 10 }
zur Vervollständigung noch das List von Hysterese:
Internals:
CFGFN FHEM/vorgabe.cfg
NAME Hysterese
NR 203
STATE 2
TYPE dummy
READINGS:
2017-10-21 14:03:45 state 2
Attributes:
group 1_Vorgaben
room 2.09_Heizung_Vorgaben
setList state:0.5,1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,7,8,9,10
webCmd state
Ok, das passt. Dann ist es so wie ich oben geschrieben habe. Das sollte funktionieren. Kannst Du so in die Raw Def werfen :)
Gruß Otto
Danke Otto,
Habe meine Definition jetzt verändert.
Die nächsten Tage zeigen ob das nun funktioniert.
Denke, dass wich wieder etwas gelernt habe.
Was ich noch nicht weiß, ist der Umgang mit den DOIF-Tools.
Ich habe diese zwar mal definiert, werde aber noch nicht schlau daraus.
Gruß
Georg
ZitatWas ich noch nicht weiß, ist der Umgang mit den DOIF-Tools.
Ein Blick in die Bedienungsanleitung (https://wiki.fhem.de/wiki/DOIFtools) sollte das ändern können.
Das DOIF funktioniert jetzt!
Danke für die Hilfe.