HomeMatic: Defaultattribute setzen nach einem global:DEFINED

Begonnen von Lazgar, 11 September 2018, 07:06:18

Vorheriges Thema - Nächstes Thema

Lazgar

Hallo ihr Lieben!

Ich nutze FHEM schon einige Zeit und bin kein blutiger Anfänger mehr, aber hier komme ich nicht weiter...
Hab mir ein Notify gebaut welches beim anlegen eines Devices ein paar Attribute setzt.
Ein paar davon einfach bei jedem Gerät, einige Geräteabhängig...in meinem Fall HomeMatic Geräte.

Ich lese das jeweilige Model per AttrVal() aus und möchte, dem entsprechend, die Attribute setzen.
Leider bekomme ich bei der Abfrage immer den Defaultwert vom AttrVal() zurück und ich hab keine Ahnung warum.
Wenn ich den Befehl direkt im Befehlsfeld absetze geht es, im Notify jedoch nicht.

Bin schon ein bisschen am verzweifeln :/


defmod ntfy_Logik_System_Defaultattribute notify global:DEFINED.* {\
fhem("sleep 30;; attr $EVTPART1 event-on-change-reading .*;; attr $EVTPART1 room newDevice;;");;\
\
my $model = AttrVal($EVTPART1, "model", "na");;\
my $modelint = InternalVal($EVTPART1,"chanNo","na");;\
\
Log 1, $EVTPART1;;\
Log 1, $model;;\
Log 1, $modelint;;\
\
if ($model eq "HM-SEC-SCo")\
{\
fhem("attr $EVTPART1 autoReadReg 5_readMissing;; attr $EVTPART1 expert 251_anything;;");;\
fhem("attr $EVTPART1 group Fenster;; attr $EVTPART1 icon fts_window_1w_open;;");;\
fhem("attr $EVTPART1 devStateIcon open:fts_window_1w_open closed:fts_window_1w;;");;\
fhem("attr $EVTPART1 userattr winOpenMaxTrigger winOpenTimer winOpenTimer2 winOpenType:Fenster,Türe winOpenName;;");;\
fhem("attr $EVTPART1 winOpenMaxTrigger 2;; attr $EVTPART1 winOpenTimer 00:30:00;;");;\
fhem("attr $EVTPART1 winOpenType Fenster;; attr $EVTPART1 winOpenName $EVTPART1;;");;\
fhem("attr $EVTPART1 IOgrp System_Virtuelle_CCU");;\
fhem("set $EVTPART1 getConfig;;");;\
Log 1, "Defaultattribute für $model wurde gesetzt";;\
}\
elsif ($model eq "HM-LC-Sw1PBU-FM")\
{\
fhem("attr $EVTPART1 autoReadReg 5_readMissing;; attr $EVTPART1 expert 251_anything;;");;\
fhem("attr $EVTPART1 group Beleuchtung;; attr $EVTPART1 icon fa_lightbulb;;");;\
fhem("attr $EVTPART1 devStateIcon on:taster_ch_an_gruen off:taster_ch_aus_rot;; attr $EVTPART1 webCmd :;;");;\
fhem("attr $EVTPART1 IOgrp System_Virtuelle_CCU;;");;\
fhem("set $EVTPART1 getConfig;;");;\
Log 1, "Defaultattribute für $model wurde gesetzt";;\
}\
elsif ($model eq "HM-CC-RT-DN" and $modelint eq "na")\
{\
fhem("attr $EVTPART1 autoReadReg 5_readMissing;; attr $EVTPART1 expert 251_anything;;");;\
fhem("attr $EVTPART1 timestamp-on-change-reading battery;; attr $EVTPART1 IOgrp System_Virtuelle_CCU;;");;\
fhem("set $EVTPART1 getConfig;;");;\
Log 1, "Defaultattribute für $model wurde gesetzt";;\
}\
elsif ($model eq "HM-CC-RT-DN" and $modelint eq "04")\
{\
fhem("attr $EVTPART1 event-on-update-reading ValvePosition,desired-temp,measured-temp;;");;\
fhem("attr $EVTPART1 group Klima;; attr $EVTPART1 icon hm-cc-rt-dn;;");;\
fhem("attr $EVTPART1 stateFormat gemessen: measured-temp °C | wunsch: desired-temp °C;; attr $EVTPART1 webCmd :;;");;\
fhem("set $EVTPART1 getConfig;;");;\
Log 1, "Defaultattribute für $model wurde gesetzt";;\
}\
elsif ($model eq "HM-LC-SW2-FM" and $modelint eq "na")\
{\
fhem("attr $EVTPART1 autoReadReg 5_readMissing;; attr $EVTPART1 expert 251_anything;;");;\
fhem("attr $EVTPART1 IOgrp System_Virtuelle_CCU;;");;\
fhem("set $EVTPART1 getConfig;;");;\
Log 1, "Defaultattribute für $model wurde gesetzt";;\
}\
elsif ($model eq "HM-LC-SW2-FM" and $modelint ne "na")\
{\
fhem("attr $EVTPART1 expert 251_anything;;");;\
fhem("attr $EVTPART1 devStateIcon on:taster_ch_an_gruen off:taster_ch_aus_rot;; attr $EVTPART1 webCmd :;;");;\
fhem("attr $EVTPART1 group Beleuchtung;; attr $EVTPART1 icon fa_lightbulb;;");;\
fhem("set $EVTPART1 getConfig;;");;\
Log 1, "Defaultattribute für $model wurde gesetzt";;\
}\
}


Ist bestimmt nur irgendein dummer Fehler...

Danke schon mal im Voraus!

LG Lazgar

amenomade

Haben überhaupt die entspr. Devices ein Attribut "model"?
Wie sehen die Events aus, und was ergibt das "Log1 $EVTPART1"?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Lazgar

#2
Hallo.

Die Devices haben ein Attribut mit dem Namen "model". Über die Befehlszeile funktioniert die Abfrage {AttrVal("HM_56A4B9","model", "na")} auch problemlos.
Da bekomme ich ganz normal "HM-SEC-SCo" ausgegeben. Nur im Notify wird mir immer "na" zurückgegeben...

Mit autocreate wird mir das Gerät automatisch beim Pairen angelegt und sieht danach so aus:


defmod HM_56A4B9 CUL_HM 56A4B9
attr HM_56A4B9 IODev System_MaxCube
attr HM_56A4B9 IOgrp System_Virtuelle_CCU:System_MaxCube
attr HM_56A4B9 actCycle 002:50
attr HM_56A4B9 actStatus alive
attr HM_56A4B9 autoReadReg 4_reqStatus
attr HM_56A4B9 expert 2_raw
attr HM_56A4B9 firmware 1.0
attr HM_56A4B9 model HM-SEC-SCo
attr HM_56A4B9 serialNr OEQ0226369
attr HM_56A4B9 subType threeStateSensor


$EVTPART1 gibt mir den Namen des Devices zurück dass das Event ausgelöst hat... in meinem Fall "HM_56A4B9" (Optischer Fensterkontakt von HomeMatic)
Auszug aus dem Log:


2018.09.13 05:11:27 2: CUL_HM Unknown device HM_56A4B9 is now defined
2018.09.13 05:11:27 2: autocreate: define HM_56A4B9 CUL_HM 56A4B9
2018.09.13 05:11:27 5: Triggering ntfy_Logik_System_Defaultattribute
2018.09.13 05:11:27 4: ntfy_Logik_System_Defaultattribute exec {
my $model = AttrVal($EVTPART1,"model", "na");;
my $modelint = InternalVal($EVTPART1,"chanNo","na");;

Log 1, $EVTPART1;;
Log 1, $model;;
Log 1, $modelint;;

fhem("save;; sleep 30;; attr $EVTPART1 event-on-change-reading .*;; attr $EVTPART1 room newDevice;;");;

if ($model eq "HM-SEC-SCo")
{
fhem("attr $EVTPART1 autoReadReg 5_readMissing;; attr $EVTPART1 expert 251_anything;;");;
fhem("attr $EVTPART1 group Fenster;; attr $EVTPART1 icon fts_window_1w_open;;");;
fhem("attr $EVTPART1 devStateIcon open:fts_window_1w_open closed:fts_window_1w;;");;
fhem("attr $EVTPART1 userattr winOpenMaxTrigger winOpenTimer winOpenTimer2 winOpenType:Fenster,Türe winOpenName;;");;
fhem("attr $EVTPART1 winOpenMaxTrigger 2;; attr $EVTPART1 winOpenTimer 00:30:00;;");;
fhem("attr $EVTPART1 winOpenType Fenster;; attr $EVTPART1 winOpenName $EVTPART1;;");;
fhem("attr $EVTPART1 IOgrp System_Virtuelle_CCU");;
fhem("set $EVTPART1 getConfig;;");;
Log 1, "Defaultattribute für $model wurden gesetzt";;
}
elsif ($model eq "HM-LC-Sw1PBU-FM")
{
fhem("attr $EVTPART1 autoReadReg 5_readMissing;; attr $EVTPART1 expert 251_anything;;");;
fhem("attr $EVTPART1 group Beleuchtung;; attr $EVTPART1 icon fa_lightbulb;;");;
fhem("attr $EVTPART1 devStateIcon on:taster_ch_an_gruen off:taster_ch_aus_rot;; attr $EVTPART1 webCmd :;;");;
fhem("attr $EVTPART1 IOgrp System_Virtuelle_CCU;;");;
fhem("set $EVTPART1 getConfig;;");;
Log 1, "Defaultattribute für $model wurden gesetzt";;
}
elsif ($model eq "HM-CC-RT-DN" and $modelint eq "na")
{
fhem("attr $EVTPART1 autoReadReg 5_readMissing;; attr $EVTPART1 expert 251_anything;;");;
fhem("attr $EVTPART1 timestamp-on-change-reading battery;; attr $EVTPART1 IOgrp System_Virtuelle_CCU;;");;
fhem("set $EVTPART1 getConfig;;");;
Log 1, "Defaultattribute für $model wurden gesetzt";;
}
elsif ($model eq "HM-CC-RT-DN" and $modelint eq "04")
{
fhem("attr $EVTPART1 event-on-update-reading ValvePosition,desired-temp,measured-temp;;");;
fhem("attr $EVTPART1 group Klima;; attr $EVTPART1 icon hm-cc-rt-dn;;");;
fhem("attr $EVTPART1 stateFormat gemessen: measured-temp °C | wunsch: desired-temp °C;; attr $EVTPART1 webCmd :;;");;
fhem("set $EVTPART1 getConfig;;");;
Log 1, "Defaultattribute für $model wurden gesetzt";;
}
elsif ($model eq "HM-LC-SW2-FM" and $modelint eq "na")
{
fhem("attr $EVTPART1 autoReadReg 5_readMissing;; attr $EVTPART1 expert 251_anything;;");;
fhem("attr $EVTPART1 IOgrp System_Virtuelle_CCU;;");;
fhem("set $EVTPART1 getConfig;;");;
Log 1, "Defaultattribute für $model wurden gesetzt";;
}
elsif ($model eq "HM-LC-SW2-FM" and $modelint ne "na")
{
fhem("attr $EVTPART1 expert 251_anything;;");;
fhem("attr $EVTPART1 devStateIcon on:taster_ch_an_gruen off:taster_ch_aus_rot;; attr $EVTPART1 webCmd :;;");;
fhem("attr $EVTPART1 group Beleuchtung;; attr $EVTPART1 icon fa_lightbulb;;");;
fhem("set $EVTPART1 getConfig;;");;
Log 1, "Defaultattribute für $model wurden gesetzt";;
}
}
2018.09.13 05:11:27 1: HM_56A4B9
2018.09.13 05:11:27 1: na
2018.09.13 05:11:27 1: na


LG Lazgar

Otto123

Moin,

ich behaupte mal: Das Anlegen des Gerätes während des Pairings und autocreate ist ein Prozess der etwas dauert. Der trigger des notify und der Versuch des Auslesens des Attributes kommt einfach zu früh. Da existiert das Attribute noch nicht.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Lazgar

Daran dachte ich auch...

Zum einen habe ich geglaubt, es hätte etwas damit zu tun dass sowohl das Gerät als auch die Attribute noch nicht in der Konfig stehen.
Also hab ich es vorab mit einem {fhem("save");} probiert.

Dann natürlich auch, dass er noch gar nicht wirklich mit dem anlegen fertig ist und deshalb das Attribut noch gar nicht vorhanden ist...
Aber auch ein Sleep 30 hat nicht geholfen. Im ersten Post sieht man, dass ich gleich nach dem Aufruf 30 Sekunden warte...

Es ist wirklich sehr seltsam, ich mache das Pairing, Frage das Attribut ab über die Befehlszeile was ja funktioniert.
Nach ablauf des Sleep 30 macht das Notify dieselbe Abfrage nochmal was dann aber nicht funktioniert.

Otto123

#5
Erstens bedeutet: "steht in der config" nicht, dass es in der fhem.cfg steht! Die config liest fhem aus dem Speicher! Nur beim Start (oder gezielten Aktionen) wird die config neu gelesen.

Zweitens: diese Zeile
fhem("sleep 30;; attr $EVTPART1 event-on-change-reading .*;; attr $EVTPART1 room newDevice;;");;\hält keines Wegs dein Script für 30 sec an.
Es erzeugt ein at mit 30 sec in dem die beiden Befehle ausgeführt werden. Alles andere wird sofort weiter abgearbeitet!

Du müsstest also mit dem event ein at erzeugen, welches dann deinen Perl Code einfach aus der 99_myUtils aufruft. $EVTPART1 nimmst Du als Übergabe Parameter.
Das könnte gehen.  :-\

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Lazgar


Otto123

Du könntest Dir meine These bestätigen, in dem Du einfach vor dem Befehl mit sleep 30 ein Log setzt.
{
Log 1, "Anfang";;
fhem("sleep 30;; attr $EVTPART1 event-on-change-reading .*;; attr $EVTPART1 room newDevice;;");;
Log 1, "Ende"
}


Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Lazgar

Ich brauch da keine Bestätigung, ich vertraue da auf das Wort eines Profis :)
Hab mir das ganze auch schon umgebaut (myUtils) und werde es testen sobald ich wieder Zuhause bin.

Danke für die Unterstützung!