Ich habe mit eine DOIF Definition gebastelt.
Doch irgendwie funktioniert diese nicht.
So sieht sie derzeit aus:
Zitatdefine Heizkoerperpumpe_Betrieb DOIF ([Temp_Ausgang_Puffer:temperature] < [Boiler_Temperatur:temperature] \
or [Boiler_Temperatur:temperature] > 50 or [Temp_Ausgang_Puffer:temperature] > 30) \
(set Heizkoerperpumpe on) \
DOELSEIF ([Boiler_Temperatur:temperature] < [Temp_Ausgang_Puffer:temperature] or [Temp_Ausgang_Heizung:temperature] < 30) \
(set Heizkoerperpumpe off)
Die entsprechenden Definitionen habe ich zuvor natürlich alle angelegt.
Die Pumpe kann über das Dummy problemlos geschaltet werden.
Die derzeitigen Temperatur Werte sind:
Temp_Ausgang_Puffer: 38.0625
Boiler_Temperatur: 58.125
Also müsste die Pumpe ein sein. Ist sie aber nicht.
Hier meine Defintionen bevor ich das DOIF erstellt habe:
Pumpe ein wenn:
Boiler_Temperatur > 50 Grad
Temp_Ausgang_Puffer > 30 Grad
Boilerladepumpe aus
Mit der IF Abfrage: [Temp_Ausgang_Puffer:temperature] < [Boiler_Temperatur:temperature] will ich abfragen, dass die Boilerladepumpe aus ist. Habe es deshalb so gemacht, weil ich die Abfrage ob die Boilerladepumpe läuft nicht hinbekommen habe.
Später will ich das ganze mit der THRESHOLD Funktion noch erweitern, doch das ist mir derzeit noch etwas zu kryptisch.
Könnte mir jemand auf die Sprünge helfen wie ich das lösen könnte?
Danke im Voraus
Verschieben kannst Du selber mit dem Button unten links.
Grüße Markus
OK Danke - nicht gesehen.
Ist inzwischen gemacht.
Zitat von: maci am 12 Februar 2017, 16:42:58
OK Danke - nicht gesehen.
Ist inzwischen gemacht.
Poste mal list von deinem DOIF-Modul.
Poste mal ein "list" des DOIF.
Edit: Wenn der Chef persönlich sich kümmert bin ich mal still ;-)
Versuch mal das Attribut do auf always zusetzen, das wird häufig vergessen.
Ansonsten wären mehr Infos hilfreich, also ein komplettes zum Problem gehörendes Eventlog usw.
Wie hier beschrieben: https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche
ich hab noch nicht ganz verstanden wann du schalten willst. Vielleicht kannst du ja auch mal beschreiben was die Werte darstellen.
Zitat von: Ellert am 12 Februar 2017, 16:54:44
Versuch mal das Attribut do auf always zusetzen, das wird häufig vergessen.
Ansonsten wären mehr Infos hilfreich, also ein komplettes zum Problem gehörendes Eventlog usw.
Wie hier beschrieben: https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche
Das mit dem Attribut do always war das Problem. :)
Zitat von: maci am 12 Februar 2017, 17:11:40
Das mit dem Attribut do always war das Problem. :)
Vorsicht. Du benutzt zyklisch sendende Temperatursensoren. Mit dem Attribut do always wird bei jedem Senden einer Temperatur deine Heizkoerperpumpe geschaltet - das willst du bestimmt nicht.
Ich tippe eher auf ein Verständnisproblem bei der Formulierung logischer Abfragen. Bei der Negation einer Abfrage wird aus einem oder ein und. Dein off-Befehl soll vermutlich weitgehend das Gegenteil der Einschaltbedingung sein.
Danke für die Info.
Verständnisproblem: Ich glaube da hast du recht. Es sind ja meine ersten Schritte mit DOIF.
Ich frage mich derzeit, wie ich Temperaturen abgefragte Temperaturen da einbinden kann?
Oder muss sich das Attribut ändern?
Das mit dem Off Befehl ist richtig, da suche ich derzeit auch nach einer Lösung.
Wie gut dass derzeit alles im Test läuft. D.h. die Relais schalten zwar, aber keine Last.
Das wiederholte Klacken habe ich schon gehört.
Eine Verständnisfrage: Wie kann ich ein List posten? Vielleicht stehe ich auf der Leitung. :-[
list Heizkoerperpumpe_Betrieb
ins Kommandofeld eingeben
Thank you!
ich habe mich jetzt weiter beschäftigt mit der Geschichte.
Habe zuerst einen anderen Ausgang versucht zu definieren.
Hier meine Definition:
Zitatdefine Schalt_Boilerladepumpe THRESHOLD Boiler_Temperatur Boilerladepumpe
und dann das DOIF
Zitatdefine a_Schalt_Boilerladepumpe DOIF ([Temp_Ausgang_Puffer:temperature] > [Boiler_Temperatur:temperature]) \
(set Schalt_Boilerladepumpe desired 20) \
DOELSE (set Schalt_Boilerladepumpe desired 50)
dazu gebe ich auch dann gleich mein Listening
ZitatInternals:
DEF ([Temp_Ausgang_Puffer:temperature] > [Boiler_Temperatur:temperature])
(set Schalt_Boilerladepumpe desired 20)
DOELSE (set Schalt_Boilerladepumpe desired 50)
NAME a_Schalt_Boilerladepumpe
NR 240
NTFY_ORDER 50-a_Schalt_Boilerladepumpe
STATE cmd_2
TYPE DOIF
Readings:
2017-02-12 20:43:10 Device Boiler_Temperatur
2017-02-12 20:34:34 cmd 2
2017-02-12 20:34:34 cmd_event Temp_Ausgang_Puffer
2017-02-12 20:34:34 cmd_nr 2
2017-02-12 20:43:10 e_Boiler_Temperatur_temperature 56.8125
2017-02-12 20:43:08 e_Temp_Ausgang_Puffer_temperature 42.0625
2017-02-12 20:34:34 state cmd_2
Condition:
0 ReadingValDoIf($hash,'Temp_Ausgang_Puffer','temperature') > ReadingValDoIf($hash,'Boiler_Temperatur','temperature')
Devices:
0 Temp_Ausgang_Puffer Boiler_Temperatur
all Temp_Ausgang_Puffer Boiler_Temperatur
Do:
0:
0 set Schalt_Boilerladepumpe desired 20
1:
0 set Schalt_Boilerladepumpe desired 50
Helper:
event temperature: 56.8125,alarm: 1
globalinit 1
last_timer 0
sleeptimer -1
timerdev Boiler_Temperatur
timerevent temperature: 56.8125,alarm: 1
triggerDev Boiler_Temperatur
timerevents:
temperature: 56.8125
alarm: 1
timereventsState:
temperature: 56.8125
alarm: 1
triggerEvents:
temperature: 56.8125
alarm: 1
triggerEventsState:
temperature: 56.8125
alarm: 1
Internals:
Itimer:
Readings:
0 Temp_Ausgang_Puffer:temperature Boiler_Temperatur:temperature
all Temp_Ausgang_Puffer:temperature Boiler_Temperatur:temperature
Regexp:
0:
All:
State:
Trigger:
Attributes:
room Heizung_Schalter
Wie es funktioniert weiß ich noch nicht, da ja die Werte nicht gegeben sind.
Ich belasse es mal so und denke, dass ich morgen schon etwas sehen werde.
Bei Fehlern macht mich bitte aufmerksam.
Danke!
Zitat von: maci am 12 Februar 2017, 20:48:05
ich habe mich jetzt weiter beschäftigt mit der Geschichte.
Habe zuerst einen anderen Ausgang versucht zu definieren.
Hier meine Definition:und dann das DOIF
dazu gebe ich auch dann gleich mein Listening
Wie es funktioniert weiß ich noch nicht, da ja die Werte nicht gegeben sind.
Ich belasse es mal so und denke, dass ich morgen schon etwas sehen werde.
Bei Fehlern macht mich bitte aufmerksam.
Danke!
Das ist doch schon mal was. Testest du evtl. mit dem Kommando trigger?
Edit: ich sehe gerade: es ist ja alles ok: boiler ist größer als Puffer daher cmd_2
Ich teste mit gemessenen Sensorwerten.
Mein System läuft schon an Ort und Stelle, mit angeschlossenen Sensoren.
Nur die Relais schalten noch nicht wirklich.
Die Echtsteuerung macht noch das alte analoge System.
Aber trigger ist ein guter Tipp.
Zitat von: maci am 13 Februar 2017, 08:41:22
Ich teste mit gemessenen Sensorwerten.
Mein System läuft schon an Ort und Stelle, mit angeschlossenen Sensoren.
Nur die Relais schalten noch nicht wirklich.
Die Echtsteuerung macht noch das alte analoge System.
Aber trigger ist ein guter Tipp.
In diesem Fall ist trigger kein guter Tipp, denn du wertest die Readings aus und nicht das Ereignis.
Zitat von: Damian am 12 Februar 2017, 17:20:08Ich tippe eher auf ein Verständnisproblem bei der Formulierung logischer Abfragen. Bei der Negation einer Abfrage wird aus einem oder ein und. Dein off-Befehl soll vermutlich weitgehend das Gegenteil der Einschaltbedingung sein.
Wobei er mit DOELSE eher zum Ziel kommt als mit der einzelnen (und hier fehlerhaften) Negation. Denn eine Hysterese ist ja auch nicht eingebaut. Hoffentlich hat die Anlage eine entsprechende Trägheit!
Ich habe die Hysterese jetzt auf 2 gesetzt
Zitatdefine Schalt_Boilerladepumpe THRESHOLD Boiler_Temperatur:temperature:2 Boilerladepumpe
Das Relays hat heute auch schon ein paar mal geschaltet.
2 Schaltvorgänge der 5 Schaltung waren extrem kurz, nur 1 min.
Darum habe ich jetzt die Hysterese erhöht.
Nun suche ich nach einer Lösung wie ich diesen Schaltvorgang auf 2 Relais ausdehnen kann.
Es sollen immer 2 Relais gemeinsam geschaltet werden.
Ich habe es mal so probiert, da ich in einem Artikel zu THRESHOLD so etwas gefunden habe.
Zitat{fhem("set Switch1 on;set Switch2 on")}
Ich habe so ähnlich geschrieben, doch das funktioniert nicht.
Zitat{fhem(Boilerladepumpe;Umschaltventil_1")}
Da bekomme ich eine Meldung dass
Zitat;Umschaltventil_1
nicht definiert ist.
Wie kann ich das lösen?
Bezüglich der Schaltvorgänge beobachte ich noch weiter.
Warum gehst du in die Perl-Ebene?
(set dev1 on,set dev2 on)
tut es doch auch.
Zumindest unter DOIF (https://forum.fhem.de/index.php?board=73.0).
Das mit den beiden Relays habe ich gelöst in dem ich einen eigenen Dummy angelegt habe.
Könnte mich vielleicht selbst bei der Nase nehmen und evtl hin und wieder zu en Grundlagen greifen. ???
Wie die Schalterei funktioniert muss ich noch genauer austesten.
Hallo an alle,
Weiter geht es mit einer weiteren Definition, die kurz funktioniert, dann aber wieder auf off geht.
Hier mal meine Vorgaben beschrieben:
Heizkörperpumpe ein wenn:
- Boilerladepumpe off
- Temperatur Ausgang Puffer > 30
- Zeit zwischen 12:30 - 23:00
- Boilertemperatur > Temperatur Ausgang Puffer
Dazu jetzt mein DOIF:
Zitatdefine Schalt_Heizkoerperpumpe DOIF ([Boilerladepumpe:"off"] and [12:30-23:00] and \
[Temp_Ausgang_Puffer:temperature] < [Boiler_Temperatur:temperature] and [Temp_Ausgang_Puffer:temperature] > 30) \
(set Heizkoerperpumpe on) \
DOELSE (set Heizkoerperpumpe off)
Stand beim Test echten Temperaturen um 17:25 Uhr:
- Boilerladepumpe off
- Temperatur Ausgang Puffer 39,5625
- Boilertemperatur 54,625
Ich habe zum Test die Bolierladepumpe eingeschaltet und wieder ausgeschaltet.
Dadurch hat das DOIF reagiert.
Es hat auch die Pumpe eingeschaltet, aber nach 20 sec gleich wieder aus.
Jetzt frage ich mich, was ist falsch?
Was soll ich ändern?
DOIF ([Boilerladepumpe:"off"]
du reagierst hier auf ein event. falls Boilerladepumpe ein anderes EVent als off schickt, wird der DOELSE Fall ausgelöst.
wenn du probleme mit einem DOIF hast, immer ein list davon posten, nicht die Definition. Ein list ist viel aussagekräftiger.
Ich habe jetzt das ganze nochmals nachgestellt.
Dabei ist mir beim list aufgefallen, dass das Ausschalten bei zyklischen Lesen der Temperatur kommt.
Alle 2 Minuten werden die Temperaturen gelesen.
Hier das liste dazu:
Internals:
DEF ([Boilerladepumpe:"off"] and [12:30-23:00] and
[Temp_Ausgang_Puffer:temperature] < [Boiler_Temperatur:temperature] and [Temp_Ausgang_Puffer:temperature] > 30)
(set Heizkoerperpumpe on)
DOELSE (set Heizkoerperpumpe off)
NAME Schalt_Heizkoerperpumpe
NR 288
NTFY_ORDER 50-Schalt_Heizkoerperpumpe
STATE cmd_2
TYPE DOIF
Readings:
2017-02-15 18:03:50 Device Boiler_Temperatur
2017-02-15 18:03:42 cmd 2
2017-02-15 18:03:42 cmd_event Temp_Ausgang_Puffer
2017-02-15 18:03:42 cmd_nr 2
2017-02-15 18:03:50 e_Boiler_Temperatur_events temperature: 54.5,alarm: 1
2017-02-15 18:03:50 e_Boiler_Temperatur_temperature 54.5
2017-02-15 18:01:53 e_Boilerladepumpe_events off
2017-02-15 18:03:42 e_Temp_Ausgang_Puffer_events temperature: 40.125,alarm: 1
2017-02-15 18:03:42 e_Temp_Ausgang_Puffer_temperature 40.125
2017-02-15 18:03:42 state cmd_2
2017-02-15 17:21:16 timer_01_c01 16.02.2017 12:30:00
2017-02-15 17:21:16 timer_02_c01 15.02.2017 23:00:00
Condition:
0 EventDoIf('Boilerladepumpe',$hash,'off',1) and DOIF_time($hash,0,1,$wday,$hms) and ReadingValDoIf($hash,'Temp_Ausgang_Puffer','temperature') < ReadingValDoIf($hash,'Boiler_Temperatur','temperature') and ReadingValDoIf($hash,'Temp_Ausgang_Puffer','temperature') > 30
Days:
Devices:
0 Boilerladepumpe Temp_Ausgang_Puffer Boiler_Temperatur
all Boilerladepumpe Temp_Ausgang_Puffer Boiler_Temperatur
Do:
0:
0 set Heizkoerperpumpe on
1:
0 set Heizkoerperpumpe off
Helper:
event temperature: 54.5,alarm: 1
globalinit 1
last_timer 2
sleeptimer -1
timerdev Boiler_Temperatur
timerevent temperature: 54.5,alarm: 1
triggerDev Boiler_Temperatur
timerevents:
temperature: 54.5
alarm: 1
timereventsState:
temperature: 54.5
alarm: 1
triggerEvents:
temperature: 54.5
alarm: 1
triggerEventsState:
temperature: 54.5
alarm: 1
Internals:
Interval:
0 -1
1 0
Itimer:
Localtime:
0 1487244600
1 1487196000
Readings:
0 Temp_Ausgang_Puffer:temperature Boiler_Temperatur:temperature
all Temp_Ausgang_Puffer:temperature Boiler_Temperatur:temperature
Realtime:
0 12:30:00
1 23:00:00
Regexp:
0:
All:
State:
Time:
0 12:30:00
1 23:00:00
Timecond:
0 0
1 0
Timer:
0 0
1 0
Timers:
0 0 1
Trigger:
all Boilerladepumpe
Triggertime:
1487196000:
localtime 1487196000
Hash:
1487244600:
localtime 1487244600
Hash:
Was kann ich da machen?
Update: Zwischenzeitlich wurde die Temperatur wieder aktualisiert, aber das DOIF reagiert nicht darauf.
Es wurde ja schon angemerkt, um dir helfen zu können benötigen wir weitere Infos.
Was soll das DOIF triggern? Die Uhrzeit, oder der Zustand der Boilerladepumpe, oder alle Beteiligten?
Unter welchen umständen soll der DOELSE-Fall ausgelöst werden.
Also im Prinzip genau beschreiben was geschehen soll wenn sich die Variablen verändern.
So wie du es jetzt gebaut hast, kann das DOIF nur durch das Event 'Boilerladepumpe off' ausgelöst werden. Events sind nur zu dem Zeitpunkt wahr, in dem sie erzeugt werden. Das bedeutet, sollte das DOIF durch eine der anderen Bedingungen getriggert werden, dann ist [Boilerladepumpe:"off"] immer unwahr und das fürt dann zum DOELSE-Fall.
Wenn du hingegen [Boilerladepumpe] eq "off" als Bedingung nimmst, dann wird beim triggern durch eine der anderen Bedingungen geprüft ob Boilerladepumpe auf off steht, wenn ja ist die Bedingung wahr, wenn nicht dann nicht.
Zitat von: automatisierer am 15 Februar 2017, 19:09:55
Es wurde ja schon angemerkt, um dir helfen zu können benötigen wir weitere Infos.
Was soll das DOIF triggern? Die Uhrzeit, oder der Zustand der Boilerladepumpe, oder alle Beteiligten?
Unter welchen umständen soll der DOELSE-Fall ausgelöst werden.
Also im Prinzip genau beschreiben was geschehen soll wenn sich die Variablen verändern.
So wie du es jetzt gebaut hast, kann das DOIF nur durch das Event 'Boilerladepumpe off' ausgelöst werden. Events sind nur zu dem Zeitpunkt wahr, in dem sie erzeugt werden. Das bedeutet, sollte das DOIF durch eine der anderen Bedingungen getriggert werden, dann ist [Boilerladepumpe:"off"] immer unwahr und das fürt dann zum DOELSE-Fall.
Wenn du hingegen [Boilerladepumpe] eq "off" als Bedingung nimmst, dann wird beim triggern durch eine der anderen Bedingungen geprüft ob Boilerladepumpe auf off steht, wenn ja ist die Bedingung wahr, wenn nicht dann nicht.
Ich habe bisher max eine Vergleich bisher gemacht. Bin davon ausgegangen dass es hier auch so ist, wie bei der Chipprogrammierung. Hier habe auch Vergleiche gegen 2-3 Beteiligte.
Hier heisst es wenn und dann müssen alle Wahr sein, ansonsten wird else gemacht.
Mit Triggerung hatte nicht bisher noch nie etwas zu tun.
Das wird auch der Grund sein, dass es nicht so funktioniert, wie gewünscht.
Es soll nach allen Beteiligten geprüft werden. Ich habe das eq schon mal eingefügt.
Es heißt jetzt:
[Boilerladepumpe eq"off"]
Dürfte aber auch nicht passen, denn in den Readings lese ich bei timer_01_c01 diese Meldung: :(
error: Wrong timespec Boilerladepumpeeq"off": either HH:MM:SS or {perlcode}
Bitte klärt mich auf, wie das mit der Triggerung funktioniert.
Am besten wird sein, dass ich Schritt für Schritt zur Lösung komme, denn da lernt man. :)
Zitat von: maci am 15 Februar 2017, 14:14:22
Könnte mich vielleicht selbst bei der Nase nehmen und evtl hin und wieder zu en Grundlagen greifen. ???
Also, sich mal so grob durch die Commandref zu lesen kann bestimmt nicht schaden, auch wenn das evtl. schwieriger ist als hier Fragen zu stellen...
[Boilerladepumpe eq"off"]
ist falsche Syntax...
so müsste das aussehen:
[Boilerladepumpe] eq "off"
alle Bedingungen die du aufführst, triggern das DOIF - wird das DOIF getriggert, werden alle Bedingungen geprüft. Soll eine Bedingung nur geprüft werden, aber das DOIF nicht triggern, dann musst du ein Fragezeichen voran stellen, so:
[?Boilerladepumpe] eq "off"
Zitat von: automatisierer am 15 Februar 2017, 22:11:44dann musst du ein Fragezeichen voran stellen, so:
[?Boilerladepumpe eq"off"]
Natürlich nicht so, sondern so:
[?Boilerladepumpe] eq "off"
Hast ja oben noch selbst berichtigt ;).
Zitat von: automatisierer am 15 Februar 2017, 22:11:44
alle Bedingungen die du aufführst, triggern das DOIF - wird das DOIF getriggert, werden alle Bedingungen geprüft. Soll eine Bedingung nur geprüft werden, aber das DOIF nicht triggern, dann musst du ein Fragezeichen voran stellen, ...
Danke das hilft mir schon ungemein weiter! :)
Werde dann zusätzlich noch die Commandref studieren.
Hallo an alle,
Nachdem mein DOIF jetzt ca 2 Wochen (Test) erfolgreich funktioniert hat, ist seit gestern alles anders.
Das ganze DOIF reagiert auf keine Änderung der Werte mehr.
hier mein List des DOIFs:
Save config ?
9.03_Tech
9.99_Test
Heizung
Heizung_Schalter
Heizung_Vorgaben
Logging
Solaranlage
UniPi
Unsorted
Wetter
icoEverything Everything
Logfile
Commandref
Remote doc
Edit files
Select style
Event monitor
Internals:
DEF ([Boilerladepumpe] eq "off" and [12:30-23:00] and
[?Temp_Ausgang_Puffer:temperature] < [Boiler_Temperatur:temperature] and [?Temp_Ausgang_Puffer:temperature] >[Puffer_Tmin])
(set Heizkoerperpumpe on)
DOELSE (set Heizkoerperpumpe off)
NAME Schalt_Heizkoerperpumpe
NR 282
NTFY_ORDER 50-Schalt_Heizkoerperpumpe
STATE initialized
TYPE DOIF
Readings:
2017-02-27 13:51:45 cmd 0
2017-02-27 13:51:45 state initialized
2017-02-27 13:51:45 timer_01_c01 28.02.2017 12:30:00
2017-02-27 13:51:45 timer_02_c01 27.02.2017 23:00:00
Condition:
0 InternalDoIf($hash,'Boilerladepumpe','STATE') eq "off" and DOIF_time($hash,0,1,$wday,$hms) and ReadingValDoIf($hash,'Temp_Ausgang_Puffer','temperature') < ReadingValDoIf($hash,'Boiler_Temperatur','temperature') and ReadingValDoIf($hash,'Temp_Ausgang_Puffer','temperature') >InternalDoIf($hash,'Puffer_Tmin','STATE')
Days:
Devices:
0 Boilerladepumpe Boiler_Temperatur Puffer_Tmin
all Boilerladepumpe Boiler_Temperatur Puffer_Tmin
Do:
0:
0 set Heizkoerperpumpe on
1:
0 set Heizkoerperpumpe off
Helper:
globalinit 1
last_timer 2
sleeptimer -1
Internals:
0 Boilerladepumpe:STATE Puffer_Tmin:STATE
all Boilerladepumpe:STATE Puffer_Tmin:STATE
Interval:
0 -1
1 0
Itimer:
Localtime:
0 1488281400
1 1488232800
Readings:
0 Temp_Ausgang_Puffer:temperature Boiler_Temperatur:temperature
all Temp_Ausgang_Puffer:temperature Boiler_Temperatur:temperature
Realtime:
0 12:30:00
1 23:00:00
Regexp:
All:
State:
Time:
0 12:30:00
1 23:00:00
Timecond:
0 0
1 0
Timer:
0 0
1 0
Timers:
0 0 1
Triggertime:
1488232800:
localtime 1488232800
Hash:
1488281400:
localtime 1488281400
Hash:
Attributes:
room Heizung_Schalter
Ich verstehe das nicht mehr.
Gemacht habe ich gestern ein Systemupdate, da ich den mysql Server zum Loggen installiert habe.
Neustart des Systems wurde nicht durchgeführt.
wenn ich ehrlich bin blicke ich bei den ganze DOIF nicht wirklich durch.
Ich kenne wenn-dann Konstruktionen bei anderen Programmierungen. Hier funktionieren diese, was ich auch schreibe.
Anfangs dachte ich noch, es sei hier sehr ähnlich, aber anscheinend ist es nicht so.
Ich weiß, das ist jetzt sehr allgemein. Aber ich stehe derzeit total am Schlauch und weiß nicht wo ich anfangen soll, warum das nicht geht.
Für mich sieht es so aus, als wären alle Voraussetzungen zum Einschalten erfüllt.
Was ich nicht verstehe, was ist der Unterschied von state und zyklisch?
Wenn ich alle 2 min einen Temperaturwert bekomme, dann ist für mich zyklisch, wird aber in state geschrieben??
Weiters habe ich meine Verständnisprobleme mit dem Triggern. Triggern heisst auslösen, anstossen für mich.
Wenn ich mein DOIF so lasse wie es jetzt ist wird es nur durch Boilerladepumpe = off und der Zeitangabe getriggert.
Wenn nun aber die Boilerladepumpe nie auf ON war, wird sie auch nicht auf OFF gehen, da sie das bereits ist. Also fällt dieser Trigger weg.
Bleibt noch die Zeitangabe. Doch da ist nichts passiert.
Oder triggert diese Angabe nicht?
Bitte um Hilfe
Danke
ja, wo soll ich anfangen??
#########
wenn was in state steht, dann betrifft das nur den Status des Device und hat nix mit zyklisch oder statisch zu tun.
#########
Dein DOIF wird hier durch getriggert:
[Boilerladepumpe]
[12:30-23:00]
[Boiler_Temperatur:temperature]
[Puffer_Tmin]
wenn eines von den Devices ein Event erzeugt, dann werden die Bedingungen die gestellt hast geprüft. Das Event muss nix mit der zu prüfenden Bedingung zu tun haben. Wenn 'Boilerladepumpe' ein Event erzeugt, dann merkt DOIF das und überpfüft daraufhin, ob der 'state' von 'Boilerladepumpe' 'off' entspricht. Danach wird die Uhrzeit geprüft, usw...
##########
Wenn dein DOIF nicht den Zustand wechselt, dann werden die Bedingungen nicht erfüllt. Das kannst nur du überprüfen. Oder du machst von allen beteiligten Devices ein list und postest es. Du kannst auch zur Fehlersuche dein DOIF und alle beteiligten Devices loggen, im https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche#Verhaltensanalyse_des_DOIF (https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche#Verhaltensanalyse_des_DOIF) steht wie das geht, dann kannst du nachvollziehen, warum dein DOIF nicht so funktioniert wie du es erwartest.
Zitat von: maci am 27 Februar 2017, 14:03:33
Hallo an alle,
wenn ich ehrlich bin blicke ich bei den ganze DOIF nicht wirklich durch.
Ich kenne wenn-dann Konstruktionen bei anderen Programmierungen. Hier funktionieren diese, was ich auch schreibe.
Anfangs dachte ich noch, es sei hier sehr ähnlich, aber anscheinend ist es nicht so.
Ich weiß, das ist jetzt sehr allgemein. Aber ich stehe derzeit total am Schlauch und weiß nicht wo ich anfangen soll, warum das nicht geht.
Das grundsätzliche Verhalten von DOIF ist hier ergänzend erläutert: https://wiki.fhem.de/wiki/DOIF/Einsteigerleitfaden,_Grundfunktionen_und_Erl%C3%A4uterungen#Struktur_und_Verhalten_des_DOIF
Lies das mal, dann wird Dir der Unterschied zu den von Dir erwähnten Programmierbefehlen vielleicht deutlicher.
Wenn ich mir das so ansehe im Wiki, frage ich mich wie ich nach dieser Struktur und Bedingungen schreiben soll.
Bsp: Bedingung 1 ist ein Zeitrahmen, Bedingung 2 ist ein Vergleich von Werten.
Die DOIF Anweisung bekommt ein Ereignis.
Es wird nach Bedingung 1 geprüft. Diese ist wahr!
Nun soll aber auch nach Bedingung 2 geprüft werden.
Doch in der Grafik ist dieser Fall nicht zu finden.
Hier gibt es nur DOIF Bedingung 1 -> wahr -- Prüfung der Bedingung -> wahr -- Befehl ausführen
Ich brauche bei und Bedingungen aber den Fall:
DOIF Bedingung 1 -> wahr -- Prüfung der Bedingung -> wahr -- Bedingung 2 prüfen , usw.
Für mich sind die Einzelprüfungen einzelne Bedingungen.
Diese Grafik kann ich auf oder anwenden, da passt es.
Ich müsste im Prinzip mehrere DOIF's verschachteln. Dann komme ich hin.
Sehe ich das falsch, oder wie soll ich sonst aufbauen.
ZitatDoch in der Grafik ist dieser Fall nicht zu finden.
Hier gibt es nur DOIF Bedingung 1 -> wahr -- Prüfung der Bedingung -> wahr -- Befehl ausführen
Genau das ist die Arbeitsweise des DOIF ohne steuernde Attribute. Es wir die erste Bedingung, bei der Zeit oder Ereignis zum Auslöser passen und die wahr wird ausgeführt.
Mit Attribut checkAll, werden alle Bedingungen geprüft, auch die, wo der Auslöser nicht zum Ereignis passt. Die erste wahre Bedingung wird ausgeführt.
DOIF verschachteln ist nicht vorgesehen.
Für Dich kommt eventuell dieses Schema in Frage:
DOIF (["A"] or ["B"] or [HH:MM:SS] or ...)
(
IF (<Bedingung>) (<Befehle>) ELSE (Befehle),
IF (<Bedingung>) (<Befehle>) ELSE (Befehle),
IF (<Bedingung>) (<Befehle>) ELSE (Befehle),
...
)
DOIF ist ein FHEM Gerät, IF ist ein FHEM-Befehl https://fhem.de/commandref_DE.html#IF
Hallo,
Habe nun einer meiner DOIFs umgebaut.
Ein DOIF mit einer IF Abfrage.
Es funktioniert zwar, grundsätzlich, aber die IF Abfrage macht etwas verkehrt, meine ich.
Hier das List:
Internals:
DEF ([4:30-19:00] and [HeizAutomatik] eq "on")
(
IF ([Temp_Ausgang_Puffer:temperature] > [Boiler_Temperatur:temperature])
(set Schalt_Boilerladepumpe desired [Puffer_Tmin])
ELSE
(set Schalt_Boilerladepumpe desired [Boiler_Tmax_Winter])
)
NAME a_Schalt_Boilerladepumpe
NR 279
NTFY_ORDER 50-a_Schalt_Boilerladepumpe
STATE cmd_1
TYPE DOIF
Readings:
2017-03-09 18:27:43 Device HeizAutomatik
2017-03-09 18:27:44 cmd 1
2017-03-09 18:27:44 cmd_event HeizAutomatik
2017-03-09 18:27:44 cmd_nr 1
2017-03-09 18:27:43 e_HeizAutomatik_STATE on
2017-03-09 18:27:44 state cmd_1
2017-03-09 18:22:03 timer_01_c01 10.03.2017 04:30:00
2017-03-09 18:22:03 timer_02_c01 09.03.2017 19:00:00
Condition:
0 DOIF_time($hash,0,1,$wday,$hms) and InternalDoIf($hash,'HeizAutomatik','STATE') eq "on"
Days:
Devices:
0 HeizAutomatik
all HeizAutomatik
Do:
0:
0 IF ([Temp_Ausgang_Puffer:temperature] > [Boiler_Temperatur:temperature]) (set Schalt_Boilerladepumpe desired [Puffer_Tmin]) ELSE (set Schalt_Boilerladepumpe desired [Boiler_Tmax_Winter])
Helper:
event on
globalinit 1
last_timer 2
sleeptimer -1
timerdev HeizAutomatik
timerevent on
triggerDev HeizAutomatik
timerevents:
on
timereventsState:
state: on
triggerEvents:
on
triggerEventsState:
state: on
Internals:
0 HeizAutomatik:STATE
all HeizAutomatik:STATE
Interval:
0 -1
1 0
Itimer:
Localtime:
0 1489116600
1 1489082400
Readings:
Realtime:
0 04:30:00
1 19:00:00
Regexp:
0:
All:
State:
Time:
0 4:30
1 19:00:00
Timecond:
0 0
1 0
Timer:
0 0
1 0
Timers:
0 0 1
Trigger:
Triggertime:
1489082400:
localtime 1489082400
Hash:
1489116600:
localtime 1489116600
Hash:
Attributes:
room 2.03_Heizung_Schalter
Ich kann es mir nicht erklären darum stelle ich es rein.
Bitte um Hilfe?
Danke im voraus