Hauptmenü

neues Modul DOIF

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

Vorheriges Thema - Nächstes Thema

MadCat

Zitat von: Brockmann am 10 Februar 2015, 16:52:16
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.

Dnke für die Erklärung, hatte ich so gar nicht verstanden gehabt.

Das mit dem eq "on" hatte ich auch schon versucht, aber damit ging garnix, werde es aber noch einmal versuchen.

MadCat

Zitat von: Damian am 10 Februar 2015, 16:54:50
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

Hallo Damian, mit eq "on" geht DOIF direkt auf off und macht gar nichts.

mit

Damian

Zitat von: MadCat am 10 Februar 2015, 17:23:50
Hallo Damian, mit eq "on" geht DOIF direkt auf off und macht gar nichts.

mit

Dann war die Pumpe eben nicht "on". Auch hier kann man es nur mit einem list ... beurteilen.

Bei DOIF gibt es, wie bei Perl auch, unbegrenzte Möglichkeiten etwas zu definieren.

Anhand der e_... Readings sieht man schön, welche Ereignisse zu einer Zustandsänderung geführt haben und dann muss man einfach die Abfrage durchgehen und schauen welche Zustande die angegebenen Stati, Readings oder Events zu diesem Zeitpunkt hatten, dann erklärt sich immer das Verhalten des Moduls und das stimmt, weil die Auswertung der Bedingungen von Perl übernommen wird, immer.

Gruß

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

MadCat

Zitat von: Damian am 10 Februar 2015, 17:28:48
Dann war die Pumpe eben nicht "on". Auch hier kann man es nur mit einem list ... beurteilen.


Doch Pumpe war on, hier das listing

Internals:
   CFGFN
   DEF        (([Kesselpumpe] eq "on" and [Puffer2_100:temperature]<50) or ([Heizkreispumpe] eq "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 17:30:59   cmd_event       Puffer2_100
     2015-02-10 17:30:59   cmd_nr          2
     2015-02-10 17:30:40   e_Heizkreispumpe_STATE on ok
     2015-02-10 17:30:38   e_Kesselpumpe_STATE on ok
     2015-02-10 17:30:59   e_Puffer1_25_temperature 62.31
     2015-02-10 17:30:59   e_Puffer2_100_temperature 33.69
     2015-02-10 17:30:59   state           off
   Condition:
     0          (InternalDoIf('Kesselpumpe','STATE','') eq "on" and ReadingValDoIf('Puffer2_100','temperature','')<50) or (InternalDoIf('Heizkreispumpe','STATE','') eq "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
   Internals:
     0           Kesselpumpe:STATE Heizkreispumpe:STATE
     all         Kesselpumpe:STATE Heizkreispumpe:STATE
   Readings:
     0           Puffer2_100:temperature Puffer1_25:temperature
     all         Puffer2_100:temperature Puffer1_25:temperature
   State:
   Timerfunc:
   Trigger:
Attributes:
   cmdState   on|off
   do         always
   room       Heizung

Damian

Zitat von: MadCat am 10 Februar 2015, 17:32:20
Doch Pumpe war on, hier das listing

Internals:
   CFGFN
   DEF        (([Kesselpumpe] eq "on" and [Puffer2_100:temperature]<50) or ([Heizkreispumpe] eq "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 17:30:59   cmd_event       Puffer2_100
     2015-02-10 17:30:59   cmd_nr          2
     2015-02-10 17:30:40   e_Heizkreispumpe_STATE on ok
     2015-02-10 17:30:38   e_Kesselpumpe_STATE on ok
     2015-02-10 17:30:59   e_Puffer1_25_temperature 62.31
     2015-02-10 17:30:59   e_Puffer2_100_temperature 33.69
     2015-02-10 17:30:59   state           off
   Condition:
     0          (InternalDoIf('Kesselpumpe','STATE','') eq "on" and ReadingValDoIf('Puffer2_100','temperature','')<50) or (InternalDoIf('Heizkreispumpe','STATE','') eq "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
   Internals:
     0           Kesselpumpe:STATE Heizkreispumpe:STATE
     all         Kesselpumpe:STATE Heizkreispumpe:STATE
   Readings:
     0           Puffer2_100:temperature Puffer1_25:temperature
     all         Puffer2_100:temperature Puffer1_25:temperature
   State:
   Timerfunc:
   Trigger:
Attributes:
   cmdState   on|off
   do         always
   room       Heizung


Das stimmt nicht. Die Pumpe war "on ok" und nicht "on" das ist ein feiner Unterschied. So etwas kannst du, wie übrigens in der Commandref zu DOIF dokumentiert ist, mit [Kesselpumpe] =~ "on" abfragen.

Gruß

Damian

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

MadCat

Zitat von: Damian am 10 Februar 2015, 17:45:51
Das stimmt nicht. Die Pumpe war "on ok" und nicht "on" das ist ein feiner Unterschied. So etwas kannst du, wie übrigens in der Commandref zu DOIF dokumentiert ist, mit [Kesselpumpe] =~ "on" abfragen.

Gruß

Damian

Na Prima, dann wird da wohl die ganze Zeit der Fehler liegen.

Das On OK kommt von meinem ECMD Device, dann muss ich wohl meine classdef ändern.

flurin

Zitat von: RoBra81 am 10 Februar 2015, 14:55:45
...
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?

Was spricht dagegen zwei DOIF's zu verwenden? Meines Wissens ist es mit einem DOIF nicht möglich, ausser ev. mit einer perl Sub.

MadCat

Hallo Damian,

das  =~ "on" hat es gebracht, hab jetzt alle möglichen Situationen durchgespielt und es Schaltet jetzt alles genau so wie es soll.

Danke Dir und allen anderen für Eure Hilfe und Infos.

LG

Brockmann

ZitatWas spricht dagegen zwei DOIF's zu verwenden? Meines Wissens ist es mit einem DOIF nicht möglich, ausser ev. mit einer perl Sub.

Eventuell kann man es so in ein DOIF quetschen:
DI_Test DOIF (Bedingung)(Licht ein)
DOELSEIF(Bedingung and [DI_Test] eq "Licht_an")(Dummy x)
attr DI_Test wait 300:600
attr DI_Test cmdState Licht_an|Dummy_gesetzt


Mal so ins Unreine gedacht...

flurin

@Brockmann

attr DI_Test wait 300:600

Zuerst dachte ich auch, so könnte es funktionieren aber die Logik stimmt nicht.
Zudem ist sowas schwer zu warten: Fehler suchen, erweitern usw.

Gruss
flurin


Damian

Zitat von: flurin am 10 Februar 2015, 18:14:23
@Brockmann

attr DI_Test wait 300:600

Zuerst dachte ich auch, so könnte es funktionieren aber die Logik stimmt nicht.
Zudem ist sowas schwer zu warten: Fehler suchen, erweitern usw.

Gruss
flurin

Aus meiner Sicht sind es zwei unabhängige Geschichten:

define di_Licht DOIF (Bedingung) (set Licht aus)
attr wait 300

define di_Aktion DOIF (Bedingung) (set dummy x)
attr wait 900



Gruß

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

inesa394

Hallo

Habe hier ein DOIF das mich wenn ich nach Hause komme per Push und Stimme begrüßt.
([inesa] eq "home") (set pushbullet_inesa message Ines kommt nach Hause  ,sleep 20; set Tuer.GongMP3 playTone 039 )
Nun möchte ich das das doif nachdem es mich erkannt hat eine Zwangspause einlegt so von 10 minuten. 
Mit wait scheint das ja nicht zu funktionieren. Habe das vorher mit zwei watchdog gelöst die ich jetzt gern mit doif ersetzten will.
cu

Brockmann

Zitat von: inesa394 am 10 Februar 2015, 20:17:30
Nun möchte ich das das doif nachdem es mich erkannt hat eine Zwangspause einlegt so von 10 minuten. 
Schau Dir mal das Attribut cmdpause in der DOIF-Referenz an.

Brockmann

Zitat von: flurin am 10 Februar 2015, 18:14:23
attr DI_Test wait 300:600

Zuerst dachte ich auch, so könnte es funktionieren aber die Logik stimmt nicht.
Zudem ist sowas schwer zu warten: Fehler suchen, erweitern usw.
Du hast Recht, da bin ich mal wieder in die "wait ohne DOELSE"-Falle getappt. Wenn man einfach ein DOELSE (ohne Aktion) ans Ende setzt, sollte es klappen.
Ohne das kann das DOIF seinen Zustand bei Wegfall der Bedingung nicht ändern und der wait-Timer läuft einfach weiter.
Und was Wartbarkeit angeht: Zwei DOIFs, die parallel auf dieselbe Bedingung triggern, finde ich auch nicht übersichtlicher, aber das ist sicher eine Geschmacksfrage.

leuchte1

#1349
Hallo zusammen,
ich steh gerade auf dem Schlauch. Bin am umstellen auf DOIF und will meine Heizkörper (HM-CC-RT-DN) zu einer bestimmten Uhrzeit zzgl. div. Bedingungen zu schalten.

define Heizung_Bad_an DOIF ([06:25] and !$we and ...........) (set Heizkoerper_Bad desired-temp 22)

Der HM-CC-RT-DN läuft nicht im Burstmode, d.h. er frägt nur alle 2-3 min. ab und da ist Bedingung Uhrzeit u.U. längst passé. Den Burstmode will ich zu Gunsten der Batterielebensdauer vermeiden.

Bin für jede Hilfe dankbar.

Gruß
Stefan