[gelöst] ReadingsVal im RegExp1 des Watchdog

Begonnen von ToM_ToM, 30 Januar 2015, 22:42:36

Vorheriges Thema - Nächstes Thema

ToM_ToM

Hallo,

ich würde gerne den Status eines Readings innerhalb eines Watchdogs abfragen, aber bekomme es nicht hin.

Im RegExp1 habe ich hier mal versucht, mit Perlscript was zu machen und im RegExp2 mit normaler FHEM-Anweisung.

define TestDimmUpWatchdog watchdog { my $virtActTrigType = ReadingsVal("virtueller_Aktor_Btn1", "virtActTrigType", "") print $virtActTrigType ;;} 00:00:03 virtueller_Aktor_Btn1:virtActTrigType.long_Release {  fhem("set HUEDevice3 pct 50");; fhem('setstate WZ_TestDimmUpWatchdog defined');; }

Ich habe jetzt sämtliche Kombinationen ausprobiert, aber egal welche ich verwende, bekomme ich immer beim Speichern die Fehlermeldung: Wrong timespec, must be HH:MM[:SS]

Geht das so überhaupt oder habe ich einen kompletten Denkfehler?

Danke für eure Hilfe!
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

nesges

Zitat von: ToM_ToM am 30 Januar 2015, 22:42:36
Geht das so überhaupt oder habe ich einen kompletten Denkfehler?

Ich glaube, ja :-) Warum willst du denn an der Stelle ein Reading abgreifen und was würde da drin stehen?
Mit regexp1 und regexp2 werden Events wie in einem notify beschrieben. Siehe auch http://fhem.de/commandref.html#watchdog

ToM_ToM

Hey, ich brauche eben den Wert, der im Reading steht. In diesem Fall ist es ein Wandtaster den man kurz und lang drücken kann. Und wenn man ihn lange drückt, bekommt die Variable "virtActTrigType" im Reading den Wert "long". Nun möchte ich im Watchdog schauen, ob die Taste nach 3 Sekunden immernoch gedrückt ist. Und wenn ja, soll etwas ausgeführt werden.
Ich habe gester noch die halbe Nacht probiert, aber komme leider nicht weiter.
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

nesges

Ein Watchdog erwartet ein Event <regexp1> und wartet eine Zeit <timestamp> lang auf ein weiteres Event <regexp2>. Wenn das Event <regexp2> nicht eintritt, wird der Befehl <command> ausgeführt. Vgl. auch das Einsteigerhandbuch auf Seite 52.

Der Watchdog kann ein Reading also nicht direkt überwachen. Er kann aber auf ein Event reagieren, das beim setzen des Readings ausgelöst wird. Starte also den Eventmonitor in FHEM und beobachte was für ein Event auftritt, wenn du den Taster kurz drückst und was für ein Event auftritt, wenn du den Taster lang drückst. Beschreibe dann Event 1 mit <regexp1> und beschreibe Event 2 mit <regexp2>.

ToM_ToM

Das verstehe ich soweit. State ist immer nur ON oder OFF, egal ob ich lang oder kurz drücke. Und genau deshalb muss ich das irgendwie über die Readings hinbekommen. Das Einsteigerhandbuch geht auf mein Problem leider auch nicht ein.

Das ist alles was mir der Eventlogger liefert:

2015-01-31 14:23:42 CUL_HM Wandtaster1 battery: ok
2015-01-31 14:23:42 CUL_HM Wandtaster1 Wandtaster1_Btn_01 Long 1-8440- (to virtueller_Aktor)
2015-01-31 14:23:42 CUL_HM Wandtaster1_Btn_01 trigger_cnt: 80
2015-01-31 14:23:42 CUL_HM Wandtaster1_Btn_01 Long 1-8440- (to virtueller_Aktor)
2015-01-31 14:23:42 CUL_HM Wandtaster1_Btn_01 trigger: Long_80
2015-01-31 14:23:42 CUL_HM virtueller_Aktor trig_Wandtaster1_Btn_01: long
2015-01-31 14:23:42 CUL_HM virtueller_Aktor trigLast: Wandtaster1_Btn_01 :long
2015-01-31 14:23:42 CUL_HM virtueller_Aktor_Btn1 OFF
2015-01-31 14:23:42 CUL_HM virtueller_Aktor_Btn1 virtActState: OFF
2015-01-31 14:23:42 CUL_HM virtueller_Aktor_Btn1 virtActTrigger: Wandtaster1_Btn_01
2015-01-31 14:23:42 CUL_HM virtueller_Aktor_Btn1 virtActTrigType: long
2015-01-31 14:23:42 CUL_HM virtueller_Aktor_Btn1 virtActTrigRpt: 1
2015-01-31 14:23:42 CUL_HM virtueller_Aktor_Btn1 virtActTrigNo: 80
2015-01-31 14:23:42 CUL_HM Wandtaster1 battery: ok
2015-01-31 14:23:42 CUL_HM Wandtaster1 Wandtaster1_Btn_01 Long 2-8440- (to virtueller_Aktor)
2015-01-31 14:23:42 CUL_HM Wandtaster1_Btn_01 trigger_cnt: 80
2015-01-31 14:23:42 CUL_HM Wandtaster1_Btn_01 Long 2-8440- (to virtueller_Aktor)
2015-01-31 14:23:42 CUL_HM Wandtaster1_Btn_01 trigger: Long_80
2015-01-31 14:23:42 CUL_HM virtueller_Aktor trig_Wandtaster1_Btn_01: long
2015-01-31 14:23:42 CUL_HM virtueller_Aktor trigLast: Wandtaster1_Btn_01 :long
2015-01-31 14:23:42 CUL_HM virtueller_Aktor_Btn1 OFF
2015-01-31 14:23:42 CUL_HM virtueller_Aktor_Btn1 virtActState: OFF
2015-01-31 14:23:42 CUL_HM virtueller_Aktor_Btn1 virtActTrigger: Wandtaster1_Btn_01
2015-01-31 14:23:42 CUL_HM virtueller_Aktor_Btn1 virtActTrigType: long
2015-01-31 14:23:42 CUL_HM virtueller_Aktor_Btn1 virtActTrigRpt: 2
2015-01-31 14:23:42 CUL_HM virtueller_Aktor_Btn1 virtActTrigNo: 80
2015-01-31 14:23:42 CUL_HM Wandtaster1 battery: ok
2015-01-31 14:23:42 CUL_HM Wandtaster1 Wandtaster1_Btn_01 LongRelease 3-A040- (to virtueller_Aktor)
2015-01-31 14:23:42 CUL_HM Wandtaster1 CMDs_done
2015-01-31 14:23:42 CUL_HM Wandtaster1_Btn_01 trigger_cnt: 80
2015-01-31 14:23:42 CUL_HM Wandtaster1_Btn_01 LongRelease 3-A040- (to virtueller_Aktor)
2015-01-31 14:23:42 CUL_HM Wandtaster1_Btn_01 trigger: Long_80
2015-01-31 14:23:42 CUL_HM virtueller_Aktor trig_Wandtaster1_Btn_01: long
2015-01-31 14:23:42 CUL_HM virtueller_Aktor trigLast: Wandtaster1_Btn_01 :long
2015-01-31 14:23:42 CUL_HM virtueller_Aktor_Btn1 OFF
2015-01-31 14:23:42 CUL_HM virtueller_Aktor_Btn1 virtActState: OFF
2015-01-31 14:23:42 CUL_HM virtueller_Aktor_Btn1 virtActTrigger: Wandtaster1_Btn_01
2015-01-31 14:23:42 CUL_HM virtueller_Aktor_Btn1 virtActTrigType: long_Release
2015-01-31 14:23:42 CUL_HM virtueller_Aktor_Btn1 virtActTrigRpt: 3
2015-01-31 14:23:42 CUL_HM virtueller_Aktor_Btn1 virtActTrigNo: 80
2015-01-31 14:23:43 CUL_HM Wandtaster1 CMDs_done
2015-01-31 14:23:43 CUL_HM Wandtaster1 CMDs_done
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

nesges

#5
Mir ist noch nicht ganz klar, was du machen willst.

a) Du willst zwischen kurzem und langem drücken unterscheiden
oder
b) Das hat mit dem kurzen drücken gar nichts zu tun, du willst ein langes drücken, das länger als 3s dauert von einem langen drücken, das weniger als 3s dauert unterscheiden
oder
c) Du willst auf ein kurzes drücken, dem innerhalb von 3s ein langes drücken folgt reagieren
oder
d) ?

Fall a ist trivial mit notify zu lösen. Fall b ist evtl. lösbar, wenn der Schalter während dem halten kontinuierlich Events auslöst. Fall c ist ein typischer Fall für einen watchdog.

ToM_ToM

Okay, sorry dass ich mich zu sehr aufs Reading gestürzt hatte, ohne mein Ziel näher zu beschreiben.
In meine Fall wäre es FAll B.

Ich möchte, wenn ich den Taster für 3 Sekunden gedrückt halte, dass dann ein Event auslöst (z.B. Lampe 50 % Helligkeit).
Wenn ich den Taster aber für 5 Sekunden gedrückt halte, soll ein anderes Event ausgelöst werden (z.B. Lampe 100 % Helligkeit)

Oder eine andere Möglichkeit wäre eine Dimmfunktion. Diese hatte ich folgendermaßen versucht, zu lösen:
#define Wandtaster1_DimmUP notify virtueller_Aktor_Btn1 { my $virtActTrigRpt= ReadingsVal("virtueller_Aktor_Btn1", "virtActTrigRpt", 0);; my $trigType = ReadingsVal("virtueller_Aktor_Btn1", "virtActTrigType", "");; my $pctCurrent= ReadingsVal("HUEDevice3", "pct", 0);; my $pctNew = $pctCurrent+5;; if ($trigType eq "long" && $pctNew <= 100) { fhem("set HUEDevice3 pct $pctNew");;} }

#define Wandtaster1_DimmDown notify virtueller_Aktor_Btn2 { my $virtActTrigRpt= ReadingsVal("virtueller_Aktor_Btn2", "virtActTrigRpt", 0);; my $trigType = ReadingsVal("virtueller_Aktor_Btn2", "virtActTrigType", "");; my $pctCurrent= ReadingsVal("HUEDevice3", "pct", 0);; my $pctNew = $pctCurrent-5;; if ($trigType eq "long" && $pctNew >= 0) { fhem("set HUEDevice3 pct $pctNew");;} }


Dies funktioniert so aber leider auch nicht. Denn sobald ich den Taster nach 3 Sekunden loslasse, hängen anscheinend noch jede Menge Events in der Queue, die den Dimm-Vorgang noch eine ganze Weile fortsetzen.
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

nesges

Traditionell würde ich so ansetzen:
  • 1 Dummy zum merken ob Long/Nicht Long; Standardwert "Long"
  • 1 watchdog der nach dem long-Event 3 Sekunden auf ein weiteres long-Event horcht und ansonsten den Dummy auf "Nicht Long" setzt
  • 1 notify das nach dem ersten long-Event 4 Sekunden wartet, prüft ob der Dummy "Long" ist (http://fhem.de/commandref_DE.html#IF), entsprechende Aktionen ausführt und den Dummy zurück setzt
Sehr wahrscheinlich kann das Modul DOIF (http://fhem.de/commandref_DE.html#DOIF) das allerdings wesentlich einfacher. Damit habe ich mich allerdings selbst noch nicht befasst. Von daher würde ich den folgenden (ungetesten, unfertigen!) Ansatz nicht zur Nutzung, sondern nur als Idee vorschlagen:

define BTN1_LONG dummy
set BTN1_LONG = 1

define BTN1WATCH watchdog <longevent> 00:00:03 SAME set BTN1_LONG 0

define BTN1ACTION notify <longevent> sleep 4;IF ([BTN1_LONG]) ( <long_action> ) ELSE ( <notlong_action>; set BTN1_LONG 1 )


ToM_ToM

Hey vielen Dank, du hast mein Wochenende gerettet.  :D
DOIF war das entscheidene Schlüsselwort mit dem du mir weitergeholfen hast.

define TestDOIF DOIF ([virtueller_Aktor_Btn1:virtActTrigType] eq "long") (set HUEDevice3 pct 50)
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

nesges

Zitat von: ToM_ToM am 31 Januar 2015, 19:51:38
define TestDOIF DOIF ([virtueller_Aktor_Btn1:virtActTrigType] eq "long") (set HUEDevice3 pct 50)

Cool, wie einfach's damit geht. Muss ich mir mal vornehmen :)

ToM_ToM

Ja, DOIF ist echt genial. Das ist genau das was ich die ganze Zeit gesucht habe. Damit konnte ich jetzt auch das umsetzen was ich wollte.
Anbei die komplette Lösung  :)

#Schlafzimmer-Lampe anschalten
define SZ_Lampe_ON DOIF ([virtueller_Aktor_Btn1:?ON|OFF] and [virtueller_Aktor_Btn1:virtActTrigType] eq "short_Release" and [HUEDevice1:pct] == 0) (set HUEDevice1 rgb 0D0B06 : pct 5)
attr SZ_Lampe_ON room Schlafzimmer

#Schlafzimmer-Lampe ausschalten
define SZ_Lampe_OFF DOIF ([virtueller_Aktor_Btn2:?ON|OFF] and [virtueller_Aktor_Btn2:virtActTrigType] eq "short_Release" and [HUEDevice1:pct] > 0) (set HUEDevice1 pct 0 )
attr SZ_Lampe_OFF room Schlafzimmer

#Schlafzimmer-Lampe Dimm heller
define SZ_Lampe_DimmUp DOIF ([virtueller_Aktor_Btn1:virtActTrigType] eq "long" and [HUEDevice1:pct] < 100) (set HUEDevice1 pct {([HUEDevice1:pct]+5)} )
attr SZ_Lampe_DimmUp do always
attr SZ_Lampe_DimmUp room Schlafzimmer

#Schlafzimmer-Lampe Dimm dunkler
define SZ_Lampe_DimmDown DOIF ([virtueller_Aktor_Btn2:virtActTrigType] eq "long" and [HUEDevice1:pct] > 5) (set HUEDevice1 pct {([HUEDevice1:pct]-5)} )
attr SZ_Lampe_DimmDown do always
attr SZ_Lampe_DimmDown room Schlafzimmer


Vielleicht hilft es ja noch irgendwen weiter.
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8