Wie im DOIF auf Internal-Array zugreifen?

Begonnen von FunkOdyssey, 15 März 2017, 15:14:19

Vorheriges Thema - Nächstes Thema

FunkOdyssey

Könnte mir bitte jemand einen Hinweis geben, wie man prüfen kann, ob in den Internals "Timed_onoff" gesetzt ist?

Internals:
   Readings:
     2017-03-15 14:10:18   reportedState   on
     2017-03-15 15:04:55   state           on
   Timed_onoff:
     CMD        on-for-timer
     DURATION   240
     NEXTCMD    off
     START      1489586695.08448
     START_FMT  2017-03-15 15:04:55


Folgende Vergleiche funktionieren nicht:
DOIF ([device:&Timed_onoff]) (foobar)

DOIF ([device:&Timed_onoff.CMD] eq "on-for-timer") (foobar)

DOIF ([device:&Timed_onoff->{CMD}] eq "on-for-timer") (foobar)

Geht das überhaupt irgendwie per DOIF-Syntax oder muss ich auf Perl-Funktion umschwenken?




Ich versuche herauszufinden, ob bei einem Z-Wave-Gerät das "on-for-timer" aktiv ist (Hintergrund-Thread).


Ellert

Eventuell geht es so

([<gerätename>] and $defs{<gerätename>}->{TIMED_ONOFF}{CMD}  eq "on-for-timer") (set ...)

wobei ich nicht weiss, ob TIMED_ONOFF die richtige Bezeichnung ist.

Da müsstest Du Dich mal über die Befehlszeile mit {join(",",keys %{$defs{<gerätename>}})} durch den Hash hangeln.

FunkOdyssey

Vielen Dank. Nach einigem Rumprobieren habe ich es scheinbar geschafft.

Wie gesagt: Das Ziel ist es, eine Lampe nur mit "on-for-timer" einzuschalten, wenn diese nicht vorher manuell eingeschaltet wurde.

Der Befehl...
{join(",",keys %{$defs{<gerätename>}})}
... ergab folgendes:
homeId,ZWaveSubDevice,.vclasses,ZWDongle_0_RAWMSG,ZWDongle_0_MSGCNT,LASTInputDev,TYPE,STATE,DEF,ZWDongle_0_TIME,nodeIdHex,TIMED_ONOFF,NAME,NR,endpointParent,TIMED_OnOff,isWakeUp,IODev,MSGCNT,READINGS


Das Ergebnis sieht dann wie folgt aus:


(
[bmelder:motion] =~ "on" and
(
[lampe:state] eq "off" or
[lampe:state] eq "on" and $defs{'lampe'}->{TIMED_OnOff}{CMD} eq "on-for-timer"
)
)
(
set lampe on-for-timer 300
)


Persönlich finde ich es eine Katatrophe, dass man bei Z-Wave nur auf komplizierter Art und Weise einen aktiven "on-for-timer" verlängern kann. Aber das ist eher Thema eines anderen Threads. :-)

So sieht es bei Homematic aus:

set hm_lampe:FILTER=state!=on on-for-timer 300

Damian

#3
Ich würde komplett auf den on-for-timer verzichten und definieren:

define di_lampe DOIF ([bmelder:motion] =~ "on")
(set lampe on)
(set lampe off)

attr di_lampe do resetwait
attr di_lampe wait 0,300


Der Vorteil dieser Lösung ist, dass bei Bewegung verlängert wird, ohne jedes mal zu senden und man muss sich nicht um die Interna irgendwelcher Module kümmern.

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

FunkOdyssey

Zitat von: Damian am 16 März 2017, 12:52:48
Ich würde komplett auf den on-for-timer verzichten und definieren:

define di_lampe DOIF ([bmelder:motion] =~ "on")
(set lampe on)
(set lampe off)

attr di_lampe do resetwait
attr di_lampe wait 0,300


Der Vorteil dieser Lösung ist, dass bei Bewegung verlängert wird, ohne jedes mal zu senden und man muss sich nicht um die Interna irgendwelcher Module kümmern.

Ich muss das Thema noch einmal aufgreifen. Ich habe diverse "on-for-timer" per DOIF ersetzt und bin bei dem obigen Beispiel direkt wieder über ein Problem gestolpert.

Wenn eine Lampe bereits zuvor eingeschaltet war, schaltet dieses DOIF die Lampe plötzlich unvermittelt aus.

Wenn ich in der Bedingung nun abfange, dass nur eingeschaltet werden soll, wenn die Lampe zuvor aus war, dann verliere ich den Charakter des "Timer verlängerns". Die Lampe müsste dann immer erst wieder ausgehen.

Ich befürchte, dass ich mir dazu ein Reading ablegen muss, um die Unterschiede der Einschaltungen (manuell dauer an,timer) abzufragen.

Damian

Zitat von: FunkOdyssey am 09 April 2017, 16:19:31
Ich befürchte, dass ich mir dazu ein Reading ablegen muss, um die Unterschiede der Einschaltungen (manuell dauer an,timer) abzufragen.

Das ist nicht erforderlich. Es reicht die Bedingung entsprechend zu erweitern:

define di_lampe DOIF ([bmelder:motion] =~ "on" and  ([lampe] ne "on" or $cmd == 1.1))
...

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

FunkOdyssey