DOIF und sich selbst abschalten wenn POWER < 2 WATT

Begonnen von cosinuz, 21 Oktober 2016, 22:06:10

Vorheriges Thema - Nächstes Thema

cosinuz

Hallo zusammen,

kann mir von Euch evtl. einer einen Tipp geben? Irgendwie bekomme ich das nicht hin.

1. Hier der Code

define VAR_AKTOR_SDLM_01_UEBERWACHUNG01_SET DOIF ([AKTOR_SDLM_01_Pwr:power]<2 && Value("AKTOR_SDLM_01_Sw") eq "on") (set AKTOR_SDLM_01_Sw off)
attr VAR_AKTOR_SDLM_01_UEBERWACHUNG01_SET wait 30


2. Folgendes habe ich vor
Ich schalte einen HM-ES-PMSw1-Pl ein. Sollte an dem Gerät weniger als 2 Watt für über 30 Sekunden anliegen und AKTOR_SDLM_01_Sw ist "on", soll er sich abschalten.

3. Problem
Das funktioniert auch fast, aber leider nur fast. Denn die "Schaltung" scheint nur sporadisch zu funktionieren.
- Dachte erst, dass die Anweisung evtl. nur 1x ausgeführt wird. Aber teilweise funktioniert sie mehrmals nacheinander.
- Seit über 20 Minuten ist laut Logfile "power: 0" aber nichts passiert.

Hilfe! :)

Danke und Gruß
cosinuz





Ellert

Da hilft es, das Attribut do auf always zu setzen.

cosinuz

Zitat von: Ellert am 21 Oktober 2016, 23:32:56
Da hilft es, das Attribut do auf always zu setzen.

Danke, aber funktioniert leider noch immer nicht. Irgendwie sieht das so aus, als wenn nur jedes 2te "set AKTOR_SDLM_01_Sw off" beim "AKTOR_SDLM_01_Sw" ankommt. Komisch.

Log: AKTOR_SDLM_01-2016.log
2016-10-22_00:10:40 AKTOR_SDLM_01_Pwr boot: off
2016-10-22_00:10:40 AKTOR_SDLM_01_Pwr current: 0
2016-10-22_00:10:40 AKTOR_SDLM_01_Pwr eState: E: 0 P: 0 I: 0 U: 240.5 f: 49.96
2016-10-22_00:10:40 AKTOR_SDLM_01_Pwr energy: 0
2016-10-22_00:10:40 AKTOR_SDLM_01_Pwr energyCalc: 1406.9
2016-10-22_00:10:40 AKTOR_SDLM_01_Pwr frequency: 49.96
2016-10-22_00:10:40 AKTOR_SDLM_01_Pwr power: 0
2016-10-22_00:10:40 AKTOR_SDLM_01_Pwr 0
2016-10-22_00:10:40 AKTOR_SDLM_01_Pwr voltage: 240.5
2016-10-22_00:10:40 AKTOR_SDLM_01_SenF 49.96
2016-10-22_00:10:40 AKTOR_SDLM_01_SenI 0
2016-10-22_00:10:40 AKTOR_SDLM_01_SenPwr 0
2016-10-22_00:10:40 AKTOR_SDLM_01_SenU 240.5
2016-10-22_00:11:10 AKTOR_SDLM_01 CMDs_pending
2016-10-22_00:11:10 AKTOR_SDLM_01_Sw set_off
2016-10-22_00:11:11 AKTOR_SDLM_01 CMDs_done
2016-10-22_00:11:11 AKTOR_SDLM_01_Sw deviceMsg: on (to HMLAN1)
2016-10-22_00:11:11 AKTOR_SDLM_01_Sw level: 100
2016-10-22_00:11:11 AKTOR_SDLM_01_Sw pct: 100
2016-10-22_00:11:11 AKTOR_SDLM_01_Sw on
2016-10-22_00:11:11 AKTOR_SDLM_01_Sw timedOn: off
2016-10-22_00:13:02 AKTOR_SDLM_01_Pwr boot: off
2016-10-22_00:13:02 AKTOR_SDLM_01_Pwr current: 0
2016-10-22_00:13:02 AKTOR_SDLM_01_Pwr eState: E: 0 P: 0 I: 0 U: 240.9 f: 49.96
2016-10-22_00:13:02 AKTOR_SDLM_01_Pwr energy: 0
2016-10-22_00:13:02 AKTOR_SDLM_01_Pwr energyCalc: 1406.9
2016-10-22_00:13:02 AKTOR_SDLM_01_Pwr frequency: 49.96
2016-10-22_00:13:02 AKTOR_SDLM_01_Pwr power: 0
2016-10-22_00:13:02 AKTOR_SDLM_01_Pwr 0
2016-10-22_00:13:02 AKTOR_SDLM_01_Pwr voltage: 240.9
2016-10-22_00:13:02 AKTOR_SDLM_01_SenF 49.96
2016-10-22_00:13:02 AKTOR_SDLM_01_SenI 0
2016-10-22_00:13:02 AKTOR_SDLM_01_SenPwr 0
2016-10-22_00:13:02 AKTOR_SDLM_01_SenU 240.9
2016-10-22_00:13:32 AKTOR_SDLM_01 CMDs_pending
2016-10-22_00:13:32 AKTOR_SDLM_01_Sw set_off
2016-10-22_00:13:32 AKTOR_SDLM_01 CMDs_done
2016-10-22_00:13:32 AKTOR_SDLM_01_Sw deviceMsg: off (to HMLAN1)
2016-10-22_00:13:32 AKTOR_SDLM_01_Sw level: 0
2016-10-22_00:13:32 AKTOR_SDLM_01_Sw pct: 0
2016-10-22_00:13:32 AKTOR_SDLM_01_Sw off
2016-10-22_00:13:32 AKTOR_SDLM_01_Sw timedOn: off



Die fett markierten Befehle kommen wohl nicht beim "AKTOR_SDLM_01_Sw" an. Aber oben im Logfiles sagt er doch CMDs_pending, set_off und dann CMDs_done. Oder verstehe ich da was falsch?
Das kann ich beliebig wiederholen, es ist immer das selbe Muster.

Log: fhem-2016-10.log
2016.10.22 00:01:29 3: CUL_HM set AKTOR_SDLM_01_Sw off
2016.10.22 00:03:44 3: CUL_HM set AKTOR_SDLM_01_Sw off
2016.10.22 00:04:31 3: CUL_HM set AKTOR_SDLM_01_Sw on
2016.10.22 00:05:44 3: CUL_HM set AKTOR_SDLM_01_Sw off
2016.10.22 00:08:35 3: CUL_HM set AKTOR_SDLM_01_Sw off
2016.10.22 00:08:48 3: CUL_HM set AKTOR_SDLM_01_Sw on
2016.10.22 00:11:10 3: CUL_HM set AKTOR_SDLM_01_Sw off
2016.10.22 00:13:32 3: CUL_HM set AKTOR_SDLM_01_Sw off




Danke und Gruß
cosinuz

Damian

Es handelt sich hier um einen zyklisch sendenden Sensor. Da wird jedes mal getriggert, wenn irgend ein Event von diesem Device kommt, da darf kein do always gesetzt sein. Ohne do always wird einmalig nach der Definition der Set-Befehl ausgeführt und dann erst wieder, wenn der Sonstfall zwischendurch zugeschlagen hat also Power größer oder gleich 2 Watt war.

Gruß

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

Ellert

Zitat von: cosinuz am 22 Oktober 2016, 00:27:25
Danke, aber funktioniert leider noch immer nicht. Irgendwie sieht das so aus, als wenn nur jedes 2te "set AKTOR_SDLM_01_Sw off" beim "AKTOR_SDLM_01_Sw" ankommt. Komisch.

Log: AKTOR_SDLM_01-2016.log
2016-10-22_00:10:40 AKTOR_SDLM_01_Pwr boot: off
2016-10-22_00:10:40 AKTOR_SDLM_01_Pwr current: 0
2016-10-22_00:10:40 AKTOR_SDLM_01_Pwr eState: E: 0 P: 0 I: 0 U: 240.5 f: 49.96
2016-10-22_00:10:40 AKTOR_SDLM_01_Pwr energy: 0
2016-10-22_00:10:40 AKTOR_SDLM_01_Pwr energyCalc: 1406.9
2016-10-22_00:10:40 AKTOR_SDLM_01_Pwr frequency: 49.96
2016-10-22_00:10:40 AKTOR_SDLM_01_Pwr power: 0
2016-10-22_00:10:40 AKTOR_SDLM_01_Pwr 0
2016-10-22_00:10:40 AKTOR_SDLM_01_Pwr voltage: 240.5
2016-10-22_00:10:40 AKTOR_SDLM_01_SenF 49.96
2016-10-22_00:10:40 AKTOR_SDLM_01_SenI 0
2016-10-22_00:10:40 AKTOR_SDLM_01_SenPwr 0
2016-10-22_00:10:40 AKTOR_SDLM_01_SenU 240.5
2016-10-22_00:11:10 AKTOR_SDLM_01 CMDs_pending
2016-10-22_00:11:10 AKTOR_SDLM_01_Sw set_off
2016-10-22_00:11:11 AKTOR_SDLM_01 CMDs_done
2016-10-22_00:11:11 AKTOR_SDLM_01_Sw deviceMsg: on (to HMLAN1)
2016-10-22_00:11:11 AKTOR_SDLM_01_Sw level: 100
2016-10-22_00:11:11 AKTOR_SDLM_01_Sw pct: 100
2016-10-22_00:11:11 AKTOR_SDLM_01_Sw on
2016-10-22_00:11:11 AKTOR_SDLM_01_Sw timedOn: off
2016-10-22_00:13:02 AKTOR_SDLM_01_Pwr boot: off
2016-10-22_00:13:02 AKTOR_SDLM_01_Pwr current: 0
2016-10-22_00:13:02 AKTOR_SDLM_01_Pwr eState: E: 0 P: 0 I: 0 U: 240.9 f: 49.96
2016-10-22_00:13:02 AKTOR_SDLM_01_Pwr energy: 0
2016-10-22_00:13:02 AKTOR_SDLM_01_Pwr energyCalc: 1406.9
2016-10-22_00:13:02 AKTOR_SDLM_01_Pwr frequency: 49.96
2016-10-22_00:13:02 AKTOR_SDLM_01_Pwr power: 0
2016-10-22_00:13:02 AKTOR_SDLM_01_Pwr 0
2016-10-22_00:13:02 AKTOR_SDLM_01_Pwr voltage: 240.9
2016-10-22_00:13:02 AKTOR_SDLM_01_SenF 49.96
2016-10-22_00:13:02 AKTOR_SDLM_01_SenI 0
2016-10-22_00:13:02 AKTOR_SDLM_01_SenPwr 0
2016-10-22_00:13:02 AKTOR_SDLM_01_SenU 240.9
2016-10-22_00:13:32 AKTOR_SDLM_01 CMDs_pending
2016-10-22_00:13:32 AKTOR_SDLM_01_Sw set_off
2016-10-22_00:13:32 AKTOR_SDLM_01 CMDs_done
2016-10-22_00:13:32 AKTOR_SDLM_01_Sw deviceMsg: off (to HMLAN1)
2016-10-22_00:13:32 AKTOR_SDLM_01_Sw level: 0
2016-10-22_00:13:32 AKTOR_SDLM_01_Sw pct: 0
2016-10-22_00:13:32 AKTOR_SDLM_01_Sw off
2016-10-22_00:13:32 AKTOR_SDLM_01_Sw timedOn: off



Die fett markierten Befehle kommen wohl nicht beim "AKTOR_SDLM_01_Sw" an. Aber oben im Logfiles sagt er doch CMDs_pending, set_off und dann CMDs_done. Oder verstehe ich da was falsch?
Das kann ich beliebig wiederholen, es ist immer das selbe Muster.

Log: fhem-2016-10.log
2016.10.22 00:01:29 3: CUL_HM set AKTOR_SDLM_01_Sw off
2016.10.22 00:03:44 3: CUL_HM set AKTOR_SDLM_01_Sw off
2016.10.22 00:04:31 3: CUL_HM set AKTOR_SDLM_01_Sw on
2016.10.22 00:05:44 3: CUL_HM set AKTOR_SDLM_01_Sw off
2016.10.22 00:08:35 3: CUL_HM set AKTOR_SDLM_01_Sw off
2016.10.22 00:08:48 3: CUL_HM set AKTOR_SDLM_01_Sw on
2016.10.22 00:11:10 3: CUL_HM set AKTOR_SDLM_01_Sw off
2016.10.22 00:13:32 3: CUL_HM set AKTOR_SDLM_01_Sw off




Danke und Gruß
cosinuz
Du könntest einen Filter setzen, dann wird der Befehl nur gesendet, wenn das Gerät nicht bereits off oder set_off ist.
Zitatset AKTOR_SDLM_01_Sw:FILTER=state!~off off
ungetestet

cosinuz

#5
Zitat von: Damian am 22 Oktober 2016, 10:23:47
Es handelt sich hier um einen zyklisch sendenden Sensor. Da wird jedes mal getriggert, wenn irgend ein Event von diesem Device kommt, da darf kein do always gesetzt sein. Ohne do always wird einmalig nach der Definition der Set-Befehl ausgeführt und dann erst wieder, wenn der Sonstfall zwischendurch zugeschlagen hat also Power größer oder gleich 2 Watt war.

Gruß

Damian

Hi Damian,

wäre es dann in diesem Fall nicht doch besser ein do always zu nutzen? Denn wenn Watt < 2 bleibt, soll er ja trotzdem wieder abschalten wenn er eingeschaltet wird. Oder gehe ich das Thema komplett falsch an? Gibt es evtl. eine Alternative oder kann man das besser / sinnvoller umsetzen?

Vielen Dank! :)

Gruß
cosinuz




Damian

Zitat von: cosinuz am 22 Oktober 2016, 13:41:58
Hi Damian,

wäre es dann in diesem Fall nicht doch besser ein do always zu nutzen? Denn wenn Watt < 2 bleibt, soll er ja trotzdem wieder abschalten wenn er eingeschaltet wird. Oder gehe ich das Thema komplett falsch an? Gibt es evtl. eine Alternative oder kann man das besser / sinnvoller umsetzen?

Vielen Dank! :)

Gruß
cosinuz

Dann musst du es, wie Ellert vorgeschlagen hat, realisieren:

define VAR_AKTOR_SDLM_01_UEBERWACHUNG01_SET DOIF ([AKTOR_SDLM_01_Pwr:power]<2) (set AKTOR_SDLM_01_Sw:FILTER=state!=off off)

attr VAR_AKTOR_SDLM_01_UEBERWACHUNG01_SET wait 30
attr VAR_AKTOR_SDLM_01_UEBERWACHUNG01 do always


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

cosinuz

Hallo zusammen,

ah okay! :)

@Ellert, Damian
Vielen Dank!!