[geklärt] AttrTemplate und prereq

Begonnen von Beta-User, 12 Dezember 2019, 18:02:11

Vorheriges Thema - Nächstes Thema

Beta-User

Hallo Rudi,

habe grade versucht, die Umstellungstemplates für Tasmota/jsonMap mal zu testen.

Irgendwie habe ich wohl prereq nicht verstanden. Du hattest mal geschrieben, dass "die Zeilen ab hier" dann nicht mehr ausgeführt werden, wenn das nicht paßt. Tatsächlich scheint es aber so zu sein, dass das betr. attrTemplate gar nicht verfügbar ist... Jedenfalls ist die Zählweise im Log eine andere, wenn ich "initialize" ausführe mit und ohne auskommentiertem prereq: in der aktuellen Fassung:

name:tasmota_use_state_jsonmap
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).*
desc:Applies to all tasmota devices with switchable channel<br>NOTE: This template will change main channel info from POWER1 to state reading.
order:A_01zx
par:READINGLIST;Replace simple json2nameValue code by JSONMAP variant;{ AttrVal("DEVICE","readingList","") =~ m/RESULT:.* { json2nameValue($EVENT) }/RESULT:.* { json2nameValue($EVENT,'',$JSONMAP) }/g }
par:NEWJSONMAP;add JSONMAP entry for POWER1;{ AttrVal("DEVICE","jsonMap","POWER1:state") =~ m/POWER1:[^ ]+/POWER1:state/g }
par:NEWSTATEFORMAT;replace POWER1 by state;{ AttrVal("DEVICE","stateFormat","POWER1") =~ m/POWER1/state/g }
par:LASTSTATE;Value of POWER1 reading;{ ReadingsVal("DEVICE","POWER1","") }
attr DEVICE jsonMap NEWJSONMAP
attr DEVICE readingList READINGLIST
attr DEVICE stateFormat NEWSTATEFORMAT
deletereading -q DEVICE POWER1
setreading DEVICE state LASTSTATE
#prereq:{ AttrVal("DEVICE","stateFormat","") eq "state" ? "1" : "0" }
deleteattr DEVICE stateFormat


name:tasmota_use_state_POWER1
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).*
desc:Applies to all tasmota devices with switchable channel<br>NOTE: This template will change main channel back to POWER1 from state reading.
order:A_01zy
par:NEWJSONMAP;delete JSONMAP entry for POWER1;{ AttrVal("DEVICE","jsonMap","POWER1:state") =~ m/POWER1:state//g }
par:NEWSTATEFORMAT;replace state by POWER1;{ AttrVal("DEVICE","stateFormat","state") =~ m/state/POWER1/g }
par:LASTSTATE;Value of state reading;{ ReadingsVal("DEVICE","state","") }
attr DEVICE jsonMap NEWJSONMAP
attr DEVICE readingList READINGLIST
attr DEVICE stateFormat NEWSTATEFORMAT
deletereading -q DEVICE state
setreading DEVICE POWER1 LASTSTATE
#prereq:{ AttrVal("DEVICE","jsonMap","") =~ m,[:],g ? "1" : "0" }
deleteattr DEVICE jsonMap

Wäre schon schön, wenn das feature "prereq:" funktionieren würde wie oben dargestellt.

Gruß, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

rudolfkoenig

Ich gehe davon aus, dass du meine ins Fhem-Wiki aufgenommene Erklaerung im Kopf hast:
Zitatprereq: ist entweder ein Perl-Ausdruck {}, oder ein devspec2array, was genau ein Gerät spezifiziert. Wird beim Einlesen des template Files ausgeführt. Falls nicht wahr ist, werden die darauffolgenden Zeilen des Template nicht ausgeführt. Ist für sowas wie "setze zusätzlich Attribut XY falls die Installation HomeAssistant kennt" gedacht.
Ich habe da wohl geschlampt, und prereq: mit option: vermischt.

Genauer ist die Erklaerung hier:
https://forum.fhem.de/index.php/topic,99195.msg925952.html#msg925952:
Zitat- prereq:XXX
  Falls XXX den Form {.*} hat, wird sie mit AnalyzePerlCommand evaluiert, und muss 1 zurueckliefern, sonst ist XXX ein devspec, und muss ein Geraet finden.
  Falls mindestens ein prereq existiert, was nicht zutrifft, wird das betroffene Template aus dem Speicher entfernt.
  Die Auswertung erfolgt beim FHEM Start oder bei {AttrTemplate_Initialize()}, da devspec bei grossen Installationen fuer die Bestimmung der moeglichen Befehle zu teuer ist.

- option:XXX 
  Fuer die XXX Spec siehe prereq
  Die Auswertung erfolgt (im Unterschied zu prereq) beim Ausfuehren des attrTemplate Befehls, da devspec in diesem Fall nicht so teuer ist
  Die auf option: folgende Template-Befehle werden nur dann ausgefuehrt, falls die Bedingung wahr ist.
  Es koennen beliebig viele option: Zeilen pro Template vorhanden sein, die Letzte ersetzt(!) die Vorherige (also keine Verschachtelung).
  option wieder "ausschalten" kann man mit option:{1} oder option:global

Beta-User

 ;D , jep, das war die Fundstelle; hab's im Wiki gleich ergänzt...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors