DOIF wird beim Device Update ausgeführt

Begonnen von MobiusOne, 10 Juni 2018, 19:18:40

Vorheriges Thema - Nächstes Thema

MobiusOne

Hallo liebe FHEM-Community,

leider muss ich mich nochmals an euch wenden. Nach vielem Basteln und ausprobieren stehe ich langsam an er "Vollendung" meines Smart Homes. Leider habe ich nach einem erneuten aufsetzen und Aktualisierung einen Fehler innerhalb meiner Automatisierung. Ich verwende Rollladen von Tahoma (Somfy IO) und Fensterkontakte von HomematicIP (HMIP-SWDO, über HMCCU). Diese Komponenten habe ich mit einander verknüpft um die Rollladen, auf Basis der Sonnenintensität, und dem Status der Fenster zu fahren.

Vereinfachtes Beispiel: Wenn im Osten (Lichtsensor Tahoma) die Sonnenintensität ein gewisses Niveau erreicht, sollen die Rollläden auf der Ostseite auf dim 85 fahren. Dies funktioniert ohne Probleme. Wenn ich nun in der Küche das Fenster öffne (open), möchte ich dass die Rolllade hochfährt und sich erst wieder schließt, sobald ich das Fenster schließe (close), oder die Sonnenautomation wieder greift. Wenn das Fenster bereits vorher geöffnet war, soll die Küchenrolllade auf dim 85 fahren, egal ob das Fenster gerade geöffnet ist.

Mein Beispiel habe ich wie folgt implementiert (natürlich alles nun auf ein Fenster runtergebrochen):
In meinen Sonnenschutz DOIF stelle ich bei einer Intensität von mehr als 38000 Lux die Kuechenrolllade auf dim 85 und setze ein reading mit der gleichen Position.
defmod Regel_Sonnenschutz_Osten DOIF ([SonnensensorOsten:LuminanceState] < 29000.0 and [07:00-14:00] and [Sonnenschutz] eq "on") (set Kuechenrolllade dim 0, setreading Kuechenrolllade position 0) DOELSEIF  ([SonnensensorOsten:LuminanceState] > 38000.0 and [07:00-14:00] and [Sonnenschutz] eq "on") (set Kuechenrolllade dim 85, setreading Kuechenrolllade position 85) DOELSE
attr Regel_Sonnenschutz_Osten wait 900:480
attr Regel_Rollladen_Osten room Haussteuerung


Im nächsten DOIF soll die Kuechenrolllade immer hochfahren, sobald das Küchenfenster geöffnet wird. Sobald ich das Fenster schließe, soll die Kuechenrolllade auf die Position vom Reading position fahren. In diesem Beispiel wäre dies vom Sonnenschutz der Wert 85.
defmod Regel_Rollladen_Osten DOIF ([Rollladensteuerung] eq "on" and [Kuechenfenster] eq "Open") (set Kuechenrolllade dim 0) DOELSEIF ([Rollladensteuerung] eq "on" and [Kuechenfenster] eq "Closed") (set Kuechenrolllade dim [Kuechenrolllade:position]) DOELSE
attr Regel_Rollladen_Osten room Haussteuerung


Die beiden DOIFs funktionieren in meinem Setup wie gewünscht. Ähnliche DOIFs, wie vom Sonnenschutz, verwende ich auch für den Rollladenstand Morgens, Abends und Nachts. Nun kommt das Problem: Das Küchenfenster ist geöffnet und die Sonnenintensität wird zu stark. Die Kuechenrolllade fährt auf dim 85, das Reading position der Rolllade wird auf 85 gesetzt. Der Kontaktsensor Kuechenfenster zeigt immer noch geöffnet (open) an. Bis jetzt ist alles richtig. Nun passiert es aber das nach x Minuten auf einmal die Rolllade hochfährt auf dim 0. Das Reading von Kuechenrolllade position steht immer noch auf 85. Dies soll jetzt natürlich nich passieren, es liegt auch nicht an einem der anderen DOIF. Im Eventlog sehe ich folgenden Einträge:
2018-06-10 18:13:42 tahoma Kuechenrolllade dim 0
2018-06-10 18:13:42 DOIF Regel_Rollladen_Osten cmd_nr: 1
2018-06-10 18:13:42 DOIF Regel_Rollladen_Osten cmd: 1
2018-06-10 18:13:42 DOIF Regel_Rollladen_Osten cmd_event: Kuechenfenster
2018-06-10 18:13:42 DOIF Regel_Rollladen_Osten cmd_1
2018-06-10 18:13:42 HMCCUDEV Kuechenfenster 0.OPERATING_VOLTAGE: 1.4
2018-06-10 18:13:42 HMCCUDEV Kuechenfenster 0.LOW_BAT: Ok
2018-06-10 18:13:42 HMCCUDEV Kuechenfenster 0.ERROR_CODE: 0
2018-06-10 18:13:42 HMCCUDEV Kuechenfenster 0.SABOTAGE: Ok
2018-06-10 18:13:42 HMCCUDEV Kuechenfenster 0.RSSI_DEVICE: -56
2018-06-10 18:13:42 HMCCUDEV Kuechenfenster 0.DUTY_CYCLE: 0
2018-06-10 18:13:42 HMCCUDEV Kuechenfenster 0.UNREACH: 0
2018-06-10 18:13:42 HMCCUDEV Kuechenfenster hmstate: Open
2018-06-10 18:13:42 HMCCUDEV Kuechenfenster BatteryLevel: 100
2018-06-10 18:13:43 tahoma Kuechenrolllade dim 0
2018-06-10 18:13:43 DOIF Regel_Rollladen_Osten cmd_nr: 1
2018-06-10 18:13:43 DOIF Regel_Rollladen_Osten cmd: 1
2018-06-10 18:13:43 DOIF Regel_Rollladen_Osten cmd_event: Kuechenfenster
2018-06-10 18:13:43 DOIF Regel_Rollladen_Osten cmd_1
2018-06-10 18:13:43 HMCCUDEV Kuechenfenster 1.STATE: Open
2018-06-10 18:13:43 HMCCUDEV Kuechenfenster control: Open
2018-06-10 18:13:43 HMCCUDEV Kuechenfenster Open
2018-06-10 18:13:43 HMCCUDEV Kuechenfenster hmstate: Open
2018-06-10 18:13:45 tahoma Kuechenrolllade RSSILevelState: 80.0
2018-06-10 18:13:45 tahoma Kuechenrolllade dim83
2018-06-10 18:13:45 tahoma Kuechenrolllade ClosureState: 83
2018-06-10 18:13:45 tahoma Kuechenrolllade devicestate: open
2018-06-10 18:13:45 tahoma Kuechenrolllade OpenClosedState: open
2018-06-10 18:13:55 tahoma Kuechenrolllade RSSILevelState: 90.0
2018-06-10 18:13:55 tahoma Kuechenrolllade dim0
2018-06-10 18:13:55 tahoma Kuechenrolllade ClosureState: 0
2018-06-10 18:13:55 tahoma Kuechenrolllade devicestate: open
2018-06-10 18:13:55 tahoma Kuechenrolllade OpenClosedState: open


Nach Recherche gehe ich davon aus, dass das Regel_Rollladen_Osten DOIF getigert wird, sobald HMCCU den Status der einzelnen Homematic Komponenten überprüft und aktualisiert. Ich habe beim Küchenfenster bereits mit den Attributen Event-by-change-reading und Event-by-update-reading gearbeitet (nach einander):
Event-by-change-reading .*
Event-by-change-reading state
Event-by-change-reading state,hmstate,control,1.STATE
Event-by-update-reading .*

Dies scheint irgendwie alles nicht zu funktionieren. Hab ihr eine Idee woran es liegen kann? Vielleicht sind bei DOIFs zu komplex und würde es auf einer anderen weiße besser funktionieren?

Lieben Gruß

Damian

Deine Konfiguration sollte so sein, dass immer nur ein DOIF einen Rollladen steuert und nicht mehrere DOIFs den gleichen Rollladen steuern. Ggf. muss ein DOIF ein Reading oder Dummy setzen, welches im anderen DOIF zum Steuern des Rollladens mit abgefragt wird.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

MobiusOne

Zitat von: Damian am 10 Juni 2018, 19:48:07
Deine Konfiguration sollte so sein, dass immer nur ein DOIF einen Rollladen steuert und nicht mehrere DOIFs den gleichen Rollladen steuern. Ggf. muss ein DOIF ein Reading oder Dummy setzen, welches im anderen DOIF zum Steuern des Rollladens mit abgefragt wird.
Hi Damian,

testweise habe ich tatsächlich alle DOIFs deaktiviert die auf diese Rolllade zugreifen. Wären das aber nicht ziemlich viele Dummys und DOIFs die erstellt werden sollten. Ich glaube aber nicht das es unbedingt daran liegen würde.

Damian

Zitat von: MobiusOne am 10 Juni 2018, 19:59:46
Hi Damian,

testweise habe ich tatsächlich alle DOIFs deaktiviert die auf diese Rolllade zugreifen. Wären das aber nicht ziemlich viele Dummys und DOIFs die erstellt werden sollten. Ich glaube aber nicht das es unbedingt daran liegen würde.

Offenbar liefert HMCCUDEV Kuechenfenster mehrere Events im Abstand von einer Sekunde.

Du arbeitest offensichtlich mit do always, sonst würde DOIF nicht zwei mal den gleichen Befehlt ausführen. Bei einem DOIF pro Fenster könntest du ohne do always arbeiten, denn dann wüsste DOIF den aktuellen Zustand des Rolllos, den es selbst ohne andere DOIFs geschaltet hätte.





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

Per

Zitat von: MobiusOne am 10 Juni 2018, 19:18:40
Im nächsten DOIF soll die Kuechenrolllade immer hochfahren, sobald das Küchenfenster geöffnet wird. Sobald ich das Fenster schließe, soll die Kuechenrolllade auf die Position vom Reading position fahren.
Aus eigener Erfahrung empfehle ich dir, die Position nicht zu merken, sondern jedesmal neu zu "errechnen". Also alle notwendigen Bedingungen in ein DOIF. Es kann immer mal vorkommen (Neustart o.ä.), dass die gespeicherten Variablen veraltet sind. Fragst du die Zustände aktuell ab, kann das nicht vorkommen.

MobiusOne

Zitat von: Damian am 10 Juni 2018, 20:41:32
Offenbar liefert HMCCUDEV Kuechenfenster mehrere Events im Abstand von einer Sekunde.

Du arbeitest offensichtlich mit do always, sonst würde DOIF nicht zwei mal den gleichen Befehlt ausführen. Bei einem DOIF pro Fenster könntest du ohne do always arbeiten, denn dann wüsste DOIF den aktuellen Zustand des Rolllos, den es selbst ohne andere DOIFs geschaltet hätte.

Ich habe bei allen Fensterkontakte nochmals den Eintrag Event-by-change-reading entfernt, FHEM neugestartet und wieder hinzugefügt. Auf einmal funktioniert es bei 10 von 11 Fenstern. Das werde ich aber heute nochmals probieren. Sehr merkwürdig.

Zitat von: Per am 11 Juni 2018, 12:11:31
Aus eigener Erfahrung empfehle ich dir, die Position nicht zu merken, sondern jedesmal neu zu "errechnen". Also alle notwendigen Bedingungen in ein DOIF. Es kann immer mal vorkommen (Neustart o.ä.), dass die gespeicherten Variablen veraltet sind. Fragst du die Zustände aktuell ab, kann das nicht vorkommen.
Ich bin mir nicht ganz sicher, ob ich genau verstehe was du meinst. Kannst du mir da ein kleines Beispiel zeigen?

MobiusOne

Zitat von: MobiusOne am 19 Juni 2018, 10:59:49
Ich habe bei allen Fensterkontakte nochmals den Eintrag Event-by-change-reading entfernt, FHEM neugestartet und wieder hinzugefügt. Auf einmal funktioniert es bei 10 von 11 Fenstern. Das werde ich aber heute nochmals probieren. Sehr merkwürdig.

So, nach einem erneuten Abend, funktioniert es wieder leider nicht. Sobald sich der State (HM Fensterkontakt) aktualisiert, ob verändert oder nicht, fahren die Rollladen in die Position, die im Reading position eingetragen ist. Obwohl ich manuell über das iPhone eine andere Position eingegeben habe. Vielleicht soll ich mein Problem im Homematic Threadt stellen?