Hauptmenü

neues Modul DOIF

Begonnen von Damian, 21 Mai 2014, 15:53:18

Vorheriges Thema - Nächstes Thema

RoBra81

Zitat von: der-Lolo am 10 Februar 2015, 15:12:15
Das richtige für dich... sleep halt dann so wie Du die Verzögerung brauchst.
Das ganze ist nicht fhem blockierend...


...und würde auch abgebrochen, wenn die Bedingung in der Zeit nicht mehr erfüllt ist?

der-Lolo

nein, das glaube ich nicht...
Ich habe da noch eins welches in einer Ausführung zwei IF enthält - das wartet die wait time und erledigt dann IF oder ELSE...

Zitat([pl_soBad] eq "on") (
IF ([pr_soBad] eq "present")
   (IF ([player:config] eq "auto") (set sonos_Bad Volume 12,
   set sonos_Wohnzimmer AddMember sonos_Bad, attr pr_soBad disable 1,
   set EntertainmentEvents add Bad Lautsprecher im Automatikmode angeschaltet und zur Wohnzimmer Wiedergabe hinzugefügt...)
   ELSE (set EntertainmentEvents add Der Bad Lautsprecher ist im Sonossystem zur Wiedergabe bereit...,
   attr pr_soBad disable 1)
   )
ELSE
   (set pl_soBad off,set EntertainmentEvents add Netzwerkeinbindung missglückt, ich versuche den Player neu zu starten.,
   define at_pl_soBad at +00:00:05 set pl_soBad on)

Vielleicht hilft Dir das als Idee weiter...

Brockmann

Zitat von: MadCat am 10 Februar 2015, 14:57:05
hab das list jetzt mal ausgeführt und dabei kommt folgendes raus.
Ja, das sieht ja soweit alles in Ordnung aus. Wenn das DOIF jetzt nicht das tut, was Du möchtest, schaust Du Dir (am Besten unmittelbar zu dem Zeitpunkt) dieses detaillierte Listing an. Da kannst Du genau sehen, wodurch das DOIF zuletzt getriggert wurde und welche Werte die Parameter in den Konditionen hatten. Dann sollte also nachvollziehbar sein, warum Dein DOIF so reagiert wie es das tut. Ansonsten nochmal mit dem list zum fraglichen Zeitpunkt hier nachfragen.

MadCat

Zitat von: Brockmann am 10 Februar 2015, 15:29:38
Ja, das sieht ja soweit alles in Ordnung aus. Wenn das DOIF jetzt nicht das tut, was Du möchtest, schaust Du Dir (am Besten unmittelbar zu dem Zeitpunkt) dieses detaillierte Listing an. Da kannst Du genau sehen, wodurch das DOIF zuletzt getriggert wurde und welche Werte die Parameter in den Konditionen hatten. Dann sollte also nachvollziehbar sein, warum Dein DOIF so reagiert wie es das tut. Ansonsten nochmal mit dem list zum fraglichen Zeitpunkt hier nachfragen.

Hallo Brockmann,

das list war schon aktuell. Und obwohl beide Bedingungen erfüllt werden und das Heizkreisventil auf on gehen müsste, geht es sofort auf off und bleibt da stehen, selbst wenn ich die Soll Temperaturen ändere oder die Pumpen ein und ausschalte, hab alles versucht, aber es tut sich nix.

automatisierer

Zitat von: MadCat am 10 Februar 2015, 14:57:05
Hallo Brockmann,

hab das list jetzt mal ausgeführt und dabei kommt folgendes raus.

Internals:
   CFGFN
   DEF        (([Kesselpumpe:?on] and [Puffer2_100:temperature]<30) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature]<50))  (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
   NAME       Puffer_DI
   NR         154
   NTFY_ORDER 50-Puffer_DI
   STATE      off
   TYPE       DOIF
   Readings:
     2015-02-10 12:34:05   cmd_event       Puffer1_25
     2015-02-10 12:34:05   cmd_nr          2
     2015-02-10 12:34:02   e_Heizkreispumpe_events on: ok on ok
     2015-02-10 12:23:48   e_Kesselpumpe_events on ok
     2015-02-10 14:49:23   e_Puffer1_25_events temperature: 52.13
     2015-02-10 14:49:23   e_Puffer1_25_temperature 52.13
     2015-02-10 14:49:23   e_Puffer2_100_events temperature: 33.94
     2015-02-10 14:49:23   e_Puffer2_100_temperature 33.94
     2015-02-10 12:34:05   state           off
   Condition:
     0          (EventDoIf('Kesselpumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer2_100','temperature','')<30) or (EventDoIf('Heizkreispumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer1_25','temperature','')<50)
   Devices:
     0           Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
     all         Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
   Do:
     0          set Heizkreisventil on
     1          set Heizkreisventil off
   Helper:
     last_timer 0
     sleeptimer -1
     triggerDev Puffer2_100
     triggerEvents:
       temperature: 33.94
   Internals:
   Readings:
     0           Puffer2_100:temperature Puffer1_25:temperature
     all         Puffer2_100:temperature Puffer1_25:temperature
   State:
   Trigger:
     all         Kesselpumpe Heizkreispumpe
Attributes:
   cmdState   on|off
   room       Heizung


@MadCat und Brockmann,
kann es sein, dass das DOIF Probleme mit den Nachkommastellen der Temperaturen hat? Ich hab nu keinen genauen Plan wie Perl sich da verhält, könnte mir das nur als Problemchen vorstellen.

Gruß
Ingo

Brockmann

Zitat von: MadCat am 10 Februar 2015, 15:37:40
das list war schon aktuell. Und obwohl beide Bedingungen erfüllt werden und das Heizkreisventil auf on gehen müsste, geht es sofort auf off und bleibt da stehen, selbst wenn ich die Soll Temperaturen ändere oder die Pumpen ein und ausschalte, hab alles versucht, aber es tut sich nix.
Laut Listing liegen die Temperaturen doch jeweils ÜBER den Vorgaben in den Konditionen. Wie sollen die Bedingungen da erfüllt sein?

Brockmann

Zitat von: automatisierer am 10 Februar 2015, 15:41:58
kann es sein, dass das DOIF Probleme mit den Nachkommastellen der Temperaturen hat? Ich hab nu keinen genauen Plan wie Perl sich da verhält, könnte mir das nur als Problemchen vorstellen.
Nein, das sollte kein Problem sein. Wäre nur problematisch, wenn der Sensor noch die Maßeinheit mit ins Reading schreiben würde, dann müsste man das rausfiltern ([Puffer2_100:temperature:d]<30). Macht er ja aber offenbar nicht.

flurin

#1327
@MadCat

Versuch zuerst mit einer Bedingung:

define Puffersteuerung_DI DOIF ([Kesselpumpe] eq "on" and [Puffer2_100:temperature] < 40) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
attr Puffersteuerung_DI do always

automatisierer

wenn die bedingungen bei dem listing wahr sein soll, musst du die pfeile umdrehen. so bedeuten es, wahr wenn kleiner als 30

Rohan

#1329
@MadCat:

sind "Kesselpumpe" & Co. alles originäre Fhem-Devices oder sind da auch Dummys bei? Falls letzteres, müssten diese doch mit vorangestelltem "?" abgefragt werden, weil deren Statusänderungen doch keine Events erzeugen, oder?

Ist jetzt mehr ein Schuss ins Blaue ...

Edith: War wohl nix, gerade nochmal nachgelesen... das "?" braucht man ja gerade, wenn man nur auf Events reagieren will. Also wenn da Devices ohne Events bei sind müsste deine Abfrage dann nicht ständig wiederholt werden?


Gruß
Thomas
Fhem auf Mini-ITX mit Celeron 2-Core, HMLAN (> 55 Devices), CUL (FS20 und EM), RFXtrx 433E, Arduino (einige DS18B20), RPi mit 1-Wire (DS2423 für S0-Signale, DS18B20+), RPi/Arduino mit MQ-5 und MQ-9 (CO- und CNG/LPG-Sensor), CO-20 IAQ Sensor

MadCat

Ich habe jetzt noch einmal alles genau so eingestellt mit den Solltemperaturen wie es sein soll und ein frisches listing gemacht.

Internals:
   CFGFN
   DEF        (([Kesselpumpe:?on] and [Puffer2_100:temperature]<50) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature]<30))  (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
   NAME       Puffer_DI
   NR         154
   NTFY_ORDER 50-Puffer_DI
   STATE      off
   TYPE       DOIF
   Readings:
     2015-02-10 16:23:41   cmd_event       Puffer2_100
     2015-02-10 16:23:41   cmd_nr          2
     2015-02-10 16:23:40   e_Heizkreispumpe_events off: ok off ok
     2015-02-10 16:23:34   e_Kesselpumpe_events on ok
     2015-02-10 16:23:35   e_Puffer1_25_events temperature: 60.13
     2015-02-10 16:23:35   e_Puffer1_25_temperature 60.13
     2015-02-10 16:23:41   e_Puffer2_100_events temperature: 33.94
     2015-02-10 16:23:41   e_Puffer2_100_temperature 33.94
     2015-02-10 16:23:41   state           off
   Condition:
     0          (EventDoIf('Kesselpumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer2_100','temperature','')<50) or (EventDoIf('Heizkreispumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer1_25','temperature','')<30)
   Devices:
     0           Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
     all         Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
   Do:
     0          set Heizkreisventil on
     1          set Heizkreisventil off
   Helper:
     last_timer 0
     sleeptimer -1
     triggerDev Puffer2_100
     triggerEvents:
       temperature: 33.94
   Internals:
   Readings:
     0           Puffer2_100:temperature Puffer1_25:temperature
     all         Puffer2_100:temperature Puffer1_25:temperature
   State:
   Timerfunc:
   Trigger:
     all         Kesselpumpe Heizkreispumpe
Attributes:
   cmdState   on|off
   do         always
   room       Heizung


Die Pumpen und Sensoren sind keine Dummys.

Bedingung 1 ist erfüllt, sollte also das Heizkreisventil auf on gehen.
Wenn ich die Kesselpumpe kurz aus schalte und dann wieder ein, geht das Heizkreisventil auch kurz auf on und nach ein paar Secunden wieder auf off.

der-Lolo

versuch masl direkt nach auslösen ein list zu bekommen und die "paar" Sekunden später noch eins.
Ich vermute fast etwas anderes in deiner Config schaltet zusätzlich das Heizkreisventil.

MadCat

OK, hier mal die beiden list

Internals:
   CFGFN
   DEF        (([Kesselpumpe:?on] and [Puffer2_100:temperature]<50) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature]<30))  (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
   NAME       Puffer_DI
   NR         154
   NTFY_ORDER 50-Puffer_DI
   STATE      on
   TYPE       DOIF
   Readings:
     2015-02-10 16:39:53   cmd_event       Kesselpumpe
     2015-02-10 16:39:53   cmd_nr          1
     2015-02-10 16:23:40   e_Heizkreispumpe_events off: ok off ok
     2015-02-10 16:39:53   e_Kesselpumpe_events on ok
     2015-02-10 16:39:43   e_Puffer1_25_events temperature: 61.69
     2015-02-10 16:39:43   e_Puffer1_25_temperature 61.69
     2015-02-10 16:39:53   e_Puffer2_100_events temperature: 33.81
     2015-02-10 16:39:53   e_Puffer2_100_temperature 33.81
     2015-02-10 16:39:53   state           on
   Condition:
     0          (EventDoIf('Kesselpumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer2_100','temperature','')<50) or (EventDoIf('Heizkreispumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer1_25','temperature','')<30)
   Devices:
     0           Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
     all         Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
   Do:
     0          set Heizkreisventil on
     1          set Heizkreisventil off
   Helper:
     last_timer 0
     sleeptimer -1
     triggerDev Kesselpumpe
     triggerEvents:
       on ok
   Internals:
   Readings:
     0           Puffer2_100:temperature Puffer1_25:temperature
     all         Puffer2_100:temperature Puffer1_25:temperature
   State:
   Timerfunc:
   Trigger:
     all         Kesselpumpe Heizkreispumpe
Attributes:
   cmdState   on|off
   do         always
   room       Heizung


Internals:
   CFGFN
   DEF        (([Kesselpumpe:?on] and [Puffer2_100:temperature]<50) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature]<30))  (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
   NAME       Puffer_DI
   NR         154
   NTFY_ORDER 50-Puffer_DI
   STATE      off
   TYPE       DOIF
   Readings:
     2015-02-10 16:40:09   cmd_event       Puffer1_25
     2015-02-10 16:40:09   cmd_nr          2
     2015-02-10 16:23:40   e_Heizkreispumpe_events off: ok off ok
     2015-02-10 16:39:53   e_Kesselpumpe_events on ok
     2015-02-10 16:40:09   e_Puffer1_25_events temperature: 61.69
     2015-02-10 16:40:09   e_Puffer1_25_temperature 61.69
     2015-02-10 16:39:53   e_Puffer2_100_events temperature: 33.81
     2015-02-10 16:39:53   e_Puffer2_100_temperature 33.81
     2015-02-10 16:40:09   state           off
   Condition:
     0          (EventDoIf('Kesselpumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer2_100','temperature','')<50) or (EventDoIf('Heizkreispumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer1_25','temperature','')<30)
   Devices:
     0           Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
     all         Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
   Do:
     0          set Heizkreisventil on
     1          set Heizkreisventil off
   Helper:
     last_timer 0
     sleeptimer -1
     triggerDev Puffer1_25
     triggerEvents:
       temperature: 61.69
   Internals:
   Readings:
     0           Puffer2_100:temperature Puffer1_25:temperature
     all         Puffer2_100:temperature Puffer1_25:temperature
   State:
   Timerfunc:
   Trigger:
     all         Kesselpumpe Heizkreispumpe
Attributes:
   cmdState   on|off
   do         always
   room       Heizung

Brockmann

Zitat von: MadCat am 10 Februar 2015, 16:33:31
Bedingung 1 ist erfüllt, sollte also das Heizkreisventil auf on gehen.
Wenn ich die Kesselpumpe kurz aus schalte und dann wieder ein, geht das Heizkreisventil auch kurz auf on und nach ein paar Secunden wieder auf off.
Ich hatte ja schon mal gefragt, ob Du Dir über die Funktionsweise von [Kesselpumpe:?on] im Klaren bist?
Diese Bedingung reagiert auf ein Event des Device Kesselpumpe, in dem das Schlüsselwort "on" enthalten ist. Diese Bedingung ist wahr in dem Moment wo dieses Event generiert wird.
Laut Listing war das um 16:23:34.
Um 16:23:41 wurde das DOIF aber schon wieder getriggert, da war [Kesselpumpe:?on] schon nicht mehr wahr.

Warum verwendest Du nicht (wie hier schon mal vorgeschlagen) [Kesselpumpe] eq "on"? Diese Bedingung ist solange wahr, wie das Device Kesselpumpe den Status on hat.

Damian

#1334
Zitat von: MadCat am 10 Februar 2015, 16:41:37
OK, hier mal die beiden list

Internals:
   CFGFN
   DEF        (([Kesselpumpe:?on] and [Puffer2_100:temperature]<50) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature]<30))  (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
   NAME       Puffer_DI
   NR         154
   NTFY_ORDER 50-Puffer_DI
   STATE      on
   TYPE       DOIF
   Readings:
     2015-02-10 16:39:53   cmd_event       Kesselpumpe
     2015-02-10 16:39:53   cmd_nr          1
     2015-02-10 16:23:40   e_Heizkreispumpe_events off: ok off ok
     2015-02-10 16:39:53   e_Kesselpumpe_events on ok
     2015-02-10 16:39:43   e_Puffer1_25_events temperature: 61.69
     2015-02-10 16:39:43   e_Puffer1_25_temperature 61.69
     2015-02-10 16:39:53   e_Puffer2_100_events temperature: 33.81
     2015-02-10 16:39:53   e_Puffer2_100_temperature 33.81
     2015-02-10 16:39:53   state           on
   Condition:
     0          (EventDoIf('Kesselpumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer2_100','temperature','')<50) or (EventDoIf('Heizkreispumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer1_25','temperature','')<30)
   Devices:
     0           Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
     all         Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
   Do:
     0          set Heizkreisventil on
     1          set Heizkreisventil off
   Helper:
     last_timer 0
     sleeptimer -1
     triggerDev Kesselpumpe
     triggerEvents:
       on ok
   Internals:
   Readings:
     0           Puffer2_100:temperature Puffer1_25:temperature
     all         Puffer2_100:temperature Puffer1_25:temperature
   State:
   Timerfunc:
   Trigger:
     all         Kesselpumpe Heizkreispumpe
Attributes:
   cmdState   on|off
   do         always
   room       Heizung


Internals:
   CFGFN
   DEF        (([Kesselpumpe:?on] and [Puffer2_100:temperature]<50) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature]<30))  (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
   NAME       Puffer_DI
   NR         154
   NTFY_ORDER 50-Puffer_DI
   STATE      off
   TYPE       DOIF
   Readings:
     2015-02-10 16:40:09   cmd_event       Puffer1_25
     2015-02-10 16:40:09   cmd_nr          2
     2015-02-10 16:23:40   e_Heizkreispumpe_events off: ok off ok
     2015-02-10 16:39:53   e_Kesselpumpe_events on ok
     2015-02-10 16:40:09   e_Puffer1_25_events temperature: 61.69
     2015-02-10 16:40:09   e_Puffer1_25_temperature 61.69
     2015-02-10 16:39:53   e_Puffer2_100_events temperature: 33.81
     2015-02-10 16:39:53   e_Puffer2_100_temperature 33.81
     2015-02-10 16:40:09   state           off
   Condition:
     0          (EventDoIf('Kesselpumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer2_100','temperature','')<50) or (EventDoIf('Heizkreispumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer1_25','temperature','')<30)
   Devices:
     0           Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
     all         Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
   Do:
     0          set Heizkreisventil on
     1          set Heizkreisventil off
   Helper:
     last_timer 0
     sleeptimer -1
     triggerDev Puffer1_25
     triggerEvents:
       temperature: 61.69
   Internals:
   Readings:
     0           Puffer2_100:temperature Puffer1_25:temperature
     all         Puffer2_100:temperature Puffer1_25:temperature
   State:
   Timerfunc:
   Trigger:
     all         Kesselpumpe Heizkreispumpe
Attributes:
   cmdState   on|off
   do         always
   room       Heizung


Warum arbeitest du mit Eventabfragen [Kesselpumpe:?on]  statt mit Statusabfragen [Kesselpumpe] eq "on"? Eine Eventabfrage ist, im Gegensatz zu einer Statusabfrage nur in dieser "Sekunde" wahr in der sie stattfindet und sonst nicht und das war um 16:40:09 der Fall gewesen, was zu cmd2 führt.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF