Eckige Klammern schachteln / Reaktion auf Devices aus Reading

Begonnen von _Markus_, 01 Januar 2018, 15:25:54

Vorheriges Thema - Nächstes Thema

_Markus_

Hallo zusammen,

ich würde gerne auf Änderungen/Events eines Devices reagieren, dessen Namen ich in einem DOIF Reading gespeichert habe. In der commandRef und im Forum konnte ich bislang keine Lösung finden.


defmod test DOIF (Value([$SELF:P_device]) ne "off") (do something)
attr test uiTable WID([$SELF:P_device],[@""::AttrVal($name, "subType", "") =~ m/switch|dimmer/])


Das funktioniert natürlich nicht, da das DOIF nur getriggert wird, wenn sich das Reading P_device ändert - es ändert sich aber höchstens der Wert des entsprechenden Devices.

Ich sehe aktuell zwei Alternativen:

  • Eckige Klammern schachteln: [[$SELF:P_device]]
  • Auf sämtliche Events reagieren: [,,"] and Value([$SELF:P_device]) eq ...

Ersteres funktioniert aktuell nicht mit DOIF. Doppelt-eckige Klammern dienen Zeitangaben.
Zweiteres würde m.E. funktionieren, würde aber bedeuten, dass die Bedingung des DOIF bei jedem Event ausgewertet wird.

Fragen:

  • Kann Variante 2 ein Problem bzgl der Performance verursachen? Ich hätte etwa 20-30 solcher DOIFs.
  • Gibt es eine andere Möglichkeit für mein obiges Problem? Ziel ist, die DEF des DOIFs generisch zu halten.

Besten Dank!
Markus

Damian

Indirekte Readingangaben gibt es z. Zt. nicht. Eine sinnvolle Vorgehensweise ist es, sich ein Namenskonzept für seine Devices zu überlegen und diese über Regex anzugeben.

Die Angabe:

[@""::AttrVal($name, "subType", "")

ist bereits ein Ressourcenfresser, da du keine Regex für den Trigger angeben hast, daher wird bei jedem FHEM-Event diese Aggregationsfunktion ausgewertet. Hier würde ein Namenskonzept mit entsprechender Regex ebenfalls sinnvoll sein.


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

_Markus_

Hi Damian,

vielen Dank für den Hinweis! Ich habe nun die RegExps genauer spezifiziert. Es betrifft etwa 30 Devices (Licht), die in etwa 20 DOIFs ausgewertet werden sollen. Wenn das ganze funktioniert, werde ich alle (sehr ähnlichen) DOIFs umstellen.

Die indirekte Readingangabe habe ich nun über die DOIF_Readings gelöst. Das ganze möchte ich weitestgehend über das UI (uiTables) konfigurieren können. Die folgende Definition ist eine Template, die ich je DOIF kopiere.

defmod Licht_Timer_Template_DOIF DOIF ([$SELF:trgr] \
and Value([$SELF:P_master_device]) eq "on" \
and Value([$SELF:P_device]) ne "off"\
and [$SELF:P_enabled] eq "on")\
((attr $SELF wait 0,[$SELF:P_wait_timer]:0))\
(set [$SELF:P_device]:FILTER=STATE!=off off)\
\
DOELSEIF ([$SELF:P_device])\
({fhem("attr $SELF DOIF_Readings trgr:\x5b[$SELF:P_device]\x5d")},\
(attr $SELF wait 0,[$SELF:P_wait_timer]:0))
attr Licht_Timer_Template_DOIF DOIF_Readings trgr:[Bar]
attr Licht_Timer_Template_DOIF cmdState triggered|config
attr Licht_Timer_Template_DOIF disable 0
attr Licht_Timer_Template_DOIF do always
attr Licht_Timer_Template_DOIF event-on-change-reading .*
attr Licht_Timer_Template_DOIF group Licht Timer
attr Licht_Timer_Template_DOIF icon helper_doif
attr Licht_Timer_Template_DOIF room Lab
attr Licht_Timer_Template_DOIF selftrigger all
attr Licht_Timer_Template_DOIF stateFormat {sprintf("%s, %s: %s, wait: %s", \
AttrVal("$name","DOIF_Readings","???"),\
ReadingsVal("$name","P_device","n/a"),\
Value(ReadingsVal("$name","P_device","???")),\
AttrVal("$name","wait","???"))}
attr Licht_Timer_Template_DOIF uiTable WID([$SELF:P_master_device],[@"^Master_"])|\
WID([$SELF:P_device],[@"^Licht_"])|\
WID([$SELF:P_wait_timer],"select,60,300,900,1800,3600,7200,14400,19800,39600,79200")|\
WID([$SELF:P_enabled],"select,on,off")
attr Licht_Timer_Template_DOIF wait 0,3600:0


Siehst du da irgendwelche Performance Probleme auf mich zukommen?

Vielen Dank!
Markus

P.S.: BTW, kann man im select Widget eigentlich Lables für einzelnen Werte angeben? <option value=123>Label</option>

Damian

Zitat von: _Markus_ am 01 Januar 2018, 18:02:16
Hi Damian,

vielen Dank für den Hinweis! Ich habe nun die RegExps genauer spezifiziert. Es betrifft etwa 30 Devices (Licht), die in etwa 20 DOIFs ausgewertet werden sollen. Wenn das ganze funktioniert, werde ich alle (sehr ähnlichen) DOIFs umstellen.

Die indirekte Readingangabe habe ich nun über die DOIF_Readings gelöst. Das ganze möchte ich weitestgehend über das UI (uiTables) konfigurieren können. Die folgende Definition ist eine Template, die ich je DOIF kopiere.

defmod Licht_Timer_Template_DOIF DOIF ([$SELF:trgr] \
and Value([$SELF:P_master_device]) eq "on" \
and Value([$SELF:P_device]) ne "off"\
and [$SELF:P_enabled] eq "on")\
((attr $SELF wait 0,[$SELF:P_wait_timer]:0))\
(set [$SELF:P_device]:FILTER=STATE!=off off)\
\
DOELSEIF ([$SELF:P_device])\
({fhem("attr $SELF DOIF_Readings trgr:\x5b[$SELF:P_device]\x5d")},\
(attr $SELF wait 0,[$SELF:P_wait_timer]:0))
attr Licht_Timer_Template_DOIF DOIF_Readings trgr:[Bar]
attr Licht_Timer_Template_DOIF cmdState triggered|config
attr Licht_Timer_Template_DOIF disable 0
attr Licht_Timer_Template_DOIF do always
attr Licht_Timer_Template_DOIF event-on-change-reading .*
attr Licht_Timer_Template_DOIF group Licht Timer
attr Licht_Timer_Template_DOIF icon helper_doif
attr Licht_Timer_Template_DOIF room Lab
attr Licht_Timer_Template_DOIF selftrigger all
attr Licht_Timer_Template_DOIF stateFormat {sprintf("%s, %s: %s, wait: %s", \
AttrVal("$name","DOIF_Readings","???"),\
ReadingsVal("$name","P_device","n/a"),\
Value(ReadingsVal("$name","P_device","???")),\
AttrVal("$name","wait","???"))}
attr Licht_Timer_Template_DOIF uiTable WID([$SELF:P_master_device],[@"^Master_"])|\
WID([$SELF:P_device],[@"^Licht_"])|\
WID([$SELF:P_wait_timer],"select,60,300,900,1800,3600,7200,14400,19800,39600,79200")|\
WID([$SELF:P_enabled],"select,on,off")
attr Licht_Timer_Template_DOIF wait 0,3600:0


Siehst du da irgendwelche Performance Probleme auf mich zukommen?

Vielen Dank!
Markus

P.S.: BTW, kann man im select Widget eigentlich Lables für einzelnen Werte angeben? <option value=123>Label</option>

Schön zu sehen, dass die neuen Features bereits benutzt werden.

DOIF_Readings ist tatsächlich hier die optimale Lösung für indirekte Readingangaben.

Wait-Attribut zur Laufzeit setzen sollte eigentlich überflüssig sein, da man ja schon dynamisch/indirekt mit Readingangaben arbeiten kann. Das Setzen von Attributen ändert immer die Konfiguration - rotes Fragezeichen.

[@"^Licht_"] schränkt die Sache schon erheblich ein.

Es wird bei Widgets die FHEMWEB-Schnittstelle genutzt, was geht und nicht geht, muss man bei den Widgets selbst nachlesen - FHEMWEB-Widgets sind nicht meine Baustelle :)



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

_Markus_

Sind klasse Features! :)

Danke für den Wink zum wait via Readings. Das macht das ganze noch eleganter.

Ellert

ZitatP.S.: BTW, kann man im select Widget eigentlich Lables für einzelnen Werte angeben? <option value=123>Label</option>

Im select-Widget von FHEMWEB nicht. Da müsstest Du Dir etwas eigenes basteln und die Aktualisierung über DOIF-Syntax einbauen.

_Markus_

Hi Ellert,

Zitat von: Ellert am 02 Januar 2018, 20:38:12
Im select-Widget von FHEMWEB nicht. Da müsstest Du Dir etwas eigenes basteln und die Aktualisierung über DOIF-Syntax einbauen.

das habe ich:

my $wt = "[$SELF:P_wait_timer]";; my $mult = 1;;
$mult = 60*60 if(index($wt,"h")>-1);;
$mult = 60 if(index($wt,"m")>-1);;
$wt =~ s/\D//g;; $wt = $wt*$mult;;
fhem("attr $SELF wait $wt:1:1:1:1")

mit der WID
WID([$SELF:P_wait_timer],"select,1m,5m,15m,30m,1h,2h,4h,6h,12h,24h")

Das kann man natürlicht auch in ein Reading schrieben (siehe Hinweis von Damian).

VG