Hauptmenü

neues Modul DOIF

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

Vorheriges Thema - Nächstes Thema

MadCat

#1305
Zitat von: Invers am 08 Februar 2015, 10:19:54
Ich denke mal, ich würde vor und nach dem or Klammern setzen, damit die Prüfung korrekt stattfinden kann.

define Puffersteuerung_DI DOIF (([Kesselpumpe:?on] and [Puffer2_100:temperature] < 40) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature] < 40 )) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)

Das hatte ich auch schon versucht, dann kommt aber das hier als Fehlermeldung:
DOIF: no left bracket of condition: define Puffersteuerung_DI DOIF (([Kesselpumpe:?on] and [Puffer2_100:temperature] < 40) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature] < 40 )) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)


EDIT:

Habe es jetzt doch hin bekommen, Fehler waren die ?, nach dem ich diese raus genommen habe Funktioniert es jetzt so wie es soll.

Bartimaus

Guten Morgen,
was will mir diese Meldung im Log sagen?:
ZirkulationsPumpeDOIF: {  }: HASH(0x2257d98)

Die Timer werden dennoch korrekt ausgeführt.
LG
B.


FHEM@AMD-Ryzen7-5700U@Debian-LXC (ProxmoxHOST), CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

MadCat

#1307
Hab mich leider zu früh gefreut, irgendwo ist in meiner Bedingung noch der Wurm drin.

Das DOIF macht generell alles so wie es soll, aber Wenn Bedingung 1 erfüllt ist, anschließend Bedingung 2 erfüllt ist aber dann Bedingung 1 nicht mehr erfüllt ist, schaltet DOIF aus, obwohl die Bedingung 2 immer noch erfüllt wird.

Dann kommt es auch vor das selbst wenn beide Bedingungen erfüllt werden DOIF nach kurzer Zeit auf off geht.

Invers

Um die Klammersetzung wirst du wohl nicht rumkommen. Ausserdem würde ich mit eq "on" probieren, statt mit :on

define Puffersteuerung_DI DOIF (([Kesselpumpe] eq "on" and [Puffer2_100:temperature] < 40) or ([Heizkreispumpe] eq "on" and [Puffer1_25:temperature] < 40 )) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2

MadCat

#1309
Hallo Invers,

mit den Klammern und  eq "on"  hatte ich auch schon versucht, aber damit geht DOIF sofort auf STATE off.

Wenn ich die Commandref richtig verstanden habe müsste das eigendlich so aussehen, aber das mag fhem gar nicht.

define Puffer_DI DOIF ([Kesselpumpe?:on] and [Puffer2_100:temperature]<30) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature]<50)  (set Heizkreisventil on) DOELSE (set Heizkreisventil off)

Brockmann

Zitat von: MadCat am 10 Februar 2015, 12:00:18
Wenn ich die Commandref richtig verstanden habe müsste das eigendlich so aussehen, aber das mag fhem gar nicht.
define Puffer_DI DOIF ([Kesselpumpe?:on] and [Puffer2_100:temperature]<30) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature]<50)  (set Heizkreisventil on) DOELSE (set Heizkreisventil off)

Da hast Du etwas falsch verstanden, denn das ist keine korrekte DOIF-Definiton:
DOIF (Bedingung)(Aktion)DOELSE(Aktion)

Was Du da geschrieben hast ist aber:
DOIF (Bedingung)(Bedingung)(Aktion)DOELSE(Aktion)

Du musst also um (Bedingung)(Bedingung) zumindest nochmal Klammern setzen, damit es formal korrekt ist:
define Puffer_DI DOIF (([Kesselpumpe:?on] and [Puffer2_100:temperature]<30) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature]<50))  (set Heizkreisventil on) DOELSE (set Heizkreisventil off)

Und Dass es eigentlich [Kesselpumpe:?on] heißen muss, ist Dir aber klar und vermutlich nur ein Tippfehler, oder?

Ist Dir klar, was der Unterschied zwischen [Kesselpumpe:?on] und [Kesselpumpe] eq "on" ist? Dann verstehst Du auch, warum es zu unterschiedlicher Funktionalität führt.

Generell wäre es hilfreich, wenn Du mit list Puffer_DI ein komplettes Listing des DOIF einstellst, anstatt nur die Definition reinzukopieren oder abzutippen.

MadCat

Hallo Brockmann,

kannst Du mir sagen wo ich das list Puffer_DI eingeben muss, bin noch nicht so firm mit fhem.

Brockmann

Zitat von: MadCat am 10 Februar 2015, 12:22:05
kannst Du mir sagen wo ich das list Puffer_DI eingeben muss, bin noch nicht so firm mit fhem.
Im Eingabefeld der Weboberfläche.

RoBra81

Hallo,

ich habe zwei Bewegungsmelder mit deren Events ich eine Bewegungsrichtung erkennen möchte. Hierfür habe ich (auch weil es je nach Bewegungsrichtung verschiedene Aktionen geben soll) an DOIF gedacht. Leider funktioniert schon ein einfaches DOIF, in welchem ich nur die Bewegungsrichtung anzeigen lassen will nicht.

Hier mein DOIF:

define OG.xx.BM.Logik.DI DOIF ([OG.ez.BM.Whg_Tuer.STATE:?on] and [?OG.tr.BM.Treppe:STATE] eq 'on') DOELSEIF ([OG.tr.BM.Treppe.STATE:?on] and [?OG.ez.BM.Whg_Tuer:STATE] eq 'on') DOELSE
attr OG.xx.BM.Logik.DI cmdState Runter|Hoch|Unbekannt
attr OG.xx.BM.Logik.DI do always


Meine Bewegungsmelder heißen OG.ez.BM.Whg_Tuer und OG.tr.BM.Treppe und erzeugen z.B. folgendes Events:

2015-02-10 11:48:06 HM485 OG.tr.BM.Treppe STATE: on
2015-02-10 11:48:11 HM485 OG.ez.BM.Whg_Tuer STATE: on
2015-02-10 11:48:33 HM485 OG.tr.BM.Treppe STATE: off
2015-02-10 11:48:59 HM485 OG.ez.BM.Whg_Tuer STATE: off


In diesem Fall hätte das DOIF meiner Meinung nach den State "Runter" haben müssen.

Wo liegt mein (Denk-)Fehler?

Vielen Dank
Ronny

RoBra81

Hab's gerade selbst gefunden - richtig muss es lauten:

define OG.xx.BM.Logik.DI DOIF ([OG.ez.BM.Whg_Tuer:?STATE.*on] and [?OG.tr.BM.Treppe:STATE] eq 'on') DOELSEIF ([OG.tr.BM.Treppe:?STATE.*on] and [?OG.ez.BM.Whg_Tuer:STATE] eq 'on') DOELSE
attr OG.xx.BM.Logik.DI cmdState Runter|Hoch|Unbekannt
attr OG.xx.BM.Logik.DI do always


Ronny

RoBra81

Ich habe nochmal eine andere Herausforderung: Ich kann ja eine Aktion mittels Attribut "wait" nach Eintreten der Bedingung verzögern. Nun habe ich jedoch ein Bedingung die zwei Aktionen mit unterschiedlicher Verzögerung auslösen soll - etwa in der Art ("Pseudocode"):

Wenn Bedingung erfüllt, dann schalte nach 5 Minuten das Licht aus und setzt Wert eines Dummys nach 15 Minuten auf x.
Wenn Bedingung innerhalb der ersten 5 Minuten nicht mehr erfüllt, dann mache nix.
Wenn Bedingung zwischen Minute 5 und 15 nicht mehr erfüllt, dann wurde das Licht ausgeschaltet aber Aktion nicht ausgeführt.


Gibt es hierfür eine Lösung mit einem DOIF oder muss ich mit mehreren DOIFs und Dummys arbeiten?

Vielen Dank
Ronny

MadCat

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

Zitat von: RoBra81 am 10 Februar 2015, 14:55:45
Ich habe nochmal eine andere Herausforderung: Ich kann ja eine Aktion mittels Attribut "wait" nach Eintreten der Bedingung verzögern. Nun habe ich jedoch ein Bedingung die zwei Aktionen mit unterschiedlicher Verzögerung auslösen soll - etwa in der Art ("Pseudocode"):


Gibt es hierfür eine Lösung mit einem DOIF oder muss ich mit mehreren DOIFs und Dummys arbeiten?

Vielen Dank
Ronny

Dazu gibt es doch in der Comandref ein Beispiel, wo man zwei Atribute mit Wait verzögern kann.
Musst Du mal gucken ob Du das für Dich verwenden kannst.

RoBra81

Zitat von: MadCat am 10 Februar 2015, 15:01:52
Dazu gibt es doch in der Comandref ein Beispiel, wo man zwei Atribute mit Wait verzögern kann.
Musst Du mal gucken ob Du das für Dich verwenden kannst.

Ja, damit kann ich zwei Bedingungen unterschiedlich verzögern, aber bei mir ist es leider eine Bedingung mit zwei Aktionen die verzögert nacheinander ausgeführt werden sollen.

der-Lolo

Da wäre dann im ausführungsteil sowas wie
Zitat({fhem("set dustRobot command PowerToggle ;; sleep 1 ;; set dustRobot command Turbo ;; sleep 1 ;; set dustRobot command Start ;; set Erna done")})

Das richtige für dich... sleep halt dann so wie Du die Verzögerung brauchst.
Das ganze ist nicht fhem blockierend...