Hauptmenü

DOIF Schaltproblem

Begonnen von Spartacus, 13 Juni 2017, 12:16:18

Vorheriges Thema - Nächstes Thema

Spartacus

Hallo,
ich habe ein relativ einfaches und gut funktionierendes DOIF um die Funktion:

([23:00] and [?GA.ss.SA.Licht] eq "off")....
erweitert. Das ganze Modul sieht nun so aus:
defmod di.01.EG.wz.RO DOIF ((([23:00] and [?GA.ss.SA.Licht] eq "off") or \
  ([GA.ss.SA.Licht] eq "off" and [?help.Tageslicht.dum] eq "dunkel")) and [?switch.di.02.EG.wz.RO.dum] eq "on")\
(set EG.wz.RO.* closes)\
DOELSEIF\
([switch.di.02.EG.wz.RO.dum] eq "off")\
DOELSE
attr di.01.EG.wz.RO alias autom. Rolladen schließen
attr di.01.EG.wz.RO cmdState on|deaktiv|on
attr di.01.EG.wz.RO devStateIcon .*on:general_an@lightgreen .*off:general_aus@red .*deaktiv:general_aus@grey
attr di.01.EG.wz.RO disable 0
attr di.01.EG.wz.RO do resetwait
attr di.01.EG.wz.RO group Scripte
attr di.01.EG.wz.RO icon fts_shutter_down
attr di.01.EG.wz.RO room 01-Wohnzimmer
attr di.01.EG.wz.RO wait 120:0:0

setstate di.01.EG.wz.RO on
setstate di.01.EG.wz.RO 2017-06-10 23:00:00 Device GA.ss.SA.Licht
setstate di.01.EG.wz.RO 2017-06-10 23:02:01 cmd 1
setstate di.01.EG.wz.RO 2017-06-10 23:02:01 cmd_event GA.ss.SA.Licht
setstate di.01.EG.wz.RO 2017-06-10 23:02:01 cmd_nr 1
setstate di.01.EG.wz.RO 2017-06-10 23:00:00 e_GA.ss.SA.Licht_STATE off
setstate di.01.EG.wz.RO 2017-06-07 15:36:57 e_switch.di.02.EG.wz.RO.dum_STATE on
setstate di.01.EG.wz.RO 2017-06-10 23:02:01 state on
setstate di.01.EG.wz.RO 2017-06-12 23:00:00 timer_01_c01 13.06.2017 23:00:00
setstate di.01.EG.wz.RO 2017-06-10 23:02:00 wait_timer no timer


Hintergrund ist, dass in den Sommermonaten "GA.ss.SA.Licht" niemals den Zustand "on" annimmt und somit der Shutdown der Rollanden beim Zustandswechsel auf "off" nicht getriggert wird. Daher die Erweiterung im Falle, dass GA.ss.SA.Licht "off" bleibt.

Leider klappt das aber nicht und ich finde den Fehler nicht. Mein Test mit einer "Testzeit" (12:40) funktionierte einwandfrei. Aber gestern um 23:00 passierte nichts. Hat jemand eine Idee, wo ich hier nach dem Fehler suchen kann? Ich kann ihn nicht eingrenzen.
Christian
Allerdings triggert es nicht um 23:00
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

Otto123

Hi,

das Ganze wird nicht mehr Zeit getriggert:
([23:00] and [?GA.ss.SA.Licht] eq "off") wird nach Deiner Aussage nicht wahr, damit wird der erste Klammer Ausdruck nur wahr wenn
([GA.ss.SA.Licht] eq "off" and [?help.Tageslicht.dum] eq "dunkel") wahr wird.
nur dann und nur wenn auch noch dies wahr wird
[?switch.di.02.EG.wz.RO.dum] eq "on")
Wird das DOIF getriggert.

Das DOELSEIF  hat keinen Ausführungsteil - das ist sinnlos.
Der DOELSE Zweig ist leer, das ist meines Erachtens auch sinnlos.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Spartacus

Hi Otto,
danke für Deine Antwort, aber das kann nicht sein:

Ausdruck 1 (zeitgesteuert, nur wenn Licht = "off" ist)
([23:00] and [?GA.ss.SA.Licht] eq "off")
Ausdruck 2 (triggert wenn Licht von "on" auf "off" wechselt und es "dunkel" ist"):
([GA.ss.SA.Licht] eq "off" and [?help.Tageslicht.dum] eq "dunkel")
Ausdruck 3 (Schalter muss auf "on" stehen):
[?switch.di.02.EG.wz.RO.dum] eq "on")

Somit:
(Ausdruck 1 or Ausdruck 2) and Ausdruck 3

Das sollte eigentlich passen. Passt aber nicht! Der zeitlicher Trigger wird nicht ausgelößt, Ausdruck 2 funktioniert tadellos.

Weiterhin:
Das DOELSEIF wird nur benutzt um den Automatikschalter "switch.di.02.EG.wz.RO.dum" zu triggern. Wenn ich diesen Softkey betätige,  kann ich "Audruck 1" ein bzw. ausschalten.
über DOELSE erzwinge ich nur den Modul-Status "on" bei eingeschaltetem  Automatikschalter.

Aber warum funktioniert meine Zeitsteuerung nicht. M.E. ist die Klammerung der Ausdrücke oben korrekt.

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

Per

Zitat von: Otto123 am 13 Juni 2017, 12:53:47Das DOELSEIF  hat keinen Ausführungsteil - das ist sinnlos.
Der DOELSE Zweig ist leer, das ist meines Erachtens auch sinnlos.
Passt schon:
Zitat von: Spartacus am 13 Juni 2017, 12:16:18
attr di.01.EG.wz.RO cmdState on|deaktiv|on
attr di.01.EG.wz.RO devStateIcon .*on:general_an@lightgreen .*off:general_aus@red .*deaktiv:general_aus@grey

@Spartacus: trenn doch DOIF (a or b) and c zum testen in DOIF (a and c) DOELSEIF (b and c) und lass beim ersten Teil auch das wait (0:120:0:0) weg.

Spartacus

Hallo Per,
danke für die Antwort.
Du meinst dann quasi so:
defmod di.01.EG.wz.RO DOIF
([23:00] and [?GA.ss.SA.Licht] eq "off" and [?switch.di.02.EG.wz.RO.dum] eq "on") \
(set EG.wz.RO.* closes)\
DOELSEIF \
([GA.ss.SA.Licht] eq "off" and [?help.Tageslicht.dum] eq "dunkel" and [?switch.di.02.EG.wz.RO.dum] eq "on")\
(set EG.wz.RO.* closes)\
DOELSEIF\
([switch.di.02.EG.wz.RO.dum] eq "off")\
DOELSE
attr di.01.EG.wz.RO alias autom. Rolladen schließen
attr di.01.EG.wz.RO cmdState on|on|deaktiv|on
attr di.01.EG.wz.RO devStateIcon .*on:general_an@lightgreen .*on:general_an@lightgreen .*off:general_aus@red .*deaktiv:general_aus@grey
attr di.01.EG.wz.RO disable 0
attr di.01.EG.wz.RO do resetwait
attr di.01.EG.wz.RO group Scripte
attr di.01.EG.wz.RO icon fts_shutter_down
attr di.01.EG.wz.RO room 01-Wohnzimmer
attr di.01.EG.wz.RO wait 0:120:0:0

setstate di.01.EG.wz.RO initialized
setstate di.01.EG.wz.RO 2017-06-13 15:05:37 cmd 0
setstate di.01.EG.wz.RO 2017-06-13 15:05:37 state initialized
setstate di.01.EG.wz.RO 2017-06-13 15:05:38 timer_01_c01 13.06.2017 23:00:00


Ich hatte auch schon das Gefühl, dass die Zeitverzögerung in Verbindung mit "do resetwait" etwas damit zu tun hat. Allerdings wollte ich vermeiden, dass ich zwei Mal den Ausführungsteil
(set EG.wz.RO.* closes)
in einem DOIF habe. Ich dachte immer, das wäre nicht sauber!

Aber schauen wir mal, was heute um 23:00 passiert.
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

amenomade

#5
So wie du es jetzt geschrieben hast, bedeutet es :
- Um 23:00, prüf mal, ob Licht off ist und ob RO.dum ist on. Wenn dann, warte 120 sec und  close.
- Ansonsten, wenn Licht off wird, prüf ob Tageslich dunkel und RO.dum on. Wenn dann, close sofort

do resetwait hat m.A., deine Bedingungen angenommen, wenig Sinn: wenn es innerhalb der 120 sekunden entweder wieder 23:00 Uhr wird, warte wieder 120 sec, und wenn innerhalb der 120 sec Licht off wird, prüf ob Tageslicht dunkel und RO.dum on und wenn dann close.

Das Wait könnte sich man sparen... wofür ist es gedacht?

Das ganze sieht komisch aus. Bin mir nicht sicher, dass es ist, was du willst. Was Du willst ist: (wenn Licht off wird, und es ist dann dunkel), aber (spätestens um 23:00 Uhr, wenn Light off ist,) close. Oder?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Per

Zitat von: Spartacus am 13 Juni 2017, 15:12:02Du meinst dann quasi so:
Ja, aber:
Zitat von: Spartacus am 13 Juni 2017, 15:12:02
attr di.01.EG.wz.RO cmdState on|on|deaktiv|on
...
devStateIcon .*on:general_an@lightgreen .*on:general_an@lightgreen .*off:general_aus@red .*deaktiv:general_aus@grey
ein Off-Symbol, aber kein Off-Status?

Zitat von: Spartacus am 13 Juni 2017, 15:12:02Ich dachte immer, das wäre nicht sauber!
Wenn es einen triftigen Grund dafür gibt, warum nicht. Kannst ja auch mit
set $SELF cmd_2
arbeiten, dann überspringst du das wait auch. Da wir hier aber eh nur testen...

Zitat von: amenomade am 13 Juni 2017, 16:29:03do resetwait hat m.A., deine Bedingungen angenommen, wenig Sinn
Guter Einwand!!

amenomade

#7
Ich würde einfach schreiben:
([GA.ss.SA.Licht] eq "off" and [?help.Tageslicht.dum] eq "dunkel" and [?switch.di.02.EG.wz.RO.dum] eq "on")
     (close)
DOELSEIF ([23:00] and [?GA.ss.SA.Licht] eq "off" and [?switch.di.02.EG.wz.RO.dum] eq "on")
     (close)

attr do always

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

#8
Das do always, nur wenn dein Licht nur "on" und "off" Events generiert, und nicht auch battery oder was auch immer; ansonsten musst Du ([GA.ss.SA.Licht:"off"] and ... schreiben
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Spartacus

#9
Hallo zusammen,
erst einmal vielen Dank für die rege Beteiligung an meinem Problem. Ich will mal versuchen, die Funktionsweise zu erklären, da dies m.E. noch nicht klar geworden ist. Kann sein, dass ich wieder viel zu kompliziert gedacht habe:

Was soll mit der DOIF-Funktion erreicht werden!
Es gibt neben einer Lichtautomatik für den Aktor "GA.ss.SA.Licht" einen mechanischen Schalter der das Licht "GA.ss.SA.Licht" ein und ausschalten kann.

  • Wenn das Licht brennt, sollen die Rolladen (EG.wz.RO.*) nicht schließen.
  • Tageslicht = "dunkel" verhindert, dass die Rolladen tagsüber schließen, falls man bei schlechter Tagsicht (Gewitter) das Licht ein-/ausschaltet
  • Das Licht geht später am Abend per "fhem" - Automatik -je nach Wochentag, Ferientag, Feiertag, etc.- automatisch aus.
  • Die Rolladen sollen dann 120s zeigverzögert schließen
  • Wird das Licht innerhalb dieser 120s wieder eingeschaltet (z.B. über den mech. Schalter, da ich noch keinen Bock habe ins Bett zu gehen) wird das "wait" im DOIF zurückgesetzt und die Rolladen schließen nicht
  • Der Softschalter "switch.di.02.EG.wz.RO.dum" schaltet die ganze DOIF Automatik ab
  • In fhem wird die aktive DOIF-Automatik mit ".*on:general_an@lightgreenSymbol" angezeigt
  • die deaktivierte DOIF-Automatik wird mit ".*deaktiv:general_aus@grey" angezeigt; ("off" gibt es hier eigentlich nicht)

Soweit die Funktion, die schon seit 2 Jahren einwandfrei läuft.

Was kommt neu hinzu, und warum!
Die Lichtautomatik ist zusätzlich vom Sonnenstand abhängig. D.h. wird es im Sommer zu spät dunkel, schaltet das Licht nicht mehr ein. Dadurch wird verhindert, dass die Rolladen schließen.

Meine Idee:
Den Rolladen um 23:00 zu schließen, aber nur, wenn das Licht aus ist. Sollte die Lichtautomatik aktiv sein, brennt das Licht um 2300 Uhr, passiert nix. Dann würde später der "off"-Trigger von "GA.ss.SA.Licht" greifen.
Aber diese 23:00-Geschichte greift nicht.

Ich hoffe, mein Vorhaben ist nun klar geworden. Wie löse ich dies nun am Besten? Ist der zus. "23:00 Uhr - DOELSEIF"-Zweig hier die richtige Lösung?

Spartacus.


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

Otto123

#10
Hallo Christian,

Sorry, ich habe den ersten Ausdruck bzw. Deine Aussage genau falsch verstanden.

Die Sache mit dem leeren DOELSEIF und DOELSE verstehe ich dann wohl nicht - macht nix.  ;D

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

amenomade

Ich würde sagen (nicht getestet):

( [GA.ss.SA.Licht:"off"] and [?help.Tageslicht.dum] eq "dunkel" and [?switch.di.02.EG.wz.RO.dum] eq "on")
   (close)
DOELSEIF ([GA.ss.SA.Licht:"on"] )
DOELSEIF ([23:00] and [?GA.ss.SA.Licht] eq "off" and [?switch.di.02.EG.wz.RO.dum] eq "on")
   (close)
do resetWait
do always
wait 120:0:0
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Spartacus

Hallo zusammen,
der Test mit meinem Code hat gestern schon mal funktioniert. Um 23:00 wurde close ausgeführt.
([23:00] and [?GA.ss.SA.Licht] eq "off" and [?switch.di.02.EG.wz.RO.dum] eq "on")
(set EG.wz.RO.* closes)
DOELSEIF
([GA.ss.SA.Licht] eq "off" and [?help.Tageslicht.dum] eq "dunkel" and [?switch.di.02.EG.wz.RO.dum] eq "on")
(set EG.wz.RO.* closes)
DOELSEIF
([switch.di.02.EG.wz.RO.dum] eq "off")
DOELSE
do resetwait
wait 0:120:0:0


Der Code sieht ja so ähnlich aus, wie der Code von amenomade.
Ich checke heute noch mal mit eingeschaltetem Licht und werde berichten.

@ amenomade:
do restwait und do always in einem DOIF? Kann man das machen? Ich dachte man kann das nur "entweder/oder" in dem Attribut einstellen? Habe ich etwas verpasst?
Danke und Gruß,
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

amenomade

Ist eigentlich egal, da
Zitat von: CommandRefDas Attribut do resetwait impliziert eine beliebige Wiederholung wie do always.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Spartacus

Hallo zusammen,
jetzt bin ich total aufgeschmissen!
Es lief jetzt fast eine Woche reibungslos.
Die Rolladen führen um 23:00 herunter, wenn das Lich aus war,
wenn es zuvor eingeschaltet war, 2min zeitverzögert nach dem Ausschalten.
Alles so, wie es soll.

Seit vorgestern läuft dieser Teil der Anweisung nicht mehr:
([23:00] and [?GA.ss.SA.Licht] eq "off" and [?switch.di.02.EG.wz.RO.dum] eq "on")
(set EG.wz.RO.* closes)
...

Es wurde nicht einmal ein fhem-Update gemacht. Es ist alles so, wie vor einer Woche.und ich bin ratlos.
Irgendwo ist in der Funktion ein Fehler, jemand noch einen Tipp für mich?

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