Problem mit einer DOIF Definition

Begonnen von maci, 12 Februar 2017, 16:12:21

Vorheriges Thema - Nächstes Thema

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

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!

maci

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.
Fhem auf Dell Thinclient, Fhem auf Raspebrry Pi4,
UniPi Vers. 1.1 mit Raspberry Pi3, 1wire USB Adapter mit OWX
Netatmo Wetterstation + Regenmesser + Netatmo Thermostat
Homematic mit HMLan

Per

#18
Warum gehst du in die Perl-Ebene?
(set dev1 on,set dev2 on)
tut es doch auch.

Zumindest unter DOIF.

maci

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.
Fhem auf Dell Thinclient, Fhem auf Raspebrry Pi4,
UniPi Vers. 1.1 mit Raspberry Pi3, 1wire USB Adapter mit OWX
Netatmo Wetterstation + Regenmesser + Netatmo Thermostat
Homematic mit HMLan

maci

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?
Fhem auf Dell Thinclient, Fhem auf Raspebrry Pi4,
UniPi Vers. 1.1 mit Raspberry Pi3, 1wire USB Adapter mit OWX
Netatmo Wetterstation + Regenmesser + Netatmo Thermostat
Homematic mit HMLan

automatisierer

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.


maci

#22
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.
Fhem auf Dell Thinclient, Fhem auf Raspebrry Pi4,
UniPi Vers. 1.1 mit Raspberry Pi3, 1wire USB Adapter mit OWX
Netatmo Wetterstation + Regenmesser + Netatmo Thermostat
Homematic mit HMLan

automatisierer

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.


maci

#24
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.  :)
Fhem auf Dell Thinclient, Fhem auf Raspebrry Pi4,
UniPi Vers. 1.1 mit Raspberry Pi3, 1wire USB Adapter mit OWX
Netatmo Wetterstation + Regenmesser + Netatmo Thermostat
Homematic mit HMLan

automatisierer

#25
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"

Per

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 ;).

maci

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.


Fhem auf Dell Thinclient, Fhem auf Raspebrry Pi4,
UniPi Vers. 1.1 mit Raspberry Pi3, 1wire USB Adapter mit OWX
Netatmo Wetterstation + Regenmesser + Netatmo Thermostat
Homematic mit HMLan

maci

#28
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
Fhem auf Dell Thinclient, Fhem auf Raspebrry Pi4,
UniPi Vers. 1.1 mit Raspberry Pi3, 1wire USB Adapter mit OWX
Netatmo Wetterstation + Regenmesser + Netatmo Thermostat
Homematic mit HMLan

automatisierer

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 steht wie das geht, dann kannst du nachvollziehen, warum dein DOIF nicht so funktioniert wie du es erwartest.