Hauptmenü

neues Modul DOIF

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

Vorheriges Thema - Nächstes Thema

Damian

#1020
Zitat von: Spartacus am 02 Januar 2015, 11:02:41
Hi Damian,
ok, (hoffentlich) verstanden! Das heißt, der Trigger vom Kalender steht über der Zeitangabe. Dann erklären sich auch einige andere Phänomene anderer DOIFs.
Es gibt keine Rangordnung beim Triggern. Entweder wird zu einem bestimmten Zeitpunkt getriggert oder eben nicht - es wird aber immer die ganze Bedingung ausgewertet. Zukünftig wird man mehrere unabhängige Bedingungen zu einem Kommando definieren können, dann haben sich hoffentlich die unabsichtlichen Abhängigkeiten erledigt.

Zitat
Jetzt habe ich in der folgenden Anweisung auch noch einen Fehler. Das Licht wurde gestern an Neujahr durch TK und LS eingeschaltet, aber nicht mehr ausgeschaltet. Ist auch klar, da ich das Abschalten in "cmd2"  durch "Neujahr" verhindere. Das ist natürlich Quatsch! Es darf nur während 00:00 und 02:00 an Neujahr verhindert werden.
Muss ich das dann so lösen?
DOELSEIF
([EG.ss.TK.Haustuer:buttons] eq "released" and [EG.ss.LS.Eingang:buttons] eq "released" and
!([00:00-02:00] and [?hl.01.Feiertag] ne "Neujahr") )
   (set EI.ss.SA.Licht off)


Beim Notaus (cmd3) dann identisch, damit auch das während 00:00 und 02:00 verhindert wird, richtig?

Das macht die Sache unnötig kompliziert und noch mehr unüberschaubar.

Ich würde das Intervall [00:00-02:00] trennen und ohne Intervall zum Einschalten mit "[00:00] and [?...Sylvester]" und zum Abschalten mit "[02:00] and [?... Neujahr]" definieren.

Gruß

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

Spartacus

Ich würde das Intervall [00:00-02:00] trennen und ohne Intervall zum Einschalten mit "[00:00] and [...Sylvester]" und zum Abschalten mit "02:00 and [... Neujahr]" definieren.
Hi,
das Einschalten ist mir klar! Das sollte so aussehen:
((([EG.ss.TK.Haustuer:buttons] eq "pressed") or
   [EG.ss.LS.Eingang:buttons] eq "pressed") and [Tageslicht.dum] eq "dunkel" or
   [00:00] and [?hl.01.Feiertag] eq "Silvester")
   (set EI.ss.SA.Licht on)
.....


Aber das Abschalten durch die LS und den TK im DOELSEIF muss ich doch in dem Zeitraum 00:00 bis 02:00 verhindern? Wie soll das ohne Intervall gehen? Das verstehe ich nicht!
Das DOELSEIF (cmd2) hat ein wait von 120sec. als Ausschaltverzögerung. Und dieser Fall darf ja dann nicht eintreten..
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Damian

#1022
Zitat von: Spartacus am 02 Januar 2015, 11:38:31
Ich würde das Intervall [00:00-02:00] trennen und ohne Intervall zum Einschalten mit "[00:00] and [...Sylvester]" und zum Abschalten mit "02:00 and [... Neujahr]" definieren.
Hi,
das Einschalten ist mir klar! Das sollte so aussehen:
((([EG.ss.TK.Haustuer:buttons] eq "pressed") or
   [EG.ss.LS.Eingang:buttons] eq "pressed") and [Tageslicht.dum] eq "dunkel" or
   [00:00] and [?hl.01.Feiertag] eq "Silvester")
   (set EI.ss.SA.Licht on)
.....


Aber das Abschalten durch die LS und den TK im DOELSEIF muss ich doch in dem Zeitraum 00:00 bis 02:00 verhindern? Wie soll das ohne Intervall gehen? Das verstehe ich nicht!
Das DOELSEIF (cmd2) hat ein wait von 120sec. als Ausschaltverzögerung. Und dieser Fall darf ja dann nicht eintreten..
Christian

Ok. Offensichtlich durchschaue ich inzwischen nicht mehr die Intentionen deiner Definition. Die Wait-Definition kenne ich auch nicht. Na ja, du wirst schon besser wissen als ich, was du vorhast. Du kannst den Ausschaltzeitpunkt mit deinen Buttons kombinieren und einfach testen. Ich hoffe, dass dann nicht eine neue Abhängigkeit die Konstruktion wieder zunichte macht.

Das Prinzip des Moduls hast du ja im Wesentlich verstanden.

Gruß

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

Spartacus

#1023
Damian,
ich bin Dir sehr dankbar für Deine Hilfe! Ich versuche jetzt seit fast 2 Monaten dieses ganze Konstrukt ans Fliegen zu kriegen und stolpere immer wieder über neue Probleme. Die ganze Sache ist sehr komplex und ich habe damals, vor 10 Jahren, auch sehr lange getüftelt, bis das mit der CControl mal lief.Der Ansatz mit dem DOIF ist sicherlich korrekt, aber ich komme einfach nicht weiter:

Ich liste hier nochmals alles auf, wäre echt toll, wenn Du Dir das mal ansiehst. Ich verstehe, dass es nicht ganz einfach ist, fremden Code nachzuvollziehen, aber vielleicht ist mein Ansatz auch nicht korrekt und alles ist viel einfacher!

Sensoren/Aktoren:
1. Taster: (später mit Langdruck über Sequence)
2. Lichtschranke: Ruhezustand->buttons:released, betätigt->buttons:pressed
3. Türkontakt: Tür zu->buttons:released, Tür offen-> buttons:pressed
4. Beleuchtung: Aktor
5. Notaus: Dummy

Abhängigkeiten:
- LS oder TK werden betätigt (buttons:pressed) -> Aktor schaltet ein, Ausschaltverzögerung 120s. (Das ist nötig, weil LS und TK nur einen Impuls abgeben ( released-> pressed-> released). Es soll auch nachgetriggert werden, bis die Notabschaltung greift!
- Der Aktor schaltet direkt ab, wenn der Zusatnd "pressed" bei LS oder TK länger als 10min anliegt. Es wird eine Mail verschickt. (Notabschaltung: Tür steht sehr lange auf, LS ist durch Gegenstand blockiert)
Der Aktor darf erst wieder freigegeben werden, wenn LS und TK auf "released" sind. (Tür ist wieder zu und LS nicht mehr blockiert!; das funktioniert noch nicht!)
- Der Aktor schaltet Neujahr von 0:00 Uhr bis 02:00 Uhr unabhängig vom Zusatand der LS und des TK (pressed, released ist egal; das funktioniert nicht korrekt!)
- Der Taster toggelt unabhängig von allen o.a. Bedingungen den Aktor per Klick auf die obere Wippe (Die Funktion läuft bereits mit dem TestCode, allerdings ohne Sequence) Hier ist zu beachten, dass bei eingeschaltetem Aktor, der Klick auf die Wippe diesen direkt (ohne Ausschaltverzögerung) ausschaltet und umgekehrt.

Die Sequece und die Ansteuerung eines TestLampeKurzDruck/TestlampeLangDruck-Dummys habe ich noch nicht in den Testcode einbauen können. Das klappt mit dem Dummy nicht!
siehe auch (http://forum.fhem.de/index.php/topic,23833.msg237801.html#msg237801)

altueller Code:
define di.02.EI.ss.SA.Licht DOIF ((([EG.ss.TK.Haustuer:buttons] eq "pressed") or \
   [EG.ss.LS.Eingang:buttons] eq "pressed") and [Tageslicht.dum] eq "dunkel" or \
   [00:00-02:00] and [?hl.01.Feiertag] eq "Neujahr")\
   (set EI.ss.SA.Licht on)\
DOELSEIF\
([EG.ss.TK.Haustuer:buttons] eq "released" and [EG.ss.LS.Eingang:buttons] eq "released" and [hl.01.Feiertag] ne "Neujahr" )\
   (set EI.ss.SA.Licht off)\
DOELSEIF \
  (([TK.Notaus.dum] eq "on" or [LS.Notaus.dum] eq "on") and [hl.01.Feiertag] ne "Neujahr")\

attr di.02.EI.ss.SA.Licht alias autom. Eingangslicht
attr di.02.EI.ss.SA.Licht cmdState on|off|off
attr di.02.EI.ss.SA.Licht devStateIcon .*on:light_light_dim_100@lightgreen .*off:light_light_dim_00@red
attr di.02.EI.ss.SA.Licht disable 0
attr di.02.EI.ss.SA.Licht initialize cmd_2
attr di.02.EI.ss.SA.Licht room 05-Eingang
attr di.02.EI.ss.SA.Licht wait 0:120:0:0
#
#
# Email senden, wenn Tür länger als 10min auf steht
#
define di.03.EI.ss.SA.Licht DOIF ([EG.ss.TK.Haustuer:buttons] eq "pressed") ({eMail('name@domain.de','Warnung','Haustür steht offen')}, \
set EI.ss.SA.Licht off, set TK.Notaus.dum on)\

attr di.03.EI.ss.SA.Licht alias Warnung Eingang
attr di.03.EI.ss.SA.Licht cmdState Notaus|Leerlauf
attr di.03.EI.ss.SA.Licht room 05-Eingang
attr di.03.EI.ss.SA.Licht wait 600
#
# Email senden, wenn Lichtschranke länger als 10min blockiert ist
#
define di.04.EI.ss.SA.Licht DOIF ([EG.ss.LS.Eingang:buttons] eq "pressed") ({eMail('name@domain.de','WARNUNG! Lichtschranke bockiert!')}, \
set EI.ss.SA.Licht off, set LS.Notaus.dum on)\

attr di.04.EI.ss.SA.Licht alias Warnung Lichtschranke
attr di.04.EI.ss.SA.Licht cmdState Notaus|Leerlauf
attr di.04.EI.ss.SA.Licht room 05-Eingang
attr di.04.EI.ss.SA.Licht wait 600


TestCode:

define diEingangsLicht DOIF (([EG.ss.TK.Haustuer:buttons] eq "pressed" or [EG.ss.LS.Eingang:buttons] eq "pressed") and [?Aktor] eq "off") \
(set Aktor on)\
DOELSEIF ([PTM210.Gira.01:state] eq "A0" and [Aktor] eq "off") \
(set Aktor on)\
DOELSEIF ([EG.ss.TK.Haustuer:buttons] eq "released" and [EG.ss.LS.Eingang:buttons] eq "released" and [Aktor] eq "on" and [diEingangsLicht] eq "sensor_on") \
(set Aktor off)\
DOELSEIF ([PTM210.Gira.01:state] eq "A0" and [Aktor] eq "on")\
(set Aktor off)
attr diEingangsLicht cmdState sensor_on|manual_on|sensor_off|manual_off
attr diEingangsLicht disable 0
attr diEingangsLicht room 99-Test
attr diEingangsLicht wait 0:0:10:0
#
# Squence Test
#
define sKurzerLangerDruck_UR sequence PTM210.Gira.01:BI 0.5 PTM210.Gira.01:buttons:.released
attr sKurzerLangerDruck_UR disable 0
attr sKurzerLangerDruck_UR room 99-Test
attr sKurzerLangerDruck_UR triggerPartial 1
#
# Kurzer Druck
#
define nKurzerDruck_UR notify sKurzerLangerDruck_UR:trigger set TestLampeKurzDruck on
attr nKurzerDruck_UR disable 0
attr nKurzerDruck_UR room 99-Test
#
# Langer Druck
#
define nLangerDruck_UR notify sKurzerLangerDruck_UR:partial_1 set TestLampeLangDruck on
attr nLangerDruck_UR disable 0
attr nLangerDruck_UR room 99-Test


Ich hoffe, ich konnte es jetzt verständlich und vollständig darstellen.
Ganz lieben Dank und Gruß,
Christian.

NACHTRAG:
Das mit der Sequence und dem "LangDruck" könnte man so lösen, das ist allerdings nicht sehr elegant, da bei "Dauerdruck" auf die Wippe, der Aktor im Sekundentakt toggelt. Über die Sequence wird das "LangDruck-Dummy"-Device auf "on" gesetzt und zusätzlich mit dem State des Tasters "und" -verknüpft. Der State des Tasters ändert sich beim Druck auf die Wippe von "released" nach "BI" und wieder zurück nach "BI" Der Trigger liegt auf dem Dummy.

# Dummy für Gira Taster, Langdruck
define LangDruck dummy
attr LangDruck room 99-Test
#
#
define diEingangsLicht DOIF (([EG.ss.TK.Haustuer:buttons] eq "pressed" or [EG.ss.LS.Eingang:buttons] eq "pressed") and [?Aktor] eq "off") \
(set Aktor on)\
DOELSEIF ([?PTM210.Gira.01] eq "BI" and [LangDruck] eq "on" and [Aktor] eq "off") \
(set Aktor on)\
DOELSEIF ([EG.ss.TK.Haustuer:buttons] eq "released" and [EG.ss.LS.Eingang:buttons] eq "released" and [Aktor] eq "on" and [diEingangsLicht] eq "sensor_on") \
(set Aktor off)\
DOELSEIF ([?PTM210.Gira.01] eq "BI" and [LangDruck] eq "on" and [Aktor] eq "on")\
(set Aktor off)
attr diEingangsLicht cmdState sensor_on|manual_on|sensor_off|manual_off
attr diEingangsLicht disable 0
attr diEingangsLicht room 99-Test
attr diEingangsLicht wait 0:0:10:0
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Rammlet

Hallo zusammen
Ich versuche seit mittlerweile 3 Tage mein neues Flur licht in den Griff zu bekommen leider nur mit geringen erfolg.

Früher habe ich die LED Streifen direct mit Relais angesteuert. Habe jetzt ein RGB WiFi Modul verbaut hatte mir erhofft das die Steuerung der einzelnen Farben jetzt einfacher und schöner wird.
Ich habe 2 Bewegungsmelder und einen Schalter.
Die Bewegungsmelder sollen Das Modul ansteuern und für 60sek eine Farbe ausgeben. Über den Schalter soll für 2min Weiß eingeschaltet werden.
Ich bekomme es bin das die Bewegungsmelder das Licht einschalten und es nach 1min aus geht.
Habe dann das gleiche für den schalter aufgebaut bei Kurzem Tasten druck geht das Licht an und dann auch wieder aus.

So das jetzt bei eingeschalten Weißem Licht die Bewegungsmelder das Licht wieder Bund machen habe ich eine Verriegelung eingebaut.

So und Jetzt geht einfach gar nichts mehr weder Weiß noch Bund auch ohne die Verriegelung Laufen Beide DOIF´s nicht zusammen.

Daher bitte ich einmal um Unterstützung (bevor ich von meiner Frau erschlagen werde)

define RGB_Floor_Mo_d dummy
attr RGB_Floor_Mo_d devStateIcon off:li_wht_off on:li_wht_on
attr RGB_Floor_Mo_d eventMap off on
attr RGB_Floor_Mo_d room Test
attr RGB_Floor_Mo_d webCmd off:on

#
define di_RGB_Floor_Mo_Schalter DOIF ([MD_FloorS] eq "motion" or [MD_FloorB] eq "motion") (set RGB_Floor_Mo_d on, set RGB_Floor_Mo_d off)
attr di_RGB_Floor_Mo_Schalter do always
attr di_RGB_Floor_Mo_Schalter room Test
##
define di_RGB_Floor_Mo_Licht DOIF ([RGB_Floor_Mo_d] eq "on" and ([d_RGB_Floor_WhiteB] eq "of")  (set AKT_RGB_Floor1 RGB 0000FF) DOELSE  (set AKT_RGB_Floor1 RGB 000000)
attr di_RGB_Floor_Mo_Licht room Test
attr di_RGB_Floor_Mo_Licht wait 0:60
####
#Dummy für die Steuerrung
define d_Light_RGB_Floor dummy
attr d_Light_RGB_Floor devStateIcon off:li_wht_off RGB:toggle White:li_wht_on WhiteTime:on-for-timer
define d_RGB_Floor_White dummy
attr d_RGB_Floor_White devStateIcon off:li_wht_off on:li_wht_on
attr d_RGB_Floor_White eventMap off on
attr d_RGB_Floor_White room Test
attr d_RGB_Floor_White webCmd off:on
#
define di_RGB_Floor_White_Schalter DOIF ([SEN_SWI_Kitchen1_FloorLightWhite] eq "Short") (set d_RGB_Floor_White on, set d_RGB_Floor_White off, set d_RGB_Floor_WhiteB on)
attr di_RGB_Floor_White_Schalter room Test
#
define d_RGB_Floor_WhiteB dummy
attr d_RGB_Floor_WhiteB devStateIcon off:li_wht_off on:li_wht_on
attr d_RGB_Floor_WhiteB eventMap off on
attr d_RGB_Floor_WhiteB room Test
attr d_RGB_Floor_WhiteB webCmd off:on
#
define di_RGB_Floor_White_Licht DOIF ([d_RGB_Floor_White] eq "on")  (set AKT_RGB_LivingRoom_Deko2 FFFFFF) DOELSE  (set AKT_RGB_Floor1 RGB 000000, set d_RGB_Floor_WhiteB off)
attr di_RGB_Floor_White_Licht room Test
attr di_RGB_Floor_White_Licht wait 0:120



Sidey

Hallo maxritti,

Zitat von: maxritti am 01 Januar 2015, 23:13:56
Hi,

ich verstehe jetzt nicht ganz, auf was Du raus willst?
Klappt das nicht mit dem DOIF, welches auf die Änderung in Deinem Zeitdummy reagiert und die DEF des anderen DOIFs ändert?

Doch da das DOIF ja über modify aktualisiert wird, klappt es so. Die Zeit wird aktualisiert, da das 2. DOIF die Definition aktualisiert.  ;D

Nachdem ich verstanden habe, was das 2. DOIF macht (das aktualisieren des Inhaltes des internen Wertes DEF), habe ich nur überlegt, ob man das nicht auch ohne ein DOIF machen kann, quasi direkt aus dem dummy heraus.
Es muss ja gehen, da es das DOIF Modul auch irgendwie schafft. Ich bin halt nur an der syntax verzweifelt.. :-[


Ich habe aber noch eine andere Frage:

Ich prüfe eine Bedingung, welche nur ausgeführt werden soll, wenn das Ereignis 2x hintereinander aufgetreten ist. Das Warten habe ich auf 5 Minuten erst mal gestellt:
waitsame 300:0

Ich habe eine DOELSIF Bedingung die identisch zur 1. DOIF Bedingung ist. Nur ohne waitsame

Hier die 1. Bedingung, welche ausgeführt werden soll, wenn die Bedingungen innerhalb von 5 Minuten 2. erfüllt sind.

([wk.PwrSw_Switch] eq "on" && [wk.PwrSw_Power:power] >= 5 && [wk.WaschmaschineWartemodus] eq "on") (set wk.WaschmaschineWartemodus off)   


Und hier die 2. Bedingung, welche ausgeführt wird, wenn die 1. Bedingung noch nicht zutrifft.
DOELSEIF ([wk.PwrSw_Switch] eq "on" && [wk.PwrSw_Power:power] >= 5 && [wk.WaschmaschineWartemodus] eq "on") (set wk.PwrSw_Switch off) 


Was ich nun beobachtet habe ist, dass die 2. Bedingung eigentlich nie ausgeführt wird.
Ist es so, dass die Prüfung weiterer Bedingungen Abgebrochen wird, wenn die 1. Bedingung erfüllt ist, egal ob nun waitsame aktiv ist oder nicht?


Mit diese Abfragen wollte ich nur eines erreichen.
Schalte ich die Waschmaschine einmal ein, dann soll die Spannung unterbrochen werden und auf den Timer gewartet werden.

Schalte ich dann aber manuell wieder ein (Abstand von max 5 min zum 1. Einschalten), dann soll die Maschine ihr Programm abspulen.

Ich könnte mir das natürlich auch über einen dummy merken. Dachte nur, es würde vielleicht ohne klappen.



Grüße Sidey
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

satprofi

Hallo Damian.
Ich verzweifle an 2 DOIF, wobei eines wunderbar klappt, das zweite aber nur bedingt.

Ziel ist , eine Led zu steuern die mir den Status des Wechselrichters anzeigt, aber nur zw. bestimmter Zeit.
Das erste klappt

([Batterielader_aus] eq "on" and [08:01-22:00]) (set LED_15 led red)
DOELSEIF ([Batterielader_aus] eq "off" and [08:01-22:00]) ( set LED_15 led green)
DOELSE (set LED_15 led off)


dieses aber nicht,nur bei statusänderung. warum es nicht die led zündet verstehe ich nicht

([Netz_Schuetz_aus] eq "on" and [08:01-22:00]) (set LED_14 led red)
DOELSEIF ([Netz_Schuetz_aus] eq "off" and [08:01-22:00]) (set LED_14 led green)
DOELSE (set LED_14 led off)


state von Netz_Schuetz_aus ist "off"

wo ist der fehler?

lg.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Damian

Zitat von: Sidey am 02 Januar 2015, 23:15:45

Was ich nun beobachtet habe ist, dass die 2. Bedingung eigentlich nie ausgeführt wird.
Ist es so, dass die Prüfung weiterer Bedingungen Abgebrochen wird, wenn die 1. Bedingung erfüllt ist, egal ob nun waitsame aktiv ist oder nicht?


Mit diese Abfragen wollte ich nur eines erreichen.
Schalte ich die Waschmaschine einmal ein, dann soll die Spannung unterbrochen werden und auf den Timer gewartet werden.

Schalte ich dann aber manuell wieder ein (Abstand von max 5 min zum 1. Einschalten), dann soll die Maschine ihr Programm abspulen.

Ich könnte mir das natürlich auch über einen dummy merken. Dachte nur, es würde vielleicht ohne klappen.

Zwei mal die gleiche Bedingung innerhalb eines DOIF macht keinen Sinn, da die zweite Bedingung nie zum tragen kommt.

Mir ist auch schon aufgefallen, dass das Gegenteil von waitsame noch fehlt.

Das wird zukünftig mit einem weiteren Attribut möglich sein.

Gruß

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

Damian

Zitat von: satprofi am 03 Januar 2015, 09:55:06
Hallo Damian.
Ich verzweifle an 2 DOIF, wobei eines wunderbar klappt, das zweite aber nur bedingt.

Ziel ist , eine Led zu steuern die mir den Status des Wechselrichters anzeigt, aber nur zw. bestimmter Zeit.
Das erste klappt

([Batterielader_aus] eq "on" and [08:01-22:00]) (set LED_15 led red)
DOELSEIF ([Batterielader_aus] eq "off" and [08:01-22:00]) ( set LED_15 led green)
DOELSE (set LED_15 led off)


dieses aber nicht,nur bei statusänderung. warum es nicht die led zündet verstehe ich nicht

([Netz_Schuetz_aus] eq "on" and [08:01-22:00]) (set LED_14 led red)
DOELSEIF ([Netz_Schuetz_aus] eq "off" and [08:01-22:00]) (set LED_14 led green)
DOELSE (set LED_14 led off)


state von Netz_Schuetz_aus ist "off"

wo ist der fehler?

lg.

Das werde ich dir auch nicht beantworten können. Da beide DOIF´s gleich aufgebaut sind, hängt es sicherlich mit den Aktoren bzw. Sensoren zusammen.

Gruß

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

Damian

Zitat von: Spartacus am 02 Januar 2015, 13:23:14
Damian,
ich bin Dir sehr dankbar für Deine Hilfe! Ich versuche jetzt seit fast 2 Monaten dieses ganze Konstrukt ans Fliegen zu kriegen und stolpere immer wieder über neue Probleme. Die ganze Sache ist sehr komplex und ich habe damals, vor 10 Jahren, auch sehr lange getüftelt, bis das mit der CControl mal lief.Der Ansatz mit dem DOIF ist sicherlich korrekt, aber ich komme einfach nicht weiter:

Ich liste hier nochmals alles auf, wäre echt toll, wenn Du Dir das mal ansiehst. Ich verstehe, dass es nicht ganz einfach ist, fremden Code nachzuvollziehen, aber vielleicht ist mein Ansatz auch nicht korrekt und alles ist viel einfacher!

Sensoren/Aktoren:
1. Taster: (später mit Langdruck über Sequence)
2. Lichtschranke: Ruhezustand->buttons:released, betätigt->buttons:pressed
3. Türkontakt: Tür zu->buttons:released, Tür offen-> buttons:pressed
4. Beleuchtung: Aktor
5. Notaus: Dummy

Abhängigkeiten:
- LS oder TK werden betätigt (buttons:pressed) -> Aktor schaltet ein, Ausschaltverzögerung 120s. (Das ist nötig, weil LS und TK nur einen Impuls abgeben ( released-> pressed-> released). Es soll auch nachgetriggert werden, bis die Notabschaltung greift!
- Der Aktor schaltet direkt ab, wenn der Zusatnd "pressed" bei LS oder TK länger als 10min anliegt. Es wird eine Mail verschickt. (Notabschaltung: Tür steht sehr lange auf, LS ist durch Gegenstand blockiert)
Der Aktor darf erst wieder freigegeben werden, wenn LS und TK auf "released" sind. (Tür ist wieder zu und LS nicht mehr blockiert!; das funktioniert noch nicht!)
- Der Aktor schaltet Neujahr von 0:00 Uhr bis 02:00 Uhr unabhängig vom Zusatand der LS und des TK (pressed, released ist egal; das funktioniert nicht korrekt!)
- Der Taster toggelt unabhängig von allen o.a. Bedingungen den Aktor per Klick auf die obere Wippe (Die Funktion läuft bereits mit dem TestCode, allerdings ohne Sequence) Hier ist zu beachten, dass bei eingeschaltetem Aktor, der Klick auf die Wippe diesen direkt (ohne Ausschaltverzögerung) ausschaltet und umgekehrt.

Die Sequece und die Ansteuerung eines TestLampeKurzDruck/TestlampeLangDruck-Dummys habe ich noch nicht in den Testcode einbauen können. Das klappt mit dem Dummy nicht!
siehe auch (http://forum.fhem.de/index.php/topic,23833.msg237801.html#msg237801)


Leider habe ich nicht die Zeit mich in komplexere Probleme der User einzuarbeiten. Vielleicht gibt es hier andere DOIF-User, die etwas mehr Zeit haben und dir helfen können.

Gruß

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

Spartacus

Zitat von: Damian am 03 Januar 2015, 10:09:36
Leider habe ich nicht die Zeit mich in komplexere Probleme der User einzuarbeiten. Vielleicht gibt es hier andere DOIF-User, die etwas mehr Zeit haben und dir helfen können.

Gruß

Damian
Hi Damian,
das verstehe ich natürlich und hoffe, dass mir jemand weiterhelfen kann...

Ich habe gestern noch lange gebastelt und bin auch ein Stück weiter. Es fehlen zur vollständigen Funktion noch die "Notabschaltung". Das Sequence-Problem, welches ich gestern im Nachtrag beschrieben hatte, ist auch noch nicht gelöst, aber das war es dann m.E. auch. So komplex ist es dann doch nicht geworden, aber erste Tests mit fiktiven Daten (Silvester1 und Neujahr1) haben ganz gut geklappt.

Vielleicht weiß ja jemand, wie ich die beschriebene Notabschaltung hier noch einbauen kann...Damin meinte damals (Oktober) man könne das mit den künftigen Funktionen des DOIFs recht einfach lösen, bin aber noch nicht drauf gekommen...("rp.02.EG.ku.SD.Kochinsel" ist in diesem Fall der Aktor)

define diEingangsLicht DOIF (([EG.ss.TK.Haustuer:buttons] eq "pressed" or [EG.ss.LS.Eingang:buttons] eq "pressed") and [?rp.02.EG.ku.SD.Kochinsel] eq "off") \
   (set rp.02.EG.ku.SD.Kochinsel on)\
DOELSEIF ([?PTM210.Gira.01] eq "BI" and [LangDruck] eq "on" and [rp.02.EG.ku.SD.Kochinsel] eq "off") \
(set rp.02.EG.ku.SD.Kochinsel on)\
DOELSEIF ([17:03] and [?hl.01.Feiertag] eq "Silvester1")\
         (set rp.02.EG.ku.SD.Kochinsel on)\
DOELSEIF ([EG.ss.TK.Haustuer:buttons] eq "released" and [EG.ss.LS.Eingang:buttons] eq "released" and \
          [rp.02.EG.ku.SD.Kochinsel] eq "on" and [diEingangsLicht] eq "sensor_on") \
(set rp.02.EG.ku.SD.Kochinsel off)\
DOELSEIF ([?PTM210.Gira.01] eq "BI" and [LangDruck] eq "on" and [rp.02.EG.ku.SD.Kochinsel] eq "on")\
(set rp.02.EG.ku.SD.Kochinsel off)\
DOELSEIF ([17:10] and [?hl.01.Feiertag] eq "Silvester1")\
         (set rp.02.EG.ku.SD.Kochinsel off)
attr diEingangsLicht cmdState sensor_on|manual_on|Silvester_on|sensor_off|manual_off|Silvester_off
attr diEingangsLicht disable 0
attr diEingangsLicht room 99-Test
attr diEingangsLicht wait 0:0:0:120:0


Vielen Dank,
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Sany

@satprofi

Zitatdieses aber nicht,nur bei statusänderung. warum es nicht die led zündet verstehe ich nicht
Code: [Auswählen]

([Netz_Schuetz_aus] eq "on" and [08:01-22:00]) (set LED_14 led red)
DOELSEIF ([Netz_Schuetz_aus] eq "off" and [08:01-22:00]) (set LED_14 led green)
DOELSE (set LED_14 led off)


state von Netz_Schuetz_aus ist "off"

Hallo Satprofi,

dein 2tes DOIF ist bestimmt in Ordnung, nur ist nicht klar, was dort überhaupt ankommt. Rufe den Eventmonitor auf oder per telnet ein "inform timer" und sorge dafür, dass die Quelle(n) mal ihre Meldungen absetzen ([Netz_Schuetz_aus]). Und wenn Du den wortlaut genau kennst sollte das DOIF anzupassen sein.
Vielleicht schreibt [Netz_Schuetz_aus] ja auch ein logfile, dann kannst Du da auch nachlesen.

Und dann mußt Du diesen Satz nochmal erklären: dieses aber nicht,nur bei statusänderung. warum es nicht die led zündet verstehe ich nicht
Ich würde fast verstehen wollen, dass das DOIF genau das macht, was es soll.
So wie ich das gesamte DOIF verstanden habe muss sich nach dem modify DEF irgendeine der Bedingungen erfüllt werden, um das DOIF von initialized in einen cmd_x Zustand zu versetzen. Es ist nicht so, dass das DOIF von sich aus die Bedingungen durchgeht und bei Erfüllung dann die Ausführung vornimmt. In deinem Beispiel, wenn es zwicheen 8:01 und 22:00 ist, müßte als einmal der Netz_Schuetz_aus seinen Zustand ändern, damit das DOIF in einen cmd_x Zustand kommt und entsprechend schaltet.

Probier das mal und berichte.

Gruß
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Michi240281

Hallo Damian,

ich nutze das Modul zur Belueftung meiner Garage:

define Garagenbelueftung_feucht DOIF ([Temperatur_Garage:humidity] > 70 and [Temperatur_Garage:temperature] > 5 and [MyWeather:temperature] > 5 and [Abwesend:state] eq "nein" and [12:00-20:00] and ([MyWeather:humidity] +10 < [Temperatur_Garage:humidity])) (set Garage_Schalten Lueften, define Garage_wieder_Schliessen_2 at +00:15:00 set Garage_Schalten Schliessen)

Dazu habe ich 2 Fragen, bei denen du mir hoffentlich helfen kannst:

1. wird der Codeteil  ([MyWeather:humidity] +10 < [Temperatur_Garage:humidity]) so funktionieren? Ich will damit erreichen, dass die Bedingung nur erfüllt ist, wenn die Luftfeuchtigkeit draußen mindestens 10% geringer ist als in der Garage.

2. Damit es nicht zu einer Dauerschleife kommt (Garage lüftet für 15 Minuten und dann stellt das Modul fest, dass die Luftfeuchtigkeit immer noch zu hoch ist und belüftet erneut), würde ich die Funktion für x Minuten deaktivieren. Würde das über das disable Attribut funktionieren? Und wenn ja, wie stellt man dann ein Zeitintervall ein?
FHEM auf QNAP per VM / HM LAN Adapter / diverse HM-Devices
QNAP TVS 463
VU+ Duo4kSE
Sony 75ZD9

Damian

Neue Features morgen per Update

Auszug aus der neuen Commandref:

Löschen des Waittimers nach einer Wiederholung einer Bedingung

Das Gegenstück zum repeatsame-Attribut ist das Attribut waitdel. Die Syntax mit Sekundenangaben pro Kommando entspricht der, des wait-Attributs. Im Gegensatz zum wait-Attribut, wird ein laufender Timer gelöscht, falls eine Bedingung wiederholt wahr wird. Sekundenangaben können pro Kommando ausgelassen oder auf Null gesetzt werden.

Anwendungsbeispiel: Rollladen soll herunter, wenn ein Taster innerhalb von zwei Sekunden nicht wiederholt wird

define di_shuttersdown DOIF ([Button])(set shutters down)
attr di_shuttersdown waitdel 2
attr di_shuttersdown do always

"di_shuttersdown" kann nicht mit dem vorherigen Anwendungsbeispiel "di_shuttersup" innerhalb eines DOIF-Moduls kombiniert werden, da in beiden Fällen die gleiche Bedingung vorkommt.

Die Attribute wait und waitdel lassen sich für verschiedene Kommandos kombinieren. Falls das Attribut für ein Kommando nicht gesetzt werden soll, kann die entsprechende Sekundenzahl ausgelassen oder eine Null angegeben werden.

Beispiel: Für cmd_1 soll wait gelten, für cmd_2 waitdel

attr di_cmd wait 2:0
attr di_cmd waitdel 0:2



Ereignissteuerung über Ereignisse (Events)

Syntax: [<devicename>:?<regexp>]

Eine Alternative zur Auswertung von Stati oder Readings ist das einfache Auswerten von Ereignissen mit Hilfe von regulären Ausdrücken, wie beim notify. Eingeleitet wird die Angabe eines regulären Ausdrucks durch ein Fragezeichen

Anwendungsbeispiel: wie oben, jedoch wird hier nur das Ereignis (welches im Eventmonitor erscheint) ausgewertet und nicht der Status von "remotecontrol" wie im vorherigen Beispiel

define di_garage DOIF ([remotecontrol:?on]) (set garage on) DOELSEIF ([remotecontrol] eq "off") (set garage off)

In diesem Beispiel wird nach dem Vorkommen von "on" innerhalb des Events gesucht. Falls "on" gefunden wird, wird der Ausdruck wahr und der DOIF-Fall wird ausgeführt, ansonsten wird der DOELSEIF-Fall ausgeführt. Die Auswertung von reinen Ereignissen bietet sich dann an, wenn ein Modul keinen Status oder Readings benutzen, die man abfragen kann, wie z. B. beim Modul "sequence". Die Angabe von regulären Ausdrücken kann recht komplex werden und würde die Aufzählung aller Möglichkeiten an dieser Stelle den Rahmen sprengen. Weitere Informationenen zu regulären Ausdrücken sollten in der Perl-Dokumentation nachgeschlagen werden.


Gruß

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

satprofi

Zitat von: Sany am 03 Januar 2015, 12:47:02
@satprofi

Hallo Satprofi,


So wie ich das gesamte DOIF verstanden habe muss sich nach dem modify DEF irgendeine der Bedingungen erfüllt werden, um das DOIF von initialized in einen cmd_x Zustand zu versetzen. Es ist nicht so, dass das DOIF von sich aus die Bedingungen durchgeht und bei Erfüllung dann die Ausführung vornimmt. In deinem Beispiel, wenn es zwicheen 8:01 und 22:00 ist, müßte als einmal der Netz_Schuetz_aus seinen Zustand ändern, damit das DOIF in einen cmd_x Zustand kommt und entsprechend schaltet.

Probier das mal und berichte.

Gruß

Hallo.
ja, so ist es. Bei statusänderung schaltet ja DOIF, aber warum nicht jetzt?
Um 08:01 wird abgefragt was die Sensoren machen, sehe ich ja in den readings. Vor 08:01 ist die led finster, danach sollte es aber eingeschaltet werden, weil ja um 08:01 der Netzschütz_aus "off" ist. aber er schaltet nicht, sondern meldet "cmd3". Warum? do always ist auch definiert.
Andere Leds klappen ja auch richtig.

([Heizungsmode] eq "auto" and [08:00-22:00]) (set LED_09 led green) DOELSE (set LED_09 led off)
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram