FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: maci am 12 Februar 2017, 16:12:21

Titel: Problem mit einer DOIF Definition
Beitrag von: maci am 12 Februar 2017, 16:12:21
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
Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: KölnSolar am 12 Februar 2017, 16:31:40
Verschieben kannst Du selber mit dem Button unten links.
Grüße Markus
Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: maci am 12 Februar 2017, 16:42:58
OK Danke - nicht gesehen.
Ist inzwischen gemacht.
Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: Damian am 12 Februar 2017, 16:48:55
Zitat von: maci am 12 Februar 2017, 16:42:58
OK Danke - nicht gesehen.
Ist inzwischen gemacht.
Poste mal list von deinem DOIF-Modul.
Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: KernSani am 12 Februar 2017, 16:50:43
Poste mal ein "list" des DOIF. 

Edit: Wenn der Chef persönlich sich kümmert bin ich mal still ;-)
Titel: Antw:Problem mit einer DOIF Definition
Beitrag 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


Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: igami am 12 Februar 2017, 16:56:12
ich hab noch nicht ganz verstanden wann du schalten willst. Vielleicht kannst du ja auch mal beschreiben was die Werte darstellen.
Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: maci am 12 Februar 2017, 17:11:40
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. :)

Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: Damian am 12 Februar 2017, 17:20:08
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.

Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: maci am 12 Februar 2017, 18:25:30
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. :-[
Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: KernSani am 12 Februar 2017, 18:27:09
list Heizkoerperpumpe_Betriebins Kommandofeld eingeben
Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: maci am 12 Februar 2017, 18:43:27
Thank you!
Titel: Antw:Problem mit einer DOIF Definition
Beitrag 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:
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!
Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: Damian am 12 Februar 2017, 21:00:16
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
Titel: Antw:Problem mit einer DOIF Definition
Beitrag 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.
Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: Damian am 13 Februar 2017, 09:00:49
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.
Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: Per am 13 Februar 2017, 15:24:03
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!
Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: maci am 13 Februar 2017, 20:37:09
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.
Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: Per am 14 Februar 2017, 20:09:26
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).
Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: maci am 15 Februar 2017, 14:14:22
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.
Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: maci am 15 Februar 2017, 17:39:10
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:

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:

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?
Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: automatisierer am 15 Februar 2017, 17:49:13
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.

Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: maci am 15 Februar 2017, 18:08:24
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.
Titel: Antw:Problem mit einer DOIF Definition
Beitrag 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.

Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: maci am 15 Februar 2017, 21:43:34
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.  :)
Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: automatisierer am 15 Februar 2017, 22:11:44
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"
Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: Per am 16 Februar 2017, 11:34:38
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 ;).
Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: maci am 16 Februar 2017, 12:00:48
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.


Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: maci am 27 Februar 2017, 14:03:33
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
Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: automatisierer am 27 Februar 2017, 15:56:38
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.


Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: Ellert am 27 Februar 2017, 19:27:07
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.
Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: maci am 03 März 2017, 08:49:39
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.

Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: Ellert am 03 März 2017, 10:09:03
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
Titel: Antw:Problem mit einer DOIF Definition
Beitrag von: maci am 09 März 2017, 18:38:35
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