mqtt2.template: Contributing

Begonnen von Beta-User, 15 Dezember 2018, 11:45:40

Vorheriges Thema - Nächstes Thema

Beta-User

Vorab: wir sollten die Diskussion zu Instar bitte dann ab jetzt auslagern, einfach neuen Post in diesem Forenbereich aufmachen.
Zitat von: ToM_ToM am 22 Juni 2020, 08:48:12
Wenn du eine Idee hast, wie... An den normalen Werten hängt sonst immer "val" am Ende dran was ich nicht so schön finde. Deshalb habe ich jsonmap verwendet.
Habe hier mal ein kleines Beispiel gepostet, wie man jsonMap nutzen kann, um "sinnvolle" (?) Readingnamen zu generieren: https://forum.fhem.de/index.php/topic,112246.msg1066633.html#msg1066633. Mit ":0" kann man auch unnützes Zeug ignorieren lassen.


ZitatJa, das ist die Original Firmware. Die hat zwar aktuell noch wifi led und power led per mqtt vertauscht, aber das habe ich bereits an Instar gemeldet.
OK, dann muß ich die Sortierung noch anfassen (Quellenangabe fehlt auch noch).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

ToM_ToM

Hallo Beta-User,

anbei das aktualisierte Template. Es gibt ein paar neue Funktionen. Außerdem habe ich das Attribut eventMap entfernt da es nicht ganz sauber funktioniert hat.
Instar ist sich leider über boolesche Werte nicht einig, ob sie 0/1 oder off/on verwenden.

Hier mal ein Beispiel aus dem Instar MQTT-Wiki von Instar:

alarm/actions/alarmout {"val":"off"}, {"val":"on"}
alarm/actions/alarmin {"val":"0"}, {"val":"1"}


Quelle: https://wiki.instar.de/Erweitert/INSTAR_MQTT_Broker/MQTT_API/


###########################################
# Instar 8015HD.
# contributed by ToM_ToM
#source post: https://forum.fhem.de/index.php/topic,94495.msg1065779.html#msg1065779

name:InstarCam
filter:TYPE=MQTT2_DEVICE
desc:for Instar Camera, source post: https://forum.fhem.de/index.php/topic,94495.msg1065779.html#msg1065779.<br>NOTE: This is an early version, developed for Instar 8015 HD. Other models may need different settings.
order:M_10
par:DEVNAME;MAC address in the topic;{ AttrVal("DEVICE","readingList","") =~ m,instar/([^/]*)/, ? $1 : undef }

attr DEVICE jsonMap area1val:area1 area1sensitivityval:area1sensitivity area2val:area2 area2sensitivityval:area2sensitivity area3val:area3 area3sensitivityval:area3sensitivity area4val:area4 area4sensitivityval:area4sensitivity pirval:pir alarmserverval:alarmserver alarmserver_ipval:alarmserver_ip alarmserver_portval:alarmserver_port alarmserver_pathval:alarmserver_path camera_ipval:camera_ip alarmsignalval:alarmsignal audioalarmval:audioalarm audioalarmsensitivityval:audioalarmsensitivity power_ledval:power_led wifi_ledval:wifi_led alarminval:alarmin alarminmodeval:alarminmode alarmoutval:alarmout emailval:email snapshot2sdval:snapshot2sd snapshot2ftpval:snapshot2ftp alarmsnapshots2emailval:alarmsnapshots2email alarmsnapshots2email_qtyval:alarmsnapshots2email_qty snapshot2sdval:snapshot2sd alarmsnapshots2sd_qtyval:alarmsnapshots2sd_qty snapshot2ftpval:snapshot2ftp alarmsnapshots2ftp_qtyval:alarmsnapshots2ftp_qty video2sdval:video2sd video2ftpval:video2ftp videolengthval:videolength

attr DEVICE readingList instar/DEVNAME/status/alarm/actions/pir/enable:.* { json2nameValue($EVENT, 'pir', $JSONMAP) }\
  instar/DEVNAME/status/alarm/area1/enable:.* { json2nameValue($EVENT, 'area1', $JSONMAP) }\
  instar/DEVNAME/status/alarm/area1/sensitivity:.* { json2nameValue($EVENT, 'area1sensitivity', $JSONMAP) }\
  instar/DEVNAME/status/alarm/area2/enable:.* { json2nameValue($EVENT, 'area2', $JSONMAP) }\
  instar/DEVNAME/status/alarm/area2/sensitivity:.* { json2nameValue($EVENT, 'area2sensitivity', $JSONMAP) }\
  instar/DEVNAME/status/alarm/area3/enable:.* { json2nameValue($EVENT, 'area3', $JSONMAP) }\
  instar/DEVNAME/status/alarm/area3/sensitivity:.* { json2nameValue($EVENT, 'area3sensitivity', $JSONMAP) }\
  instar/DEVNAME/status/alarm/area4/enable:.* { json2nameValue($EVENT, 'area4', $JSONMAP) }\
  instar/DEVNAME/status/alarm/area4/sensitivity:.* { json2nameValue($EVENT, 'area4sensitivity', $JSONMAP) }\
  instar/DEVNAME/status/alarm/alarmserver/enable:.* { json2nameValue($EVENT, 'alarmserver', $JSONMAP) }\
  instar/DEVNAME/status/alarm/alarmserver/address:.* { json2nameValue($EVENT, 'alarmserver_ip', $JSONMAP) }\
  instar/DEVNAME/status/alarm/alarmserver/port:.* { json2nameValue($EVENT, 'alarmserver_port', $JSONMAP) }\
  instar/DEVNAME/status/alarm/alarmserver/path:.* { json2nameValue($EVENT, 'alarmserver_path', $JSONMAP) }\
  instar/DEVNAME/status/network/config/ipaddr:.* { json2nameValue($EVENT, 'camera_ip', $JSONMAP) }\
  instar/DEVNAME/status/alarm/actions/alarmsignal:.* { json2nameValue($EVENT, 'alarmsignal', $JSONMAP) }\
  instar/DEVNAME/status/alarm/actions/audioalarm:.* { json2nameValue($EVENT, 'audioalarm', $JSONMAP) }\
  instar/DEVNAME/status/alarm/actions/audioalarmsensitivity:.* { json2nameValue($EVENT, 'audioalarmsensitivity', $JSONMAP) }\
  instar/DEVNAME/status/alarm/actions/alarmin:.* { json2nameValue($EVENT, 'alarmin', $JSONMAP) }\
  instar/DEVNAME/status/alarm/actions/alarminmode:.* { json2nameValue($EVENT, 'alarmin', $JSONMAP) }\
  instar/DEVNAME/status/alarm/actions/alarmout:.* { json2nameValue($EVENT, 'alarmout', $JSONMAP) }\
  instar/DEVNAME/status/alarm/actions/email:.* { json2nameValue($EVENT, 'alarmsnapshots2email', $JSONMAP) }\
  instar/DEVNAME/status/alarm/actions/alarmsnapshots/email:.* { json2nameValue($EVENT, 'alarmsnapshots2email_qty', $JSONMAP) }\
  instar/DEVNAME/status/alarm/actions/snapshot2sd:.* { json2nameValue($EVENT, 'snapshot2sd', $JSONMAP) }\
  instar/DEVNAME/status/alarm/actions/alarmsnapshots/sd:.* { json2nameValue($EVENT, 'alarmsnapshots2sd_qty', $JSONMAP) }\
  instar/DEVNAME/status/alarm/actions/snapshot2ftp:.* { json2nameValue($EVENT, 'snapshot2ftp', $JSONMAP) }\
  instar/DEVNAME/status/alarm/actions/alarmsnapshots/ftp:.* { json2nameValue($EVENT, 'alarmsnapshots2ftp_qty', $JSONMAP) }\
  instar/DEVNAME/status/alarm/actions/video2sd:.* { json2nameValue($EVENT, 'video2sd', $JSONMAP) }\
  instar/DEVNAME/status/alarm/actions/alarm/actions/video2ftp:.* { json2nameValue($EVENT, 'video2ftp', $JSONMAP) }\
  instar/DEVNAME/status/alarm/actions/videolength:.* { json2nameValue($EVENT, 'videolength', $JSONMAP) }\
  instar/DEVNAME/status/features/indicator/power:.* { json2nameValue($EVENT, 'power_led', $JSONMAP) }\
  instar/DEVNAME/status/features/indicator/wifi:.* { json2nameValue($EVENT, 'wifi_led', $JSONMAP) }
attr DEVICE setList pir:0,1 instar/DEVNAME/alarm/actions/pir/enable/raw $EVTPART1\
  area1:0,1 instar/DEVNAME/alarm/area1/enable/raw $EVTPART1\
  area1sensitivity:slider,1,1,100 instar/DEVNAME/alarm/area1/sensitivity/raw $EVTPART1\
  area2:0,1 instar/DEVNAME/alarm/area2/enable/raw $EVTPART1\
  area2sensitivity:slider,1,1,100 instar/DEVNAME/alarm/area2/sensitivity/raw $EVTPART1\
  area3:0,1 instar/DEVNAME/alarm/area3/enable/raw $EVTPART1\
  area3sensitivity:slider,1,1,100 instar/DEVNAME/alarm/area3/sensitivity/raw $EVTPART1\
  area4:0,1 instar/DEVNAME/alarm/area4/enable/raw $EVTPART1\
  area4sensitivity:slider,1,1,100 instar/DEVNAME/alarm/area4/sensitivity/raw $EVTPART1\
  alarmserver:on,off instar/DEVNAME/alarm/alarmserver/enable/raw $EVTPART1\
  alarmsignal:on,off instar/DEVNAME/alarm/actions/alarmsignal/raw $EVTPART1\
  audioalarm:0,1 instar/DEVNAME/alarm/actions/audioalarm/raw $EVTPART1\
  audioalarmsensitivity:slider,10,10,100 instar/DEVNAME/alarm/actions/audioalarmsensitivity/raw $EVTPART1\
  alarmin:0,1 instar/DEVNAME/alarm/actions/alarmin/raw $EVTPART1\
  alarminmode:0,1 instar/DEVNAME/alarm/actions/alarminmode/raw $EVTPART1\
  alarmout:on,off instar/DEVNAME/alarm/actions/alarmout/raw $EVTPART1\
  email:on,off instar/DEVNAME/alarm/actions/email/raw $EVTPART1\
  alarmsnapshots2email_qty:slider,0,1,15 instar/DEVNAME/alarm/actions/alarmsnapshots/email/raw $EVTPART1\
  snapshot2sd:on,off instar/DEVNAME/alarm/actions/snapshot2sd/raw $EVTPART1\
  alarmsnapshots2sd_qty:slider,0,1,15 instar/DEVNAME/alarm/actions/alarmsnapshots/sd/raw $EVTPART1\
  snapshot2ftp:on,off instar/DEVNAME/alarm/actions/snapshot2ftp/raw $EVTPART1\
  alarmsnapshots2ftp_qty:slider,0,1,15 instar/DEVNAME/alarm/actions/alarmsnapshots/ftp/raw $EVTPART1\
  video2sd:on,off instar/DEVNAME/alarm/actions/video2sd/raw $EVTPART1\
  videolength:slider,15,15,60 instar/DEVNAME/alarm/actions/videolength/raw $EVTPART1\
  power_led:on,off instar/DEVNAME/features/indicator/power/raw $EVTPART1\
  wifi_led:on,off instar/DEVNAME/features/indicator/wifi/raw $EVTPART1
attr DEVICE model InstarCam
setreading DEVICE attrTemplateVersion 20200628
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

Otto123

Hi,

ich habe mal das Worx Landroid Template neu gemacht.
desc wie gewünscht gemacht ;)
Neue Features eingebaut die bei den 2019 Modellen und der aktuellen Firmware 3.13 greifen:
- ad Hoc Kantenschnitt
- ad Hoc Rasenmähen für xx minuten
- Party modus für xx minuten

name:worx_landroid
desc:Template for a Worx Landroid mower.<br>The complete Setup is described in this <a href="https://forum.fhem.de/index.php/topic,111959.0.html">Forum Thread</a><br>Some Features requires support by model and firmware!
filter:TYPE=MQTT2_DEVICE
order:X_05
par:BASE_TOPIC;base topic: the Mower BoardID (2019: PRM100);{ AttrVal("DEVICE","devicetopic",AttrVal("DEVICE","readingList","")) =~ m,[\b]?([^\/:]+)[\/].+, ? $1 : undef }
par:DEV_ID;the MAC of the Mower (Device Info);{ AttrVal("DEVICE","readingList","") =~ m,[^\/]+[\/]([0-9A-Z]+)[\/]commandOut:.*, ? $1 : undef }
par:ICON;ICON as set, defaults to audio_volume_low;{ AttrVal("DEVICE","icon","scene_robo_lawnmower") }
attr DEVICE icon ICON
attr DEVICE readingList BASE_TOPIC/DEV_ID/commandOut:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr DEVICE jsonMap dat_rsi:wifiQuality dat_fw:firmware cfg_sn:SerialNumber\
dat_le:mowerErrorIndex dat_ls:mowerStatusIndex\
cfg_rd:mowerRainDelay cfg_sc_m:mowerActiveIndex cfg_sc_p:mowerTimeCorrection\
dat_bt_t:batteryTemperature dat_bt_v:batteryVoltage dat_bt_p:batteryPercent dat_bt_nr:batteryChargeCycle dat_bt_c:batteryCharging\
dat_st_b:bladeTimeCounter dat_st_d:totalDistance dat_st_wt:totalTime\
dat_dmp_1:directionPitch dat_dmp_2:directionRoll dat_dmp_3:directionYaw
attr DEVICE setList mowerRainDelay:slider,0,30,1440 BASE_TOPIC/DEV_ID/commandIn {"rd":$EVTPART1}\
  mowerTimeCorrection:slider,-100,1,100 BASE_TOPIC/DEV_ID/commandIn {"sc":{"p":$EVTPART1}}\
  startBorderCut:noArg BASE_TOPIC/DEV_ID/commandIn {"sc":{"ots":{"bc":1,"wtm":0}}}\
  startOneTime:slider,10,10,720 BASE_TOPIC/DEV_ID/commandIn {"sc":{"ots":{"bc":0,"wtm":$EVTPART1}}}\
  startParty:slider,60,60,2880 BASE_TOPIC/DEV_ID/commandIn {"sc":{"distm":$EVTPART1}}\
  startMower:noArg BASE_TOPIC/DEV_ID/commandIn {"cmd":1}\
  pauseMower:noArg BASE_TOPIC/DEV_ID/commandIn {"cmd":2}\
  stopMower:noArg BASE_TOPIC/DEV_ID/commandIn {"cmd":3}\
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(BASE_TOPIC/DEV_ID/commandIn $payload)}
attr DEVICE userReadings mowerActive:mowerActiveIndex.* {ReadingsVal($name,"mowerActiveIndex","0") ? "true" : "false"},\
mowerStatusTxt:mowerStatusIndex.* {my %stateCodes = (\
0 => "Idle",\
1 => "Home",\
2 => "Start sequence",\
3 => "Leaving home",\
4 => "Follow wire",\
5 => "Searching home",\
6 => "Searching wire",\
7 => "Mowing",\
8 => "Lifted",\
9 => "Trapped",\
10 => "Blade blocked",\
11 => "Debug",\
12 => "Remote control",\
30 => "Going home",\
31 => "Zone Training",\
32 => "Edge cutting",\
33 => "Searching zone",\
34 => "Pause"\
); $stateCodes{ReadingsVal($name,"mowerStatusIndex","0")}},\
mowerErrorTxt:mowerErrorIndex.* { my %errorCodes = (\
0 => "No error",\
1 => "Trapped",\
2 => "Lifted",\
3 => "Wire missing",\
4 => "Outside wire",\
5 => "Raining",\
6 => "Close door to mow",\
7 => "Close door to go home",\
8 => "Blade motor blocked",\
9 => "Wheel motor blocked",\
10 => "Trapped timeout",\
11 => "Upside down",\
12 => "Battery low",\
13 => "Reverse wire",\
14 => "Charge error",\
15 => "Timeout finding home",\
16 => "Mower locked",\
17 => "Battery temp out of range"\
); $errorCodes{ReadingsVal($name,"mowerErrorIndex","0")}}
attr DEVICE model worx_landroid_mover
setreading DEVICE attrTemplateVersion 20200701


ich hoffe das passt so :)

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

Beta-User

...ist drin; die desc: habe ich geringfügig überarbeitet, hoffe, das paßt so ;) ?

@ToM_ToM: dein Vorschlag ist schon länger drin, auch wenn das mapping vermutlich noch knapper gehalten werden könnte, ist aber nicht tragisch...
Falls du das mit 0/1 zu on/off vereinheitlichen wolltest: das 6-fach-Ethernet-board hat da was im Angebot für true/false, das sich leicht übertragen lassen sollte ;) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Otto123

Zitat von: Beta-User am 01 Juli 2020, 16:49:13
...ist drin; die desc: habe ich geringfügig überarbeitet, hoffe, das paßt so ;) ?
Ach man ich wollte ein Lob das ich das so schön gemacht habe. Naja kleine Kritik ist Lob genug ;)

Nein nur Spaß - hast Du gut überarbeitet. Danke :)
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

OppiM

Hi,

Ich hab mich mal an einem Template für einen Tasmota Tür/Fensterkontakt versucht (https://templates.blakadder.com/TYMC-1.html).

# tasmota battery powered window sensor MC400A
name:tasmota_window_MC400A
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).*
desc:Configures a MC400A windows sensor
order:A_05c
attr DEVICE icon tuer_fenster_kontakt
attr DEVICE jsonMap TuyaReceived_Cmnd:0 TuyaReceived_CmndData:0 TuyaReceived_Data:0
attr DEVICE autocreate 0
par:IO_DEV;Currently used IO;{ AttrVal("DEVICE","IODev",undef)}
par:CMNDTOPIC;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}cmnd$3" : undef }
par:TELETOPIC;info topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}tele$3" : undef }
par:STATTOPIC;ack topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}stat$3" : undef }
set IO_DEV publish CMNDTOPIC/Backlog Template {"NAME":"MC400A","GPIO":[0,107,0,108,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}; Module 0; SetOption1 1; SetOption65 1; SetOption66 1; SwitchMode 1; TuyaMCU 51,21; StateText1 closed; StateText2 open; Timezone 99; SaveData 1
set IO_DEV publish CMNDTOPIC/Backlog Rule1 ON TuyaReceived#Data=55AA00050005030400010213 DO Backlog publish stat/%topic%/batteryState ok; publish stat/%topic%/batteryPercent 100 ENDON ON TuyaReceived#Data=55AA00050005030400010112 DO Backlog publish stat/%topic%/batteryState ok; publish stat/%topic%/batteryPercent 50 ENDON ON TuyaReceived#Data=55AA00050005030400010011 DO Backlog publish stat/%topic%/batteryState low; publish stat/%topic%/batteryPercent 5 ENDON; Rule1 1; SaveData 1
attr DEVICE setList \
  nosleep:noArg CMNDTOPIC/SerialSend5 55AA000200010002\
  setOtaUrl:textField CMNDTOPIC/OtaUrl $EVTPART1\
  upgrade:noArg   CMNDTOPIC/upgrade 1
attr DEVICE devStateIcon Online:10px-kreis-gruen Offline:10px-kreis-rot
attr DEVICE readingList \
   TELETOPIC/LWT:.* LWT\
CMNDTOPIC/POWER:.* POWER\
TELETOPIC/INFO1:.* { json2nameValue($EVENT) }\
TELETOPIC/INFO2:.* { json2nameValue($EVENT) }\
TELETOPIC/INFO3:.* { json2nameValue($EVENT) }\
STATTOPIC/RESULT:.* { json2nameValue($EVENT) }\
STATTOPIC/POWER:.* state\
TELETOPIC/RESULT:.* { json2nameValue($EVENT,'',$JSONMAP) }\
TELETOPIC/STATE:.* { json2nameValue($EVENT) }\
STATTOPIC/batteryState:.* batteryState\
STATTOPIC/batteryPercent:.* batteryPercent
attr DEVICE stateFormat LWT\
state
attr DEVICE model tasmota_windows_sensor_MC400A
setreading DEVICE attrTemplateVersion 20200522 or prior


So weit funktionieren der Sensor und das Template, nur die Rule zum Senden der Batterie-Informationen bekomme ich nicht hin. Tasmota übernimmt nur den Teil bis zum 1. Semikolon in der Rule.
10:29:36 MQT: stat/tasmota_37367A/RESULT = {"Rule1":"open","Once":"closed","StopOnError":"closed","Length":93,"Free":418,"Rules":"ON TuyaReceived#Data=55AA00050005030400010213 DO Backlog publish stat/%topic%/batteryState ok"}
10:29:36 MQT: stat/%topic%/batteryPercent = 100 ENDON ON TuyaReceived#Data=55AA00050005030400010112 DO Backlog publish stat/%topic%/batteryState ok
10:29:36 MQT: stat/%topic%/batteryPercent = 50 ENDON ON TuyaReceived#Data=55AA00050005030400010011 DO Backlog publish stat/%topic%/batteryState low
10:29:36 MQT: stat/%topic%/batteryPercent = 5 ENDON
10:29:36 MQT: stat/tasmota_37367A/RESULT = {"Rule1":"open","Once":"closed","StopOnError":"closed","Length":93,"Free":418,"Rules":"ON TuyaReceived#Data=55AA00050005030400010213 DO Backlog publish stat/%topic%/batteryState ok"}


Scheinbar wird alles nach dem Semikolon als neuer Befehl interpretiert, nicht als weiterer Teil der Rule. Geb ich die Rule auf direkt auf dem Sensor ein, übernimmt er die ganze Rule:
Rule1 ON TuyaReceived#Data=55AA00050005030400010213 DO Backlog publish stat/%topic%/batteryState ok; publish stat/%topic%/batteryPercent 100 ENDON ON TuyaReceived#Data=55AA00050005030400010112 DO Backlog publish stat/%topic%/batteryState ok; publish stat/%topic%/batteryPercent 50 ENDON ON TuyaReceived#Data=55AA00050005030400010011 DO Backlog publish stat/%topic%/batteryState low; publish stat/%topic%/batteryPercent 5 ENDON

Mit dem "nosleep" Befehl geht der Sensor für ca. 1 Minute nicht direkt wieder in den Schlafmodus, wodurch mal ihn dann konfigurieren kann. Sonst muss man ihn immer über den Reedkontakt beschäftigen..

Gruß,
Michael

Beta-User

 :) Sieht ziemlich gut aus.

Das mit dem Backlog-Rule-Ding könnte joelinux mal gelöst haben, indem er das in eine par-Anweisung verpackt hat (siehe tasmota_3socketUSB_split):
par:BUTTONRULE;Suggest Tasmota Button Rule for Power Strip;{ q/rule on button1#state=3 do backlog power1 2; power2 2; power3 2; power4 2 endon on button1#state=2 do backlog power1 1; power2 1; power3; power4 1 endon/ }

In die desc. sollte dann vermutlich noch ein Link auf die blakadder-Seite rein, damit man das wiederfindet; scheint ja ein - für Tasmota - spezielles Ding zu sein (TuyaMCU). Von daher bin ich auch unsicher, ob ich das hier und das tasmota_TuyaMCU_dimmer nicht irgendwie in eine andere Untergruppe verschieben sollte (also via order: irgendwie zusammensortieren). Da fehlt mir aber ggf. etwas Einblick, wie das denn jetzt genau funktioniert (mit TuyaMCU).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

OppiM

Hi,

Das mit der par-Anweisung hatte ich mal versucht, bin da aber an den %-Zeichen gescheitert, die perl interpretieren will. Hast du eine Idee, wie man die maskieren muss? \% und %% geht nicht...

ERROR executing perl-code { q/rule on TuyaReceived#Data=55AA00050005030400010213 DO Backlog publish stat/%topic%/batteryState ok; publish stat/%topic%/batteryPercent 100 endon/ } for param BATTERYRULE: Illegal modulus zero at (eval 803) line 1.

Was TuyaMCU angeht, da gibt es schon einige Geräte, die das nutzen (siehe https://tasmota.github.io/docs/TuyaMCU/):

  • Switches or Plugs/Power Strips
  • Aromatherapy Machine (Oil Diffuser)
  • Curtain Motor
  • Power Monitoring Plug
  • Dehumidifier
  • Lighting
  • Contact Sensor
  • Air purifier
  • Heater
  • Smart fan
  • Kettle
  • BecaThermostat
  • Inkbird ITC-308-Wifi
Gruß,
Michael

Beta-User

Puh, müßte ich auch irgendwie mal austesten...
Eine ungetestete Idee hätte ich noch, nämlich das in single quotes zu packen:
set IO_DEV publish 'CMNDTOPIC/Backlog Rule1 ON TuyaReceived#Data=55AA00050005030400010213 DO Backlog publish stat/%topic%/batteryState ok; publish stat/%topic%/batteryPercent 100 ENDON ON TuyaReceived#Data=55AA00050005030400010112 DO Backlog publish stat/%topic%/batteryState ok; publish stat/%topic%/batteryPercent 50 ENDON ON TuyaReceived#Data=55AA00050005030400010011 DO Backlog publish stat/%topic%/batteryState low; publish stat/%topic%/batteryPercent 5 ENDON; Rule1 1; SaveData 1'

Ansonsten wäre nochmal nachzusehen, was wo und wie interpoliert wird, aber vermutlich sind die Chancen umso höher, je "näher" das am IO ist...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

OppiM

Hi,

das hat auch nicht funktioniert, aber ich hab jetzt einen Weg gefunden.


# tasmota battery powered window sensor MC400A
name:tasmota_window_MC400A
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*(tele|cmnd|stat).*
desc:Configures a MC400A windows sensor
order:A_05c
attr DEVICE icon tuer_fenster_kontakt
attr DEVICE jsonMap TuyaReceived_Cmnd:0 TuyaReceived_CmndData:0 TuyaReceived_Data:0
attr DEVICE autocreate 0
par:IO_DEV;Currently used IO;{ AttrVal("DEVICE","IODev",undef)}
par:CMNDTOPIC;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}cmnd$3" : undef }
par:TELETOPIC;info topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}tele$3" : undef }
par:STATTOPIC;ack topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]*)\b(tele|cmnd|stat)(/.*)?/LWT:, ? "${1}stat$3" : undef }
set IO_DEV publish CMNDTOPIC/Rule1 ON TuyaReceived#Data=55AA00050005030400010213 DO publish stat/%topic%/batteryState ok; publish stat/%topic%/batteryPercent 100 ENDON ON TuyaReceived#Data=55AA00050005030400010112 DO publish stat/%topic%/batteryState ok; publish stat/%topic%/batteryPercent 50 ENDON ON TuyaReceived#Data=55AA00050005030400010011 DO publish stat/%topic%/batteryState low; publish stat/%topic%/batteryPercent 5 ENDON
set IO_DEV publish CMNDTOPIC/Backlog Template {"NAME":"MC400A","GPIO":[0,107,0,108,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}; Module 0; SetOption1 1; SetOption65 1; SetOption66 1; SwitchMode 1; TuyaMCU 51,21; StateText1 closed; StateText2 open; Timezone 99; Rule1 1;SaveData 1; Reboot 1
attr DEVICE setList \
  nosleep:noArg CMNDTOPIC/SerialSend5 55AA000200010002\
  setOtaUrl:textField CMNDTOPIC/OtaUrl $EVTPART1\
  upgrade:noArg   CMNDTOPIC/upgrade 1
attr DEVICE devStateIcon Online:10px-kreis-gruen Offline:10px-kreis-rot
attr DEVICE readingList \
   TELETOPIC/LWT:.* LWT\
CMNDTOPIC/POWER:.* POWER\
TELETOPIC/INFO1:.* { json2nameValue($EVENT) }\
TELETOPIC/INFO2:.* { json2nameValue($EVENT) }\
TELETOPIC/INFO3:.* { json2nameValue($EVENT) }\
STATTOPIC/RESULT:.* { json2nameValue($EVENT) }\
STATTOPIC/POWER:.* state\
TELETOPIC/RESULT:.* { json2nameValue($EVENT,'',$JSONMAP) }\
TELETOPIC/STATE:.* { json2nameValue($EVENT) }\
STATTOPIC/batteryState:.* batteryState\
STATTOPIC/batteryPercent:.* batteryPercent
attr DEVICE stateFormat LWT\
state
attr DEVICE model tasmota_windows_sensor_MC400A
setreading DEVICE attrTemplateVersion 20200522 or prior


Der Trick ist, zuerst nur die Rule (ohne Backlog) zu senden und dann im 2. Schritt die restlichen Parameter zu setzten und die Rule zu aktivieren.

Gruß,
Michael

Beta-User

Hab's eben eingecheckt, allerdings dann doch noch ein paar Kleinigkeiten geändert (CMD-Topic in readingList ist mAn. nie gewollt, sowas gehört mit einiger Sicherheit in die ignoreRegexp beim IO).

Und eine generelle Frage: Ist in dem template jetzt eigentlich eine Art Seriennummer oder so hart verdrahtet? Wenn ja, müßten wir das ggf. nacharbeiten, dazu bitte dann einfach einen neuen Thread aufmachen, das wird vermutlich insgesamt was größeres mit diesen TuyaMCU-Dingern...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Brot

Versteh' ich nicht:  ???
Ich lege meine devices gerne selber an. Eigentlich komplett, aber hier gibt es ja templates. Also gehen wir mal den Weg und ich möchte ein Shelly 2.5 anlegen:
define MQTT2_lustigerShelly25 MQTT2_DEVICE shellyswitch25-38C52BD8EF7A
Im erstellten device angekommen, kommt da noch nicht so viel. Also denn ein Template auswählen, aber da gibt es nur den Shelly 1. Nach langem Suchen stoße ich dann mal auf den code im github:
https://github.com/mhop/fhem-mirror/blob/master/fhem/FHEM/lib/AttrTemplate/mqtt2.template
Zitat# shelly2.5 using original firmware.
# Based on user 87insane contribution in https://forum.fhem.de/index.php/topic,94060.msg962167.html#msg962167
# NOTE: a second device will be created for the second channel
name:shelly25_split
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*shellies.*
desc:shelly2.5 using original firmware. <br>NOTE: a second device will be created for the second channel
order:A_11a1
par:DEVNAME;Shelly2 name in the topic;{ AttrVal("DEVICE","readingList","") =~ m,shellies/([^/]*)/, ? $1 : undef }
par:CALLSPEECHRECOGN;Set this to 0 to not set any speech recogn. related attributes;{ 1 }
set DEVICE attrTemplate shelly1_w_energy_measuring \CALLSPEECHRECOGN=0
set DEVICE attrTemplate set_associatedWith \CHANNELS=2 \MAKECOPIES=1
attr DEVICE_CH2 readingList shellies/DEVNAME/relay/1:.* state\
  shellies/DEVNAME/relay/1:.* relay1\
  shellies/DEVNAME/input/1:.* input1\
  shellies/DEVNAME/online:.* online\
  shellies/announce:.* { $EVENT =~ m,..id...DEVNAME...mac.*, ? json2nameValue($EVENT) : return }\
  shellies/DEVNAME/announce:.* { json2nameValue($EVENT) }\
  shellies/DEVNAME/relay/1/power:.* relay_1_power\
  shellies/DEVNAME/relay/1/power:.* { my $compare = $EVTPART0 < 100 ? "off":"on"; ReadingsVal($NAME,"loadState","off") ne $compare ? { 'loadState' => $compare } : return }\
  shellies/DEVNAME/temperature:.* temperature\
  shellies/DEVNAME/overtemperature:.* overtemperature\
  shellies/DEVNAME/temperature_f:.* temperature_f\
  shellies/DEVNAME/relay/1/energy:.* relay_1_energy\
  shellies/DEVNAME/relay/1/energy:.* {'relay_1_kWh' => sprintf("%.2f",$EVENT/60/1000)}\
  shellies/DEVNAME/longpush/1:.* longpush_1\
  shellies/DEVNAME/input_event/1:.* { json2nameValue($EVENT) }
attr DEVICE_CH2 setList \
  off:noArg shellies/DEVNAME/relay/1/command off\
  on:noArg shellies/DEVNAME/relay/1/command on
attr DEVICE_CH2 devStateIcon {my $onl = ReadingsVal($name,"online","false") eq "false"?"10px-kreis-rot" : ReadingsVal($name,"new_fw","false") eq "true" ? "10px-kreis-gelb" : "10px-kreis-gruen"; my $light = ReadingsVal($name,"state","off"); my $cons = ReadingsVal($name,"relay_1_power","unknown"); my $temp = ReadingsVal($name,"temperature","-100");"<div><a href=\"http://".readingsval($name,"ip","none")." \"target=\"_blank\">".FW_makeImage($onl)."</a> <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($light)."</a> Aktuell: $cons W / Temp.: $temp °C<b></b>"}
attr DEVICE,DEVICE_CH2 model shelly25_split
setreading DEVICE,DEVICE_CH2 attrTemplateVersion 20200831
option:{ CALLSPEECHRECOGN } 
set DEVICE,DEVICE_CH2 attrTemplate speechcontrol_type_switch
Genau genommen diese Zeile hier:
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*shellies.*  :o
Warum? Ich mein, klar, damit kann man die Auswahlliste einschränken, aber wenn ich das MQTT device selbst anlege, komme ich nie zu dem template, weil das attribut
readingList
einfach nicht übers kurze define (siehe oben) befüllt ist.

Auch weiß ich nicht, wie mir hier
set MQTT2_lustigerShelly25 attrTemplate ?
mit
shelly25_split
shelly2.5 using original firmware.
NOTE: a second device will be created for the second channel

da weiterhelfen soll. Wie/wo kann ich das anwenden?  ???

Ich mein, übers contribution post
https://forum.fhem.de/index.php/topic,94060.msg962167.html#msg962167
weiß ich ja nun wie das funktionieren soll und kann es einfach nachbauen, aber der Einfachheit halber (mit den templates):
Könnte man das nicht irgendwie so machen, dass man halt beispielsweise ein "model"-Attribut setzt und dann darf man das template auswählen?   :-\
Oder gibt es da schon ein "super easy way", der einfach super gut versteckt ist?  :o
diverse Raspberry Pis, Orange Pi 3, Odroid N2, Alexa, jede Menge ESP8266er
Raspbian, FHEM, NextCloud, Pi-Hole, OctoPrint, MagicMirror²
Tasmota, Eqiva Bluetooth Thermo, Senseo-ESP8266-Mod, Conbee-II HUE, Z-Wave, BTLE_FlowerSens...

Otto123

Zitat von: Brot am 20 September 2020, 17:11:10
Versteh' ich nicht:  ???
Du bist hier falsch :)
Zitat von: Beta-User am 15 Dezember 2018, 11:45:40
Bitte nutzt möglichst diesen Thread, wenn ihr neue (im Prinzip ausentwickelte) templates für mqtt2.template vorschlagen wollt.
Für Fehlermeldungen, Diskussionen zu Verbesserungsvorschlägen zu vorhandenen und zum Anfragen von support für neue Devices ist ein weiterer Thread gedacht, dieser hier sollte möglichst übersichtlich bleiben und sich auf das Wesentliche beschränken.

Generelle Anmerkungen zur attrTemplate-Funktion bitte hier posten.
Du hast Fragen zu der Funktion und willst kein neues Template abliefern ;)

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

Beta-User

Zitat von: Brot am 20 September 2020, 17:11:10
Könnte man das nicht irgendwie so machen, dass man halt beispielsweise ein "model"-Attribut setzt und dann darf man das template auswählen?   :-\
Oder gibt es da schon ein "super easy way", der einfach super gut versteckt ist?  :o
Obwohl es hier OT ist und dann bitte bei BEDARF an anderer Stelle fortgeführt werden sollte:

Also: der "super easy way" ist schlicht und ergreifend autocreate zu verwenden (und das betreffende Gadget nicht vorher allzusehr zu "verkonfigurieren"). Dann hat das Ergebnis in der Regel typische readingList-Einträge...

Man kann auch weggefilterte templates ohne weiteres aufrufen. Wie es geht, steht z.B. auch im Wiki: https://wiki.fhem.de/wiki/MQTT2_DEVICE#attrTemplate. Man hat dann allerdings eventuell das "kleine Problem", dass das betreffende template intern bestimmte Parameter nicht aufdröseln kann (die ergeben sich nämlich - oha, Überraschung - aus der readingList) und man dann Rückfragen (via Dialogfeld) erhält, deren Sinn sich in der Regel gerade denjenigen nicht erschließt, die die Gesamtzusammenhänge nicht verstanden haben und daher auch nicht in der Lage sind, die passenden Angaben zu machen...

Die Filterei an sich ist auch im Wiki erklärt: https://wiki.fhem.de/wiki/AttrTemplate#Warum_finde_ich_das_Template_xyz_nicht.3F

Kurz: Wer meint, manuell anlegen zu müssen, kann das tun, sollte dann aber dafür sorgen, dass die vom betreffenden Template selbst ermittelten Parameter (idR. die aus der filter-Angabe...) vorhanden sind und passen ;) .

[OT] Was mich wundert: wie kommt es, dass grade dieses Repo in der Suchmaschinen-Trefferliste viel weiter oben steht wie insbesondere das svn? Unter https://svn.fhem.de/trac/browser/trunk/fhem sitzt man nämlich ziemlich nahe an der eigentlichen Quelle...[/OT]

Persönliche Anmerkung:
Vieles, was man in https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/lib/AttrTemplate?order=name und im Wiki zu MQTT-Themen findet, ist "irgendwie so nebenbei" entstanden. Es mag durchaus sein, dass da an vielen Ecken noch Verbesserungsmöglichkeiten bestehen und auch manche Fehler drin sind (ich entdecke auch immer mal wieder was...), wer also die Zusammenhänge kennt, darf auch gerne (im richtigen Thread) Vorschläge machen, wie es evtl. besser geht.

Die Filterei via readingList kommt mir aber nach wie vor im Prinzip "richtig" vor, das würde ich eher ungern ändern. Was ggf. irritiert: Mal wird es gemacht, mal nicht, die Logik dahinter ist zugegebenermaßen nicht ganz digital. Das hat schlicht damit zu tun, dass es m.E. ganz gut ist zu sehen, dass es schon zu sehr vielen verschiedenen Dingen "Materialien" und Lösungsansätze gibt, und wenn man konsequent alles wegfiltert, was (vermutlich!) nichts mit dem aktuellen Device zu tun hat, dann nimmt man das als User ggf. gar nicht wahr. Den "Königsweg" dazu kenne ich nicht, wie gesagt, das ist alles "nebenbei" und jetzt auch schon über einen längeren Zeitraum entstanden, manches bzgl. der filter würde ich heute evtl. auch anders machen.
Falls also hierzu jemand Diskussionsbedarf hat oder konstruktive Vorschläge liefern möchte: nur zu, aber bitte dann in einem separaten Thread ;) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

LuckyLuis

#134
AttrTemplate-Vorschlag für Shelly-Gas-Sensor (angelehnt an Shelly-Flood)

Hallo,

anbei ein funktionierender Vorschlag für ein Template für Shelly-Gas-Sensoren:

# shellygas using original firmware
name:shellygas
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*shellies.*
desc:shellygas using original firmware <br>Just adds stateFormat, setlist, icon, devStateIcon
order:A_16b
par:DEVNAME;name of this shelly;{ AttrVal("DEVICE","readingList","") =~ m,shellies/([^/]+)/, ? $1 : undef }
attr DEVICE icon feinstaub
attr DEVICE devStateIcon none:ampel_gruen mild:ampel_gelb heavy:ampel_rot test:ampel_gruen
attr DEVICE setList \
  start_self_test:noArg shellies/DEVNAME/sensor/start_self_test\
  mute:noArg shellies/DEVNAME/sensor/mute\
  unmute:noArg shellies/DEVNAME/sensor/unmute\
  x_update:noArg shellies/DEVNAME/command update_fw\
  x_mqttcom shellies/DEVNAME/command $EVTPART1
attr DEVICE stateFormat gas
deletereading -q DEVICE (?!associatedWith).*
set DEVICE x_mqttcom announce
attr DEVICE model shellygas
setreading DEVICE attrTemplateVersion 20201102 or prior


Anregungen, Verbesserung nehme ich gerne entgegen.

Vielen Dank.

LuckyApo

PS: Muss man eigentlich FHEM immer komplett neu starten, wenn man die Datei mqtt2.template anpasst?