';;;;\
+ $ret .= 'last
homematic-fw-check => '.$lastCheck;;;;\
+ $ret .= '
';;;;\
+ $ret .= "| device | model | cur_fw | new_fw |
";;;;\
+ $ret .= "------------------------------------------------------------------------------
";;;;\
+ my $check = ReadingsVal($name,"newFwForDevices","error => no or wrong data from eq3-server!");;;;\
+ if($check eq "no fw-updates needed!") {\
+ $ret .= '| ';;;;\
+ $ret .= sprintf("%-74s",$check);;;;\
+ $ret .= ' |';;;;\
+ } elsif($check eq "error => no or wrong data from eq3-server!") {\
+ $ret .= '| ';;;;\
+ $ret .= sprintf("%-74s",$check);;;;\
+ $ret .= ' |';;;;\
+ } else {\
+ my @devices = split(',',$check);;;;\
+ foreach my $devStr (@devices) {\
+ my ($dev,$md,$idx,$ofw,$nfw) = $devStr =~ m/([^\s]+)\s[(]([^\s]+)\s[(](\d+)[)]\sofw_([\d\.]+)\s=>\snfw_([\d\.]+)/;;;;\
+ my $fw_link = "https://ccu3-update.homematic.com/firmware/download?cmd=download&serial=0&product=".$md;;;;\
+ $ret .= '| ';;;;\
+ $ret .= sprintf("%-30s",$dev);;;;\
+ $ret .= ' | ';;;;\
+ $ret .= '';;;;\
+ $ret .= sprintf("%-23s",$md);;;;\
+ $ret .= ' | ';;;;\
+ $ret .= '';;;;\
+ $ret .= sprintf("%6s",$ofw);;;;\
+ $ret .= ' | ';;;;\
+ $ret .= '';;;;\
+ $ret .= sprintf("%6s",$nfw);;;;\
+ $ret .= ' | ';;;;\
+ $ret .= "
";;;;\
+ }\
+ }\
+ $ret .= '
';;;;\
+ return $ret;;;;\
+}
+attr DEVICE userReadings newFwForDevices:MATCHED_READINGS.* {\
+ my $ret = "";;;;\
+ my $newfwonly = AttrVal($name,"showNewFWOnly","yes");;;;\
+ if (ReadingsVal($name,"UNMATCHED_READINGS","?") eq "") {\
+ my @eq3FwList = map { \
+ sprintf(ReadingsVal($name,"hmfw-type-".$_,"?").":".ReadingsVal($name,"hmfw-version-".$_,"?").":".$_);;;;\
+ } ReadingsVal($name,"MATCHED_READINGS","?")=~ m/hmfw-version-(\d\d)/g;;;;\
+ \
+ foreach my $dev (devspec2array("TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=(virtual|)")) {\
+ my $md = AttrVal($dev,"model","?");;;;\
+ my $v = AttrVal($dev,"firmware","0.0");;;;\
+ my ($h,$l) = split('\.',$v);;;;\
+ foreach my $newFW (grep m/^${md}:/i,@eq3FwList) {\
+ my ($fwmd, $fwv, $idx) = $newFW =~ m/([^:]+):(\d+[.]\d+[.]\d+):(\d+)$/;;;;\
+ my ($fwh, $fwl) = split('\.',$fwv);;;;\
+ if(($newfwonly eq "no") || (($fwh > $h) || (($fwh == $h) && ($fwl > $l)))) {\
+ $ret .= "," if($ret ne "");;;;\
+ $ret .= $dev." (".$md." (".$idx.") ofw_".$v." => nfw_".$fwv.")";;;;\
+ }\
+ }\
+ }\
+ } else {\
+ $ret = "error => no or wrong data from eq3-server!";;;;\
+ }\
+ return ($ret eq "")?"no fw-updates needed!":$ret;;;;\
+}
+attr DEVICE webCmd reread
+attr DEVICE model hm_fw_check_v2
+
+
#Contributed by OdfFHEM, see https://forum.fhem.de/index.php/topic,97694.msg992348.html#msg992348
name:tasmota_firmware_updates
filter:TYPE=HTTPMOD
diff --git a/FHEM/lib/AttrTemplate/mqtt2.template b/FHEM/lib/AttrTemplate/mqtt2.template
index 5ea25e2c2..b1f0f0444 100644
--- a/FHEM/lib/AttrTemplate/mqtt2.template
+++ b/FHEM/lib/AttrTemplate/mqtt2.template
@@ -36,7 +36,8 @@ attr DEVCID bridgeRegexp \
[^/]+[/](ems-esp[^/]+)[/].*:.* "$1"\
wallpanel[/]([^/]+)[/].*:.* "$1"\
(wled)[/]([^/]+)[/].*:.* "$1_$2"\
- (go-eCharger)[/]([^/]+)[/].*:.* "go_eCharger_$2"
+ (go-eCharger)[/]([^/]+)[/].*:.* "go_eCharger_$2"\
+ (owntracks)[/]([^/:]+)[/]([^/:]+).*:.* "$1_$2$3"
attr DEVCID autocreate 1
attr DEVCID comment Do not use very open bridgeRegexp expressions! This might lead to irritating results...
attr DEVCID room NEWDEVROOM
@@ -2161,6 +2162,8 @@ attr DEVICE setList irsend:textField BASE_ID/DEVNAME/IRtoMQTT {"value":$EVTPART2
attr DEVCID comment irsend needs Infos about protocol and value (n decimal), so e.g."IR_NEC 1587664935" should be fine...
attr DEVICE model OpenMQTTGateway_ir
+
+
name:OpenMQTTGateway_BT_temp_hum_sensor
prereq:{my @devices=devspec2array("model=OpenMQTTGateway_MCU");;return 1 if $devices[0];;return 0}
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*OpenMQTTGateway.*
@@ -2181,6 +2184,50 @@ attr OMG_BT_ID jsonMap batt:batteryPercent tem:temperature hum:humidity serviced
attr OMG_BT_ID stateFormat T: temperature°C, H: humidity%rH
attr OMG_BT_ID model OpenMQTTGateway_BT_temp_hum_sensor
+
+
+###############
+#OwnTracks
+# an OwnTracks device
+#contributed by Loredo
+#source post: https://forum.fhem.de/index.php/topic,94495.msg1020111.html#msg1020111
+name:owntracks_device
+desc:A device tracked by OwnTracks
+filter:TYPE=MQTT2_DEVICE:FILTER=CID=owntracks.*
+order:O_01
+par:TRACKER_ID;TrackerID;{ AttrVal("DEVICE","readingList","") =~ m,[^/:]+[/]([^/:]+).*:, ? $1 : undef }
+par:DEV_ID;DeviceID;{ AttrVal("DEVICE","readingList","") =~ m,[^/:]+[/][^/:]+[/]([^/:]+).*:, ? $1 : undef }
+par:WHICHROOM;Actual room of the device, defaults to OwnTracks; {AttrVal("DEVICE","room","OwnTracks" )}
+attr DEVICE room WHICHROOM
+attr DEVICE icon location_sign
+attr DEVICE jsonMap\
+ _type:lastUpdateType acc:accuracy alt:altitude batt:batteryPercent bs:batteryState cog:direction conn:connection lat:latitude lon:longitude rad:radius\
+ p:pressure t:trigger tid:trackerId tst:timestamp vac:accuracyVertical vel:velocity\
+ event__type:lastUpdateType event_acc:event_accuracy event_lat:event_latitude event_lon:event_longitude event_t:event_trigger event_tid:event_trackerId event_tst:event_timestamp event_wtst:event_waypointCreationTimestamp\
+ step__type:lastUpdateType step_steps:steps_count step_from:steps_timestampBegin step_to:steps_timestampEnd step_tst:steps_timestampReq\
+ beacon__type:lastUpdateType beacon_acc:beacon_accuracy beacon_prox:beacon_proximity beacon_tst:beacon_timestampReq\
+ waypoints__type:lastUpdateType waypoints__creator:waypoints_creator\
+ config__type:lastUpdateType
+attr DEVICE readingList\
+ owntracks/TRACKER_ID/DEV_ID:.* { json2nameValue($EVENT,'',$JSONMAP) }\
+ owntracks/TRACKER_ID/DEV_ID/event:.* { json2nameValue($EVENT,'event_',$JSONMAP) }\
+ owntracks/TRACKER_ID/DEV_ID/step:.* { json2nameValue($EVENT,'step_',$JSONMAP) }\
+ owntracks/TRACKER_ID/DEV_ID/beacon:.* { json2nameValue($EVENT,'beacon_',$JSONMAP) }\
+ owntracks/TRACKER_ID/DEV_ID/waypoints:.* { json2nameValue($EVENT,'waypoints_',$JSONMAP) }\
+ owntracks/TRACKER_ID/DEV_ID/dump:.* { json2nameValue($EVENT,'config_',$JSONMAP) }
+attr DEVICE getList\
+ location:noArg raw owntracks/TRACKER_ID/DEV_ID/cmd {"_type":"cmd","action":"reportLocation"}\
+ steps:noArg raw owntracks/TRACKER_ID/DEV_ID/cmd {"_type":"cmd","action":"reportSteps"}\
+ config:noArg raw owntracks/TRACKER_ID/DEV_ID/cmd {"_type":"cmd","action":"dump"}\
+ waypoints:noArg raw owntracks/TRACKER_ID/DEV_ID/cmd {"_type":"cmd","action":"waypoints"}
+attr DEVICE setList\
+ config owntracks/TRACKER_ID/DEV_ID/cmd {"_type":"cmd","action":"setConfiguration","configuration":$EVTPART1}\
+ waypoints owntracks/TRACKER_ID/DEV_ID/cmd {"_type":"cmd","action":"setWaypoints","waypoints":{"_type":"waypoints","waypoints":$EVTPART1}\
+ action owntracks/TRACKER_ID/DEV_ID/cmd {"_type":"cmd","action":"action",$EVTPART1}
+deletereading -q DEVICE (?!associatedWith).*
+attr DEVICE model owntracks_device
+
+
name:roborock
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*valetudo[/].*
desc:use this to control a rooted Xiamoni Vacuum / Roborock. For further details visit https://github.com/Hypfer/Valetudo