neuer FHEM-Befehl IF

Begonnen von Damian, 25 Dezember 2013, 23:50:06

Vorheriges Thema - Nächstes Thema

Damian

Zitat von: der-Lolo am 26 Januar 2014, 12:52:50
Ergebnis: Es funktioniert falschrum - wenn ich den Denon ausschalte wird HUEDevice7 an geschaltet,
wenn ich ihn anschalte wird HUEDevice7 aus geschaltet...

Dann mach mal list DenonAVR und poste das Ergebnis, sonst muss ich vieles raten.

Gruß

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

der-Lolo

ein list DenonAVR liefert:


Internals:
   CFGFN      /opt/fhem/FHEM/sys.cfg
   DEF        192.168.178.60
   DeviceName 192.168.178.60:23
   FD         14
   NAME       DenonAVR
   NR         197
   PARTIAL   
   STATE      off
   TYPE       DENON_AVR
   CHANGETIME:
   Helper:
     Dblog:
       Input:
         Mydblog:
           TIME       1390743584.98804
           VALUE      TV
       Mute:
         Mydblog:
           TIME       1390743584.98804
           VALUE      off
       Power:
         Mydblog:
           TIME       1390750791.64597
           VALUE      off
       State:
         Mydblog:
           TIME       1390743906.94147
           VALUE      off
       Volume_level:
         Mydblog:
           TIME       1390743891.86793
           VALUE      -36
       Volume_level_pct:
         Mydblog:
           TIME       1390743891.86793
           VALUE      44
   Readings:
     2014-01-26 14:39:44   input           TV
     2014-01-26 14:39:44   mute            off
     2014-01-26 16:39:51   power           off
     2014-01-26 14:44:51   volume_level    -36
     2014-01-26 14:44:51   volume_level_pct 44
Attributes:
   devStateIcon on:power-green:off off:power-black:on
   group      Geräte
   room       Media
   webCmd     :

Damian

Ist denn power on, wenn ein Event für´s Einschalten kommt?

Wie sehen die Events im EventMonitor aus, wenn du den Receiver einschaltest?

Wenn power nicht mit dem Status übereinstimmt, dann kannst du noch probieren:


define subwoofer_an notify DenonAVR:(on|off)  IF ((Value("DenonAVR") eq "on") and ($hour ~~ [8..21]) and ([DenonAVR:volume_level_pct]>30)) (set HUEDevice7 on) ELSE (set HUEDevice7 off)


Wenn das auch nicht hilft, dann die IF-Abfrage erstmal ohne $hour- und dann ohne volume_level_pct-Bedingung probieren.

Gruß

Damian

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

der-Lolo

Vielleicht ist das problem das on mehrfach kommt...

der Event Monitor:
Zitat
2014-01-26 17:57:43 HUEDevice HUEDevice7 bri: 254
2014-01-26 17:57:43 HUEDevice HUEDevice7 onoff: 1
2014-01-26 17:57:43 HUEDevice HUEDevice7 level: 100 %
2014-01-26 17:57:43 HUEDevice HUEDevice7 pct: 100
2014-01-26 17:57:43 HUEDevice HUEDevice7 on
2014-01-26 17:57:43 HUEDevice HUEDevice7 RGB: 000000
2014-01-26 17:57:43 DENON_AVR DenonAVR on
2014-01-26 17:57:43 HUEDevice HUEDevice8 RGB: 000000
2014-01-26 17:57:43 DENON_AVR DenonAVR power: on
2014-01-26 17:57:44 HUEDevice HUEDevice15 RGB: 000000
2014-01-26 17:57:44 HUEDevice HUEDevice16 RGB: 000000
2014-01-26 17:57:44 HUEDevice HUEDevice6 RGB: ff700a
2014-01-26 17:57:44 HUEDevice HUEDevice11 RGB: f2881e
2014-01-26 17:57:44 HUEDevice HUEDevice3 RGB: f38721
2014-01-26 17:57:45 HUEDevice HUEDevice12 RGB: ffc148
2014-01-26 17:57:45 HUEDevice HUEDevice2 RGB: f38721
2014-01-26 17:57:45 HUEDevice HUEDevice14 RGB: c42e2d
2014-01-26 17:57:46 HUEDevice HUEDevice4 RGB: f38721
2014-01-26 17:57:46 HUEDevice HUEDevice13 RGB: ffc148
2014-01-26 17:57:46 HUEDevice HUEDevice5 RGB: 000000
2014-01-26 17:57:46 HUEDevice HUEDevice9 RGB: 000000
2014-01-26 17:57:46 HUEDevice HUEDevice1 RGB: 000000
2014-01-26 17:57:52 DENON_AVR DenonAVR power: on

on kommt nach dem schalten über das DenonAVR Modul dreimal.
Der letzte on kommt wenn es knack macht und die Endstufen bereit zur Wiedergabe sind...

HUEDevice7 schaltet weil ich zur zeit die set befehle vor und nach dem ELSE vertauscht habe,
ich wollte testen ob denn die abfrage volume_pct funktioniert...

Damian

Zitat von: der-Lolo am 26 Januar 2014, 18:22:24
Vielleicht ist das problem das on mehrfach kommt...
on kommt nach dem schalten über das DenonAVR Modul dreimal.

Gefiltert wird aber nur nach "on" bzw. "off" und das kommt nur einmal vor:

2014-01-26 17:57:43 DENON_AVR DenonAVR on

Die anderen sind: "power on".

Gruß

Damian

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

der-Lolo

#80
Ich habe nun die volume_pct rausgenommen und auch die $hour abfrage entfernt...

wenn der Denon off liefert wird die Steckdose angeschaltet - bei on aus...

DenonAVR:(on|off) IF ([DenonAVR:power] eq "on") (set HUEDevice16 on) ELSE (set HUEDevice16 off)

wieso ist denn das verdreht?

Zitat
Events:
2014-01-28 17:39:35 HUEDevice HUEDevice16 bri: 254
2014-01-28 17:39:35 HUEDevice HUEDevice16 onoff: 0
2014-01-28 17:39:35 HUEDevice HUEDevice16 RGB: 000000
2014-01-28 17:39:35 DENON_AVR DenonAVR on
2014-01-28 17:39:35 DENON_AVR DenonAVR power: on
2014-01-28 17:39:40 HUEDevice HUEDevice16 onoff: 1
2014-01-28 17:39:40 HUEDevice HUEDevice16 level: 100 %
2014-01-28 17:39:40 HUEDevice HUEDevice16 pct: 100
2014-01-28 17:39:40 HUEDevice HUEDevice16 on
2014-01-28 17:39:40 HUEDevice HUEDevice16 RGB: 000000
2014-01-28 17:39:40 DENON_AVR DenonAVR off
2014-01-28 17:39:40 DENON_AVR DenonAVR power: off

Damian

Zitat von: der-Lolo am 28 Januar 2014, 17:38:14
Ich habe nun die volume_pct rausgenommen und auch die $hour abfrage entfernt...

wenn der Denon off liefert wird die Steckdose angeschaltet - bei on aus...

DenonAVR:(on|off) IF ([DenonAVR:power] eq "on") (set HUEDevice16 on) ELSE (set HUEDevice16 off)

wieso ist denn das verdreht?
Du kannst es auch direkt in der Kommandozeile testen.

z. B.

IF (1)  (set HUEDevice16 on) ELSE (set HUEDevice16 off)

müsste Steckdose anmachen

IF (0)  (set HUEDevice16 on) ELSE (set HUEDevice16 off)

müsste Steckdose ausmachen.

Dann mal nach dem aktuellen Zustand von power schauen und bei  power= "on"

IF ([DenonAVR:power] eq "on") (set HUEDevice16 on) ELSE (set HUEDevice16 off)

aufrufen

Jetzt sollte Steckdose angehen.

Wenn das alles funktioniert, dann kann ich mir nur erklären, dass, wie schon geschrieben, zum Eventzeitpunkt power noch nicht on ist.

Gruß

Damian


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

der-Lolo

#82
Ja - das funktioniert alles anstandslos...

sobald ich aber das IF hinter das DenonAVR(on|off) setze geht es nicht mehr.

Damian

Zitat von: der-Lolo am 28 Januar 2014, 17:55:10
Ja - das funktioniert alles anstandslos...
OK. Dann ist das so, wie ich es vermutete (kann man auch aus dem EventLog erkennen). Zuerst kommt Event on und dann erst power: on. Das heißt, wenn Event auf on getrigger wird, steht wohl noch im Reading von power der alte Zustand off und paar Millisekunden später erst der passende Zustand.

Du hast zwei Möglichkeiten, entweder, wie ich schon vorhin vorgeschlagen habe, IF ((Value("DenonAVR") eq "on") ... abfragen, denn der Zustand passt zum Event oder auf power: on triggern also:

define subwoofer_an notify DenonAVR:(power: on|power: off) IF (([DenonAVR:power] eq "on") ...


Gruß

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

der-Lolo

also die 2te Variante liefert mir:

define subwoofer_an notify DenonAVR:(power: on|power: off) IF (([DenonAVR:power] eq "on")
Bad regexp: Unmatched ( in regex; marked by <-- HERE in m/^DenonAVR:( <-- HERE power:$/ at ./FHEM/91_notify.pm line 38.


IF ((Value("DenonAVR") eq "on")
schaltet wieder wie gehabt falschrum...

Damian

Zitat von: der-Lolo am 28 Januar 2014, 18:20:04
IF ((Value("DenonAVR") eq "on")
schaltet wieder wie gehabt falschrum...

Verstehe ich nicht???

Dann probier noch mal:

define subwoofer_an notify DenonAVR:(power..on|power..off) IF (([DenonAVR:power] eq "on")...

Gruß

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

der-Lolo

#86
define subwoofer_an notify DenonAVR:(power..on|power..off) IF ([DenonAVR:power] eq "on") (set HUEDevice16 on) ELSE (set HUEDevice16 off)

schaltet nun die Steckdose passend zum zustand des Verstärkers...
Danke schonmal bis hierher... vorallem für Deine Geduld.
Ich versuch dann jetzt das $hour wieder einzufügen und die abfrage auf volume


EDIT:

define subwoofer_an notify DenonAVR:(power..on|power..off) IF (([DenonAVR:power] eq "on") and ([DenonAVR:volume_level_pct:]>..30) and ($hour ~~ [8..21])) (set HUEDevice7 on) ELSE (set HUEDevice7 off)

schaltet nun wie gewünscht erst bei Lautstärke >30 die Steckdose an, einen Schönheitsfehler hat das Konstrukt aber noch:
Wenn ich das nun richtig analysiert habe liefert der Denon ca. alle 5 Minuten ein power on das Konstrukt prüft scheinbar nicht auf Änderungen des Pegels sondern auf das event power on - im heftigstem fall schaltet die Steckdose also bis zu 5 Minuten zu spät...
Würde es was bringen wenn ich die volume abfrage nach vorne direkt hinter das IF setze?

Damian

#87
Zitat von: der-Lolo am 28 Januar 2014, 18:46:36
Wenn ich das nun richtig analysiert habe liefert der Denon ca. alle 5 Minuten ein power on das Konstrukt prüft scheinbar nicht auf Änderungen des Pegels sondern auf das event power on - im heftigstem fall schaltet die Steckdose also bis zu 5 Minuten zu spät...
Würde es was bringen wenn ich die volume abfrage nach vorne direkt hinter das IF setze?
Die Änderung der Reihenfolge in der Abfrage bei IF würde nichts bringen. Wenn dein power on Event alle 5 Minuten kommt, dann wird jedes mal auch die Steckdose geschaltet - das macht dann nicht viel Sinn.
Das mehrfache Schalten könnte man evtl. mit der neuen Filteroption des set-Befehls unterdrücken oder einen zweiten IF-Befehl einbauen oder gleich THRESHOLD-Modul nehmen.

Ich verstehe aber immer noch nicht, warum die Abfrage nach dem Status mit Value(..) nicht funktioniert, obwohl on gesetzt wird - das wäre die elegantere Version.

Gruß

Damian

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

kermi

Hallo Damian,

super Sache, dein Modul, ich benutze es mittlerweile ziemlich oft.

Kann an auch nach einem Zahlenbereich filtern? Also z.B. >50 <100 .
Nutzen will ich es für eine einfache Statusmeldung bei bestimmten Füllständen einer Abwassergrube:

define sensor_grube_leer notify sensor_grube IF ([sensor_grube:rawValue] < 300) (set DisplayLed_16 led off)

Gruss
Stephan
FB 7390 mit FHEM 5.5
2x CUL V2
HM-Sec-RHS, HM-ES-PMSw1-Pl, HM-PB-4Dis-WM, HM-LC-Dim1TPBU-FM, HM-LC-Sw1-FM, HM-PB-2-WM55, KFM 100, HM-OU-LED16,
EM 1000 WZ ... und div. Quatsch

der-Lolo

Er schaltet ja je nach Pegel, also unter 30 aus über 30 an.
Aber eben nur in dem Moment wenn der Denon sein power on gibt. Im ~5minuten Takt kommt das ja scheinbar... Das gleiche passiert wenn ich gestern Abend alles richtig gedeutet habe auch bei der $hour Abfrage...
Keine Ahnung warum das Denon Modul so arbeitet, vielleicht soll es so etwas wie ein keep alive sein... Vielleicht sollte ich mal im Denon Thread fragen... Die haben wohl auch noch ne Alternative im Thread zur zeit nutze ich DENON_AVR es gibt auch noch DENONX_AVR und DENONZ_AVR...

Oder eben doch Threshold...