########################################### # $Id$ # # Comments start with #. Empty lines are ignored. # Syntax of one entry: name: line, one optional filter: line, zero or more par: lines, FHEM-Commands # filter:INTERNAL=VALUE (optional) # par: name of the parameter; comment; perl_code (optional) # perl_code returns a value for the parameter, or undef. # If undef, the user has to specify them (the comment is shown to the user) ########################################### name:General_Info_httpmod.template filter:TYPE=HTTPMOD desc: Forum link for suggestions or bug reports on httpmod-template.
For changes and updates on this file, see svn changelog. In most cases, major changes will be mentionned there. order:00000000 ########################################### # Categories name:---DIV--------------------------------- filter:TYPE=HTTPMOD order:DIV00 desc: Category miscellaneous - this is not a template itself name:---FUEL-------------------------------- filter:TYPE=HTTPMOD order:FUEL00 desc: Category fuel - this is not a template itself name:---RADAR------------------------------- filter:TYPE=HTTPMOD order:RADAR00 desc: Category radars - this is not a template itself name:---TECH-DIV---------------------------- filter:TYPE=HTTPMOD order:TECHZ00 desc: Category technical miscellaneous - this is not a template itself name:---TECH-PRINTER------------------------ filter:TYPE=HTTPMOD order:TECHP00 desc: Category technical printers - this is not a template itself name:---WEATHER----------------------------- filter:TYPE=HTTPMOD order:WEATHER00 desc: Category weather and environment - this is not a template itself ################################# #Clever Tanken # #Single station prices, Forum: https://forum.fhem.de/index.php/topic,94640.msg873905.html#msg873905 name:clever_tanken_single_station filter:TYPE=HTTPMOD desc: Get prices for a single gas station.
Define a HTTPMOD device like
defmod DEVICE HTTPMOD http://www.clever-tanken.de/tankstelle_details/29092 1800
Change station ID to your needs
Source: Forum order:FUEL01 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} attr DEVICE userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex readingOExpr attr DEVICE enableControlSet 1 attr DEVICE reading01Name Diesel attr DEVICE reading01Regex
Diesel
[\S\s\r\n]*?(\d.\d{2}[\S\s\r\n]*?[\d]+) attr DEVICE reading02Name SuperE10 attr DEVICE reading02Regex
Super E10
[\S\s\r\n]*?(\d.\d{2}[\S\s\r\n]*?[\d]+) attr DEVICE reading03Name SuperE5 attr DEVICE reading03Regex
Super E5
[\S\s\r\n]*?(\d.\d{2}[\S\s\r\n]*?[\d]+) attr DEVICE readingOExpr $val =~ s/<[\d\D]+>//;;$val attr DEVICE stateFormat E5: SuperE5 € / E10: SuperE10 € / D: Diesel € attr DEVICE timeout 10 attr DEVICE verbose 2 attr DEVICE room WHICHROOM attr DEVICE model clever_tanken_single_station setreading DEVICE attrTemplateVersion 20201129 #Station overview, one product, Forum: https://forum.fhem.de/index.php/topic,94640.msg873841.html#msg873841 name:clever_tanken_multi_station filter:TYPE=HTTPMOD desc: Get prices for one product as environment search.
Define a HTTPMOD device like
defmod DEVICE HTTPMOD https://www.clever-tanken.de/tankstelle_liste?spritsorte=3&r=10&ort=52152 1800
Change PLZ, radius and product to your needs
Source: Forum order:FUEL02 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} attr DEVICE reading01Name Tankstellenname attr DEVICE reading01Regex ([^<]+)<\/span> attr DEVICE reading01RegOpt g attr DEVICE reading02Name Preis attr DEVICE reading02Regex
(?>\s*)(\d.\d+).* attr DEVICE reading02RegOpt g attr DEVICE reading03Name Strasse attr DEVICE reading03Regex
(.*)<\/div> attr DEVICE reading03RegOpt g attr DEVICE reading04Name Ort attr DEVICE reading04Regex
(.*)<\/div> attr DEVICE reading04RegOpt g attr DEVICE reading05Name Entfernung attr DEVICE reading05Regex
(?>\s*)(\d.\d) km<\/span> attr DEVICE reading05RegOpt g attr DEVICE readingMaxAge 10 attr DEVICE readingMaxAgeReplacementMode delete attr DEVICE room WHICHROOM attr DEVICE model clever_tanken_multi_station setreading DEVICE attrTemplateVersion 20201129 #Contributed by subseven & yersinia, see https://forum.fhem.de/index.php/topic,107189.msg1017754.html#msg1017754 name:fuel_oil_check_esyoil filter:TYPE=HTTPMOD desc: checks fuel oil prices via easyoil.com
Define a HTTPMOD device like
define heizoelpreis HTTPMOD https://www.esyoil.com/preisausgabe.php?pr-unloading-points=%%ENTLADESTELLEN%%&pr-product=8&pr-payment-type=2&%%ANHAENGER%%&pr-hose-length=%%SCHLAUCHLAENGE%%&pr-app=1&pr-zip=%%PLZ%%&pr-amount=%%MENGE%%&submit= 3600
Maintain Attributes for ZIP (PLZ), order volume (Bestellmenge), unloading points (Entladestellen), hose length (Schlauchlaenge) and truck trailer accessibility (mit Anhaenger moeglich) before senseful values can be retrieved.
Further information and documentation can be found in this FHEM forum thread order:FUEL03 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} par:INTERVAL;Actual interval for updating, defaults to hourly (3600s); {InternalVal("DEVICE","Interval",3600)} par:ZIPCODE;German ZIP Code / deutsche Postleitzahl; {AttrVal("DEVICE","replacement01Value",undef)} par:ORDERVOLUME;fuel order volume in litre / Bestellmenge in Liter; {AttrVal("DEVICE","replacement02Value",undef)} defmod DEVICE HTTPMOD https://www.esyoil.com/preisausgabe.php?pr-unloading-points=%%ENTLADESTELLEN%%&pr-product=8&pr-payment-type=2&%%ANHAENGER%%&pr-hose-length=%%SCHLAUCHLAENGE%%&pr-app=1&pr-zip=%%PLZ%%&pr-amount=%%MENGE%%&submit= INTERVAL attr DEVICE userattr reading010Name reading010OExpr reading010Regex replacement01Mode:reading,internal,text,expression,key replacement01Regex replacement01Value replacement02Mode:reading,internal,text,expression,key replacement02Regex replacement02Value replacement03Mode:reading,internal,text,expression,key replacement03Regex replacement03Value:1,2,3,4,5,6,7,8,9,10 replacement04Mode:reading,internal,text,expression,key replacement04Regex replacement04Value:40m,60m,80m replacement05Mode:reading,internal,text,expression,key replacement05Regex replacement05Value:pr-truck-type=,pr-truck-type=short_vehicle attr DEVICE enableControlSet 1 attr DEVICE reading010Name Heizoelpreis attr DEVICE reading010OExpr $val =~ s/,/\./; $val; attr DEVICE reading010Regex ([\d\,]+)[\s]+€ attr DEVICE replacement01Mode text attr DEVICE replacement01Regex %%PLZ%% attr DEVICE replacement01Value ZIPCODE attr DEVICE replacement02Mode text attr DEVICE replacement02Regex %%MENGE%% attr DEVICE replacement02Value ORDERVOLUME attr DEVICE replacement03Mode text attr DEVICE replacement03Regex %%ENTLADESTELLEN%% attr DEVICE replacement03Value 1 attr DEVICE replacement04Mode text attr DEVICE replacement04Regex %%SCHLAUCHLAENGE%% attr DEVICE replacement04Value 40m attr DEVICE replacement05Mode text attr DEVICE replacement05Regex %%ANHAENGER%% attr DEVICE replacement05Value pr-truck-type= attr DEVICE room WHICHROOM attr DEVICE stateFormat { my $price = 0.0;\ $price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;\ my $lastCheck = FmtDateTime(InternalVal($name,".LastUpdate",0));\ my $ret = "
".$lastCheck.":";\ my $link = "https://www.esyoil.com/preisausgabe.php?";\ $link .= "pr-unloading-points=".AttrVal($name,"replacement03Value","");\ $link .= "&pr-product=8&pr-payment-type=2";\ $link .= "&".AttrVal($name,"replacement05Value","");\ $link .= "&pr-hose-length=".AttrVal($name,"replacement04Value","");\ $link .= "&pr-app=1&pr-zip=".AttrVal($name,"replacement01Value","");\ $link .= "&pr-amount=".AttrVal($name,"replacement02Value","");\ $link .= "&submit=";\ $ret .= " ";\ $ret .= ReadingsVal($name,"Heizoelpreis","-");\ $ret .= "€/100l";\ $ret .= " (".AttrVal($name,"replacement02Value","0")."l = ";\ $ret .= sprintf("%.2f",$price);\ $ret .= "€)
";\ return $ret;\ } attr DEVICE webCmd reread attr DEVICE timeout 10 attr DEVICE model fuel_oil_check_esyoil setreading DEVICE attrTemplateVersion 20201206 #Contributed by yersinia, see https://forum.fhem.de/index.php/topic,107189.msg1055334.html#msg1055334 name:fuel_oil_check_heizoel24 filter:TYPE=HTTPMOD desc: checks fuel oil prices via heizoel24.de
Define a HTTPMOD device like
https://www.heizoel24.de/heizoelpreise-direkt/%%PLZ%%/%%MENGE%%/%%ENTLADESTELLEN%% 3600
Maintain Attributes for ZIP (PLZ), order volume (Bestellmenge) and unloading points (Entladestellen) before senseful values can be retrieved.
Further information and documentation can be found in this FHEM forum thread order:FUEL04 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} par:INTERVAL;Actual interval for updating, defaults to hourly (3600s); {InternalVal("DEVICE","Interval",3600)} par:ZIPCODE;German ZIP Code / deutsche Postleitzahl; {AttrVal("DEVICE","replacement01Value",undef)} par:ORDERVOLUME;fuel order volume in litre / Bestellmenge in Liter; {AttrVal("DEVICE","replacement02Value",undef)} defmod DEVICE HTTPMOD https://www.heizoel24.de/heizoelpreise-direkt/%%PLZ%%/%%MENGE%%/%%ENTLADESTELLEN%% INTERVAL attr DEVICE userattr reading010Name reading010OExpr reading010Regex replacement01Mode:reading,internal,text,expression,key replacement01Regex replacement01Value replacement02Mode:reading,internal,text,expression,key replacement02Regex replacement02Value replacement03Mode:reading,internal,text,expression,key replacement03Regex replacement03Value:1,2,3,4,5,6,7,8,9,10 attr DEVICE enableControlSet 1 attr DEVICE reading010Name Heizoelpreis attr DEVICE reading010OExpr $val =~ s/,/\./; $val; attr DEVICE reading010Regex ([\d\,]+)[\s]+".$lastCheck.":";\ my $link = "https://www.heizoel24.de/heizoelpreise-direkt";\ $link .= "/".AttrVal($name,"replacement01Value","");\ $link .= "/".AttrVal($name,"replacement02Value","");\ $link .= "/".AttrVal($name,"replacement03Value","");\ $ret .= " ";\ $ret .= ReadingsVal($name,"Heizoelpreis","-");\ $ret .= "€/100l";\ $ret .= " (".AttrVal($name,"replacement02Value","0")."l = ";\ $ret .= sprintf("%.2f",$price);\ $ret .= "€)
";\ return $ret;\ } attr DEVICE timeout 10 attr DEVICE webCmd reread attr DEVICE model fuel_oil_check_heizoel24 setreading DEVICE attrTemplateVersion 20201206 #German weather warnings from DWD, Forum: https://forum.fhem.de/index.php/topic,45176.msg905879.html#msg905879 name:DWD_weather_warnings filter:TYPE=HTTPMOD desc: Get weather warnings from DWD.
Define a HTTPMOD device like
defmod Wetterwarner HTTPMOD https://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json 0
Change region to your needs
Source: Forum order:WEATHER01 par:REGIONCODE;Get region code from https://www.dwd.de/DE/leistungen/opendata/help/warnungen/cap_warncellids_csv.csv?__blob=publicationFile&v=3;{ undef } par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} attr DEVICE enableControlSet 1 attr DEVICE extractAllJSON 1 attr DEVICE extractAllJSONFilter REGIONCODE attr DEVICE readingOExpr $val = FmtDateTime($val/1000) if $val =~ m/^[\d]+$/g && $val > 10000;;$val attr DEVICE readingEncode UTF-8 attr DEVICE preProcessRegex s/warnWetter..............|\);|\t|\n|\r//g attr DEVICE room WHICHROOM attr DEVICE readingMaxAge 10 attr DEVICE readingMaxAgeReplacementMode delete attr DEVICE model DWD_weather_warnings setreading DEVICE attrTemplateVersion 20201129 #German river water levels, Wiki: https://wiki.fhem.de/wiki/Flusspegel name:pegelonline filter:TYPE=HTTPMOD desc: Get water level infor for german rivers from www.pegelonline.wsv.de.
Define a HTTPMOD device like
defmod Pegelstaende HTTPMOD https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/070b1eb4-3872-4e07-b2e5-e25fd9251b93/W/currentmeasurement.json 3600
Change station argument to your needs
Source: Wiki
Source: Forum order:WEATHER02 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} attr DEVICE enableControlSet 1 attr DEVICE extractAllJSON 1 attr DEVICE event-on-change-reading value,stateMnwMhw,stateNswHsw,timestamp,trend attr DEVICE event-on-update-reading value attr DEVICE sortby 1 attr DEVICE stateFormat {sprintf("%.0f",ReadingsVal("DEVICE","value",0))} attr DEVICE timeout 5 attr DEVICE room WHICHROOM attr DEVICE model pegelonline setreading DEVICE attrTemplateVersion 20201129 #Austrian weather, Forum: https://forum.fhem.de/index.php/topic,94110.msg868080.html#msg868080; enhanced by JoeALLb: https://forum.fhem.de/index.php/topic,97694.msg912164.html#msg912164 name:ORF_weather filter:TYPE=HTTPMOD desc: Get austrian weather data from orf.
Define a HTTPMOD device like
defmod weatherORF HTTPMOD none 1800
You will be asked to provide a MAINURL like https://wetter.orf.at/steiermark/ and a stationname like grazuniversitaet
Source: Enhanced version in FHEM Forum order:WEATHER03 par:MAINURL;First part of the URL. Example: https://wetter.orf.at/steiermark/;{ AttrVal("DEVICE","get02URL","") =~ m,(https://wetter.orf.at/[^/]+[/]).*, ? $1 : undef } par:STATIONNAME;Name of the respective weather station as written in the last part of the URL. Examples: grazuniversitaet or innerestadt;{ AttrVal("DEVICE","get01URL","") =~ m,https://wetter.orf.at/[^/]+[/]([^/]+)[/], ? $1 : undef } par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} attr DEVICE userattr get01Name get01Poll:0,1 get01URL get02-1Name get02-2Name get02-3Name get02-4Name get02-5Name get02-6Name get02-7Name get02-8Name get02Name get02Poll:0,1 get02Regex get02URL reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01Regex attr DEVICE enableControlSet 1 attr DEVICE get01Name Wetterdaten attr DEVICE get01Poll 1 attr DEVICE get01URL MAINURLSTATIONNAME/ attr DEVICE get02-1Name sunRise attr DEVICE get02-2Name sunSet attr DEVICE get02-3Name moonPhase attr DEVICE get02-4Name moonRise attr DEVICE get02-5Name moonSet attr DEVICE get02-6Name dayLength attr DEVICE get02-7Name dawn attr DEVICE get02-8Name dusk #attr DEVICE get02-9Name weather attr DEVICE get02Name Astro-Daten attr DEVICE get02Poll 1 attr DEVICE get02Regex Sonnenaufgang um <\/span>(.*)(.*)(\d\d:\d\d)(\d\d:\d\d)]+>(\d?\d:\d\d)&[\w\W]*Morgen<\/span>: <\/span>(\d\d:\d\d)&[\w\W]*Abend:<\/span><\/span>(\d\d:\d\d) attr DEVICE get02URL MAINURL attr DEVICE reading01Regex (?s)Temperatur.*?.*?>.*?(?(−)?[\d,]+)&thinsp.*?Taupunkt.*?.*?>.*?(?(−)?[\d,]+)&thinsp.*?Wind.*?>\n\s*(?[^<]+)\s\n\s*(?[^<]+)\s\n\s*(?[^<]+)\s\n\s*(?[^<]+)\s\n\s*(?[^<]+)\s\n\s*(?[^<\n]+).*?Messwerte[^<\n]+) attr DEVICE room WHICHROOM attr DEVICE readingOExpr $val =~ s/([\d]+),([\d]+) */$1.$2/ if $val =~ m{[\d]+,[\d]+ *\z};$val=~s/&minus\;/-/;$val attr DEVICE stateFormat W: wind, H: humidity%rH, T: temperature°C attr DEVICE model ORF_weather setreading DEVICE attrTemplateVersion 20210109 #Austrian weather, contributed by JoeALLb Forum: https://forum.fhem.de/index.php/topic,97694.msg1105574.html#msg1105574; name:bergfex_weather filter:TYPE=HTTPMOD desc: Get austrian weather data from bergfex.
Define a HTTPMOD device like
define bergfexInnsbruck HTTPMOD none 0
Adapt the city to your needs. order:WEATHER04 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} par:CITY;Name of the city you want to consider. Examples: innsbruck, salzburg, wien-stadt.
Please check the URL with the city to use before. The page must have the same structure as https://www.bergfex.at/sommer/innsbruck/wetter/
For example, wien doesn't work, and wien-stadt or wien-und-umgebung work; { undef } attr DEVICE enableControlSet 1 attr DEVICE get01Expr $val =~ /.*title="(.*)"|.*?>\n?([\d,-]+)|([\d:.,-]*)/;; $val="$1$2$3";; attr DEVICE get01Name Wetter attr DEVICE get01Poll 1 attr DEVICE get01RegOpt smx attr DEVICE get01Regex \p{Any}\ ,\s(?\d\d:\d\d)[^\n]+\ \n(?[^\n]+).*?\ Niederschlag:\s+(?\d+.).*?\ (?:9-Tage\sWettervorhersage).*?\ (?'textD0'(?<="icon"......).{1,100}png..title..(?:.+?)").*?\ (?'tmax0'(?<="tmax">)(?:[\d,-]+)°).*?\ (?'tmin0'(?<="tmin">)(?:[\d,-]+)°).*?\ (?'rainW0'(?<=\n)(?:[\d,]+)%).*?\ (?'rain0'(?<=rrr)\d+.+?\n(?:[\d,-]+)l?).*?\ (?'sunhour0'(?<=sonne)\d+">[^<]+(?:<))\ (?:.*?(?(?&textD0)))?\ .*?(?(?&tmax0))\ .*?(?(?&tmin0))\ .*?(?(?&rainW0))\ .*?(?(?&rain0))\ .*?(?(?&sunhour0))\ .*?(?(?&textD0))\ .*?(?(?&tmax0))\ .*?(?(?&tmin0))\ .*?(?(?&rainW0))\ .*?(?(?&rain0))\ .*?(?(?&sunhour0))\ .*?(?(?&textD0))\ .*?(?(?&tmax0))\ .*?(?(?&tmin0))\ .*?(?(?&rainW0))\ .*?(?(?&rain0))\ .*?(?(?&sunhour0))\ .*?(?(?&textD0))\ .*?(?(?&tmax0))\ .*?(?(?&tmin0))\ .*?(?(?&rainW0))\ .*?(?(?&rain0))\ .*?(?(?&sunhour0))\ .*?(?(?&textD0))\ .*?(?(?&tmax0))\ .*?(?(?&tmin0))\ .*?(?(?&rainW0))\ .*?(?(?&rain0))\ .*?(?(?&sunhour0))\ .*?(?(?&textD0))\ .*?(?(?&tmax0))\ .*?(?(?&tmin0))\ .*?(?(?&rain0))\ .*?(?(?&sunhour0))\ .*?(?(?&textD0))\ .*?(?(?&tmax0))\ .*?(?(?&tmin0))\ .*?(?(?&rain0))\ .*?(?(?&sunhour0))\ .*?(?(?&textD0))\ .*?(?(?&tmax0))\ .*?(?(?&tmin0))\ #.*?(?(?&rainW0))\ .*?(?(?&rain0))\ .*?(?(?&sunhour0)) attr DEVICE getURL https://www.bergfex.at/sommer/CITY/wetter/ attr DEVICE get02Expr $val =~ /.*

([^<]+)/;; $val="$1";; attr DEVICE get02Name Wetter2 attr DEVICE get02Poll 1 attr DEVICE get02RegOpt smx attr DEVICE get02Regex (?'txtL0'

[^>]+?[^>]+\/[^>]+>.<.h2>\n+

[^<]+)<\ (?:.*?(?(?&txtL0)))?\ (?:.*?(?(?&txtL0)))?\ (?:.*?(?(?&txtL0)))?\ (?:.*?(?(?&txtL0)))? attr DEVICE widgetOverride get01Regex:textField-long\ get02Regex:textField-long\ get01Expr:textField-long\ get02Expr:textField-long\ widgetOverride:textField-long attr DEVICE room WHICHROOM attr DEVICE model bergfex_weather setreading DEVICE attrTemplateVersion 20201129 #Geschwindigkeitsüberwachung, Forum: https://forum.fhem.de/index.php/topic,90014.msg824805.html#msg824805 name:blitzer_atudo filter:TYPE=HTTPMOD desc: Get info about local velocity controls.
Define a HTTPMOD device like
defmod DEVICE HTTPMOD https://cdn2.atudo.net/api/1.0/vl.php?type=0,1,2,3,4,5,6&box=52.xxxxxx,8.xxxxxx,53.xxxxxx,9.xxxxxx 0
Change city to your needs
Source: Forum order:RADAR01 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} attr DEVICE userattr getData getHeader1 getHeader2 getURL reading01DeleteIfUnmatched reading01JSON reading01Name reading01Regex reading02Name reading02RegOpt reading02Regex reading03JSON reading03Name readingEncode requestHeader1 requestHeader2 setParseResponse:0,1 attr DEVICE enableControlSet 1 attr DEVICE extractAllJSON 1 attr DEVICE getHeader1 Content-Type: application/json attr DEVICE getHeader2 Accept: */* attr DEVICE readingEncode utf8 attr DEVICE room WHICHROOM attr DEVICE model blitzer setreading DEVICE attrTemplateVersion 20201129 #homebridge-videodoorbell, Forum: https://forum.fhem.de/index.php/topic,94291.msg870289.html#msg870289 name:homebridge_videodoorbell filter:TYPE=HTTPMOD desc: Control your homebridge-videodoorbell.
Define a HTTPMOD device like
define Video_Doorbell HTTPMOD none 0
Source: Forum order:TECHZ01 par:IP_PORT;Enter IP:Port as configured in your doorbell, like 123.456.7.8:5005;{undef } par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} attr DEVICE get01Name klingel2homekitget attr DEVICE get01URL http://IP_PORT/ attr DEVICE get01Data ding=dong&dong=ding attr DEVICE get01Header02 User-Agent: curl/7.38.0 attr DEVICE get01Header04 Accept: */* attr DEVICE get01Header06 Content-Type: application/x-www-form-urlencoded attr DEVICE set01Name klingel2homekitset attr DEVICE set01URL http://IP_PORT/ attr DEVICE set01Data ding=dong&dong=ding attr DEVICE set01Header02 User-Agent: curl/7.38.0 attr DEVICE set01Header04 Accept: */* attr DEVICE set01Header06 Content-Type: application/x-www-form-urlencoded attr DEVICE set01NoArg 1 attr DEVICE room WHICHROOM attr DEVICE model homebridge_videodoorbell setreading DEVICE attrTemplateVersion 20201129 # Pihole Statistics, Website: https://wolf-u.li/5987/einbindung-der-pihole-statistiken-in-fhem/ name:pihole_statistics filter:TYPE=HTTPMOD desc: Get Statistics from your pihole instance.
Define a HTTPMOD device like
define DEVICE HTTPMOD http://192.168.133.7/admin/api.php 300
Change IP to your needs
Source: Website order:TECHZ02 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} attr DEVICE userattr getURL attr DEVICE extractAllJSON 1 attr DEVICE getURL http://dns/admin/api.php attr DEVICE stateFormat DNS Anfragen: dns_queries_today
Geblockte Seiten: ads_blocked_today (ads_blocked_today_formatted %) attr DEVICE userReadings ads_blocked_today_formatted {round(ReadingsNum($name,"ads_percentage_today",0),0)} attr DEVICE room WHICHROOM attr DEVICE model pihole_statistics setreading DEVICE attrTemplateVersion 20201129 # Pharmacy Emergency Service Germany, Forum: https://forum.fhem.de/index.php?topic=87234.0 name:pharmacy_emergency_service_germany filter:TYPE=HTTPMOD desc: Gets the current emergency service of a pharmacy closeby your postal code from apothekenfinder.mobi
Define an empty HTTPMOD device with
define DEVICE HTTPMOD none 0
Source: Forum
Hint: The emergency service changes every day at 09:00 CET, thus create a AT like this to update the DEVICE timely:
defmod UPDATE_EMERGENCY_SERVICE at *09:15:00 set EMERGENCY_HTTPMOD_DEVICE reread order:DIV01 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} par:SEARCHZIPCODE;Zip code of the city you want to search around; defmod DEVICE HTTPMOD https://apothekenfinder.mobi/interface/json.php?device=web&source=not&search=SEARCHZIPCODE 0 attr DEVICE userattr get01Encode get01JSON get01Name get02ExtractAllJSON:0,1 getURL reading01Encode reading01JSON reading01Name reading02JSON reading02Name reading03JSON reading03Name reading04JSON reading04Name reading05JSON reading05Name reading06JSON reading06Name reading07JSON reading07Name reading07OExpr reading08JSON reading08Name reading08OExpr reading09JSON reading09Name reading10JSON reading10Name reading11JSON reading11Name readingEncode requestHeader requestHeader1 requestHeader2 requestHeader3 requestHeader4 requestHeader5 requestHeader6 requestHeader7 attr DEVICE reading01Encode UTF-8 attr DEVICE reading01JSON result_01_name attr DEVICE reading01Name Name attr DEVICE reading02JSON result_01_street attr DEVICE reading02Name Strasse attr DEVICE reading03JSON result_01_plz attr DEVICE reading03Name Plz attr DEVICE reading04JSON result_01_place attr DEVICE reading04Name Ort attr DEVICE reading05JSON result_01_number attr DEVICE reading05Name Telefon attr DEVICE reading06JSON result_01_fax attr DEVICE reading06Name Telefax attr DEVICE reading07JSON result_01_start attr DEVICE reading07Name Beginn attr DEVICE reading07OExpr FmtDateTime($val) attr DEVICE reading08JSON result_01_end attr DEVICE reading08Name Ende attr DEVICE reading08OExpr FmtDateTime($val) attr DEVICE reading09JSON result_01_lng attr DEVICE reading09Name Laengengrad attr DEVICE reading10JSON result_01_lat attr DEVICE reading10Name Breitengrad attr DEVICE reading11JSON result_01_distance attr DEVICE reading11Name Entfernung attr DEVICE readingEncode UTF-8 attr DEVICE requestHeader2 Accept-Encoding: gzip, deflate attr DEVICE requestHeader3 Accept-Language: de-DE,de;;q=0.9,en-US;;q=0.8,en;;q=0.7,fr;;q=0.6 attr DEVICE requestHeader4 User-Agent: Lynx/2.8.8dev.3 libwww-FM/2.14 SSL-MM/1.4.1 attr DEVICE requestHeader5 Referer: http://apothekenfinder.mobi/ attr DEVICE requestHeader6 X-Requested-With: XMLHttpRequest attr DEVICE requestHeader7 Connection: keep-alive attr DEVICE showBody 0 attr DEVICE stateFormat Name, Telefon, Strasse in Plz Ort attr DEVICE timeout 60 attr DEVICE room WHICHROOM attr DEVICE model pharmacy_emergency_service_germany setreading DEVICE attrTemplateVersion 20201129 #Pharmacy emergency service Germany - aponet, Forum https://forum.fhem.de/index.php/topic,87234.0.html name:aponet_pharmacy_emergency_service_germany filter:TYPE=HTTPMOD desc: Gets the current emergency service of a pharmacy closeby your postal code from aponet.de
Define an empty HTTPMOD device with
define DEVICE HTTPMOD none 0
Source: Forum
order:DIV02 par:SEARCHZIPCODE;Zip code of the city you want to search around; par:SEARCHRADIUS;Radius in km for the search; par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} defmod DEVICE HTTPMOD https://www.aponet.de/apotheke/notdienstsuche?tx_aponetpharmacy_search[action]=result&tx_aponetpharmacy_search[controller]=Search&tx_aponetpharmacy_search[search][plzort]=SEARCHZIPCODE&tx_aponetpharmacy_search[search][date]=&tx_aponetpharmacy_search[search][street]=&tx_aponetpharmacy_search[search][radius]=SEARCHRADIUS&tx_aponetpharmacy_search[search][lat]=&tx_aponetpharmacy_search[search][lng]=&type=1982 0 attr DEVICE reading01Name NotName attr DEVICE reading01Regex class="name">(.*?)<\/h4> attr DEVICE reading02Name NotdienstVon attr DEVICE reading02Regex Notdienst vom(.*?Uhr) attr DEVICE reading03Name NotdienstBis attr DEVICE reading03Regex Notdienst vom.*?Uhr bis(.*?Uhr) attr DEVICE reading04Name NotdienstTelefon attr DEVICE reading04Regex href="tel:(.*?)" attr DEVICE reading05Name NotdienstAdresse attr DEVICE reading05Regex (?s)strasse">([\sa-zA-Z0-9äöüÄÖÜß.&#;;_-]+).*?plz">(\d+).*?ort">([\sa-zA-Z0-9äöüÄÖÜß.&#;;_-]+)< attr DEVICE reading06Name DatumVon attr DEVICE reading06Regex Notdienst vom ([ 0-9.:&#;;_-]+) attr DEVICE stateFormat NotName, NotdienstTelefon, NotdienstAdresse-1 in NotdienstAdresse-2 NotdienstAdresse-3 attr DEVICE model aponet_pharmacy_emergency_service_germany setreading DEVICE attrTemplateVersion 20201202 ################################# #HP Printers # # Forum: https://forum.fhem.de/index.php/topic,90601.msg874683.html#msg874683 # # Printer config name:hp_printer_config filter:TYPE=HTTPMOD desc: Get configuration of your hp printer.
Define a HTTPMOD device like
defmod DEVICE HTTPMOD http://192.168.5.43/DevMgmt/ProductConfigDyn.xml 3600
Change IP to your needs
Source: Forum order:TECHP01 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} attr DEVICE userattr reading01Name reading01XPath-Strict reading02Name reading02XPath-Strict reading03Name reading03XPath-Strict reading04Name reading04XPath-Strict reading05Name reading05XPath-Strict attr DEVICE httpVersion 1.1 attr DEVICE reading01Name Model attr DEVICE reading01XPath-Strict //dd:MakeAndModel/text() attr DEVICE reading02Name Serial_Number attr DEVICE reading02XPath-Strict //dd:SerialNumber/text() attr DEVICE reading03Name Firmware_Date attr DEVICE reading03XPath-Strict //dd:Date/text() attr DEVICE reading04Name Total_Memory attr DEVICE reading04XPath-Strict //dd:TotalMemory/text() attr DEVICE reading05Name Available_Memory attr DEVICE reading05XPath-Strict //dd:AvailableMemory/text() attr DEVICE stateFormat Modell: Model SN: Serial_Number attr DEVICE userReadings Memory_Usage {100-(ReadingsNum("DEVICE","Available_Memory","")/2.56)} attr DEVICE room WHICHROOM attr DEVICE model hp_printer_config setreading DEVICE attrTemplateVersion 20201129 # Printer cartridge states name:hp_printer_cartridge_status filter:TYPE=HTTPMOD desc: Get cartridge states of your HP printer.
Define a HTTPMOD device like
defmod DEVICE HTTPMOD http://192.168.5.43/DevMgmt/ConsumableConfigDyn.xml 3600
Change IP to your needs
Source: Forum order:TECHP02 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} attr DEVICE userattr reading01Name reading01XPath-Strict reading02Name reading02XPath-Strict reading03Name reading03XPath-Strict reading04Name reading04XPath-Strict reading05Name reading05XPath-Strict reading06Name reading06XPath-Strict$ attr DEVICE httpVersion 1.1 attr DEVICE reading01Name Cyan attr DEVICE reading01XPath-Strict //ccdyn:ConsumableInfo[3]/dd:ConsumablePercentageLevelRemaining/text() attr DEVICE reading02Name Magenta attr DEVICE reading02XPath-Strict //ccdyn:ConsumableInfo[2]/dd:ConsumablePercentageLevelRemaining/text() attr DEVICE reading03Name Yellow attr DEVICE reading03XPath-Strict //ccdyn:ConsumableInfo[4]/dd:ConsumablePercentageLevelRemaining/text() attr DEVICE reading04Name Black attr DEVICE reading04XPath-Strict //ccdyn:ConsumableInfo[5]/dd:ConsumablePercentageLevelRemaining/text() attr DEVICE reading05Name CyanCatridgeModel attr DEVICE reading05XPath-Strict //ccdyn:ConsumableInfo[3]/dd:ConsumableSelectibilityNumber/text() attr DEVICE reading06Name MagentaCatridgeModel attr DEVICE reading06XPath-Strict //ccdyn:ConsumableInfo[2]/dd:ConsumableSelectibilityNumber/text() attr DEVICE reading07Name YellowCatridgeModel attr DEVICE reading07XPath-Strict //ccdyn:ConsumableInfo[4]/dd:ConsumableSelectibilityNumber/text() attr DEVICE reading08Name BlackCatridgeModel attr DEVICE reading08XPath-Strict //ccdyn:ConsumableInfo[5]/dd:ConsumableSelectibilityNumber/text() attr DEVICE stateFormat C: Cyan% M: Magenta% Y: Yellow% B: Black% attr DEVICE room WHICHROOM attr DEVICE model hp_printer_cartridge_status setreading DEVICE attrTemplateVersion 20201129 # Printer statistics name:hp_printer_statistics filter:TYPE=HTTPMOD desc: Gets various statistics from your HP printer.
Define a HTTPMOD device like
defmod DEVICE HTTPMOD http://192.168.5.43/DevMgmt/ProductUsageDyn.xml 3600
Change IP to your needs
Source: Forum order:TECHP03 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} attr DEVICE userattr reading01Name reading01XPath-Strict reading02Name reading02XPath-Strict reading03Name reading03XPath-Strict reading04Name reading04XPath-Strict reading05Name reading05XPath-Strict reading06Name reading06XPath-Strict reading07Name reading07XPath-Strict reading08Name reading08XPath-Strict reading09Name reading09XPath-Strict reading10Name reading10XPath-Strict reading11Name reading11XPath-Strict reading20Name reading20XPath-Strict reading30Name reading30XPath-Strict reading40Name reading40XPath-Strict reading41Name reading41XPath-Strict reading50Name reading50XPath-Strict reading51Name reading51XPath-Strict attr DEVICE httpVersion 1.1 attr DEVICE reading01Name Printer_Pages_Total attr DEVICE reading01XPath-Strict //pudyn:PrinterSubunit/dd:TotalImpressions/text() attr DEVICE reading02Name Printer_Pages_Monochrome attr DEVICE reading02XPath-Strict //pudyn:PrinterSubunit/dd:MonochromeImpressions/text() attr DEVICE reading03Name Printer_Pages_Color attr DEVICE reading03XPath-Strict //pudyn:PrinterSubunit/dd:ColorImpressions/text() attr DEVICE reading04Name Printer_Pages_Duplex attr DEVICE reading04XPath-Strict //pudyn:PrinterSubunit/dd:DuplexSheets/text() attr DEVICE reading05Name Printer_Jam_Events attr DEVICE reading05XPath-Strict //pudyn:PrinterSubunit/dd:JamEvents/text() attr DEVICE reading06Name Printer_Mispick_Events attr DEVICE reading06XPath-Strict //pudyn:PrinterSubunit/dd:MispickEvents/text() attr DEVICE reading10Name Scanner_Scans_Total attr DEVICE reading10XPath-Strict //pudyn:ScannerEngineSubunit/dd:ScanImages/text() attr DEVICE reading11Name Scanner_Scans_ADF_Image attr DEVICE reading11XPath-Strict //pudyn:ScannerEngineSubunit/dd:AdfImages/text() attr DEVICE reading12Name Scanner_Scans_Flatbed_Image attr DEVICE reading12XPath-Strict //pudyn:ScannerEngineSubunit/dd:FlatbedImages/text() attr DEVICE reading13Name Scanner_Jam_Events attr DEVICE reading13XPath-Strict //pudyn:ScannerEngineSubunit/dd:JamEvents/text() attr DEVICE reading14Name Scanner_Mispick_Events attr DEVICE reading14XPath-Strict //pudyn:ScannerEngineSubunit/dd:MispickEvents/text() attr DEVICE reading20Name InkMagentaPagesRemaining attr DEVICE reading20XPath-Strict //pudyn:Consumable[dd:MarkerColor='Magenta']/dd:EstimatedPagesRemaining/text() attr DEVICE reading21Name InkMagentaPercentRemaining attr DEVICE reading21XPath-Strict //pudyn:Consumable[dd:MarkerColor='Magenta']/dd:ConsumableRawPercentageLevelRemaining/text() attr DEVICE reading30Name InkCyanPagesRemaining attr DEVICE reading30XPath-Strict //pudyn:Consumable[dd:MarkerColor='Cyan']/dd:EstimatedPagesRemaining/text() attr DEVICE reading31Name InkCyanPercentRemaining attr DEVICE reading31XPath-Strict //pudyn:Consumable[dd:MarkerColor='Cyan']/dd:ConsumableRawPercentageLevelRemaining/text() attr DEVICE reading40Name InkYellowPagesRemaining attr DEVICE reading40XPath-Strict //pudyn:Consumable[dd:MarkerColor='Yellow']/dd:EstimatedPagesRemaining/text() attr DEVICE reading41Name InkYellowPercentRemaining attr DEVICE reading41XPath-Strict //pudyn:Consumable[dd:MarkerColor='Yellow']/dd:ConsumableRawPercentageLevelRemaining/text() attr DEVICE reading50Name InkBlackPagesRemaining attr DEVICE reading50XPath-Strict //pudyn:Consumable[dd:MarkerColor='Black']/dd:EstimatedPagesRemaining/text() attr DEVICE reading51Name InkBlackPercentRemaining attr DEVICE reading51XPath-Strict //pudyn:Consumable[dd:MarkerColor='Black']/dd:ConsumableRawPercentageLevelRemaining/text() attr DEVICE stateFormat Total: Printer_Pages_Total Monochrome: Printer_Pages_Monochrome Color: Printer_Pages_Color attr DEVICE room WHICHROOM attr DEVICE model hp_printer_statistics setreading DEVICE attrTemplateVersion 20201129 # Printer status name:hp_printer_status filter:TYPE=HTTPMOD desc: Get status of your hp printer.
Define a HTTPMOD device like
defmod DEVICE HTTPMOD http://192.168.5.43/DevMgmt/ProductStatusDyn.xml 60
Change IP to your needs
Source: Forum order:TECHP04 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} attr DEVICE userattr reading01Name reading01XPath-Strict attr DEVICE httpVersion 1.1 attr DEVICE reading01Name Status attr DEVICE reading01XPath-Strict //psdyn:LocString[@lang='de']/text() attr DEVICE stateFormat Status attr DEVICE room WHICHROOM attr DEVICE model hp_printer_status setreading DEVICE attrTemplateVersion 20201129 ################################# #Epson Printers # # Forum: https://forum.fhem.de/index.php/topic,90601.msg872234.html#msg872234 # Printer cartridge states name:epson_printer_cartridge_status filter:TYPE=HTTPMOD desc: Get cartridge states of your Epson printer.
Define a HTTPMOD device like
defmod DEVICE HTTPMOD http://192.168.188.25/PRESENTATION/HTML/TOP/PRTINFO.HTML 3600
Change IP to your needs
Source: Forum order:TECHP05 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} attr DEVICE reading01Name Yellow attr DEVICE reading01Regex Ink_Y.*?='([\d]+)' attr DEVICE reading02Name Cyan attr DEVICE reading02Regex Ink_C.*?='([\d]+)' attr DEVICE reading03Name Magenta attr DEVICE reading03Regex Ink_M.*?='([\d]+)' attr DEVICE reading04Name Black attr DEVICE reading04Regex Ink_B.*?='([\d]+)' attr DEVICE stateFormat C: Cyan% M: Magenta% Y: Yellow% B: Black% attr DEVICE room WHICHROOM attr DEVICE model epson_printer_cartridge_status setreading DEVICE attrTemplateVersion 20201129 ################################# #Brother Printers # # Forum: https://forum.fhem.de/index.php/topic,97483.msg908461.html#msg908461 # Printer cartridge states name:brother_printer_cartridge_status filter:TYPE=HTTPMOD desc: Get cartridge states of your Brother printer.
Define a HTTPMOD device like
defmod DEVICE HTTPMOD http://192.168.178.6/general/information.html 3600
Change IP to your needs
Source: Forum
Tested with MFC-9142CDN, should work with DCP-9015 CDW DCP-9020 HL-3140 CW HL-3150 CDN HL-3170 MFC-9130 MFC-9140 MFC-9330 MFC-9340 order:TECHP06 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} attr DEVICE userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex attr DEVICE httpVersion 1.1 attr DEVICE reading01Name Yellow attr DEVICE reading01Regex \(Y\)\*\*.{9}\((\d{1,3}\.\d{1,2})%\) attr DEVICE reading02Name Cyan attr DEVICE reading02Regex \(C\)\*\*.{9}\((\d{1,3}\.\d{1,2})%\) attr DEVICE reading03Name Magenta attr DEVICE reading03Regex \(M\)\*\*.{9}\((\d{1,3}\.\d{1,2})%\) attr DEVICE reading04Name Black attr DEVICE reading04Regex \(BK\)\*\*.{9}\((\d{1,3}\.\d{1,2})%\) attr DEVICE room WHICHROOM attr DEVICE stateFormat C: Cyan% M: Magenta% Y: Yellow% B: Black% attr DEVICE reading05Name Status attr DEVICE reading05RegOpt gm attr DEVICE reading05Regex 1<\/th>(.*?)< attr DEVICE model brother_printer_cartridge_status setreading DEVICE attrTemplateVersion 20201129 ################################# #Brother Scanners # Brother ADS Scanners name:brother_scanner_ads_status filter:TYPE=HTTPMOD desc: Get status of your Brother scanner.
Define a HTTPMOD device like
defmod DEVICE HTTPMOD http://192.168.133.7/ft/gen_maintenance 3600
Change IP to your needs
Source: Website.
Tested to work with ADS-1700W, possibly others. order:TECHP07 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} attr DEVICE userattr reading01Name reading01XPath-Strict reading02Name reading02XPath-Strict reading03Name reading03XPath-Strict reading04Name reading04XPath-Strict reading05Name reading05XPath-Strict reading06Name reading06XPath-Strict reading07Name reading07XPath-Strict reading08Name reading08XPath reading08XPath-Strict reading09Name reading09XPath-Strict reading10Name reading10XPath-Strict reading11Name reading11XPath-Strict reading12Name reading12XPath-Strict attr DEVICE httpVersion 1.1 attr DEVICE reading01Name Model attr DEVICE reading01XPath-Strict //Model_name/text() attr DEVICE reading02Name Serial_Number attr DEVICE reading02XPath-Strict //Serial_Number/text() attr DEVICE reading03Name Firmware_Version attr DEVICE reading03XPath-Strict //MainVersion/text() attr DEVICE reading04Name PickupRollerPagesThreshold attr DEVICE reading04XPath-Strict //RemainingPick/text() attr DEVICE reading05Name PickupRollerPagesUsed attr DEVICE reading05XPath-Strict //RemainingPick_current/text() attr DEVICE reading06Name ScheduledMaintenancePagesThreshold attr DEVICE reading06XPath-Strict //RemainingScheduled/text() attr DEVICE reading07Name ScheduledMaintenancePagesUsed attr DEVICE reading07XPath-Strict //RemainingScheduled_current/text() attr DEVICE reading08XPath SeparationPadPagesThreshold attr DEVICE reading08XPath-Strict //RemainingPad_Threshold/text() attr DEVICE reading09Name SeparationPadPagesUsed attr DEVICE reading09XPath-Strict //RemainingSeparation_Pad/text() attr DEVICE reading10Name ScannedPagesTotal attr DEVICE reading10XPath-Strict //ScanPage/text() attr DEVICE reading11Name RollerReplacements attr DEVICE reading11XPath-Strict //RollerReplace/text() attr DEVICE reading12Name PaperJams attr DEVICE reading12XPath-Strict //PaperJams/text() attr DEVICE stateFormat Pages: ScannedPagesTotal Modell: Model SN: Serial_Number attr DEVICE room WHICHROOM attr DEVICE model brother_scanner_ads_status setreading DEVICE attrTemplateVersion 20201129 ################################# #RESOL Solaranlage, Forum: https://forum.fhem.de/index.php/topic,86678.0.html name:resol_solar filter:TYPE=HTTPMOD desc: Get data from your RESOL solar installation
Define a HTTPMOD device like
define Solar HTTPMOD http://192.178.002.112/dl2/live/data 300
Source: Forum order:TECHZ03 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} attr DEVICE userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex reading05Name reading05Regex reading06Name reading06Regex timeout attr DEVICE group A_Energy attr DEVICE reading01Name Temperatur_Sensor1 attr DEVICE reading01Regex Temperatur Sensor 1:[^0-9]+([0-9\.]+) attr DEVICE reading02Name Temperatur_Sensor2 attr DEVICE reading02Regex Temperatur Sensor 2:[^0-9]+([0-9\.]+) attr DEVICE reading03Name Temperatur_Sensor3 attr DEVICE reading03Regex Temperatur Sensor 3[^0-9]+([0-9\.]+) attr DEVICE reading04Name Temperatur_Sensor4 attr DEVICE reading04Regex Temperatur Sensor 4[^0-9]+([0-9\.]+) attr DEVICE reading05Name Drehzahl_Pumpe attr DEVICE reading05Regex Drehzahl Pumpe 1[^0-9]+([0-9\.]+) attr DEVICE reading06Name Betriebsstunden attr DEVICE reading06Regex Betriebsstunden Relais 1[^0-9]+([0-9\.]+) attr DEVICE room WHICHROOM attr DEVICE stateFormat Dachtemperatur: Temperatur_Sensor1 Drehzahl Pumpe: Drehzahl_Pumpe Laufzeit Heute: Tageslaufzeit attr DEVICE timeout 5ercent="([\d\.]+) attr DEVICE model resol_solar setreading DEVICE attrTemplateVersion 20201129 ################################# #Show updates for CUL_HM devices, Forum: https://forum.fhem.de/index.php/topic,78501.msg972144.html#msg972144 #Contributed by Pfriemler, mcp & yersinia, see https://forum.fhem.de/index.php/topic,78501.msg1104534.html#msg1104534 name:hm_fw_check_v2 filter:TYPE=HTTPMOD desc: check for homematic firmware updates; based on new link provided by Pfriemler (switch from eq-3.de to update.homematic.com) and includes HmIP adaption provided by mcp
Define an HTTPMOD device like
define DEVICE HTTPMOD https://update.homematic.com/firmware/api/firmware/search/DEVICE 86400
Further information and documentation can be found in this FHEM forum thread order:TECHZ04 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} par:INTERVAL;Actual interval for updating, defaults to one day (86400s); {InternalVal("DEVICE","Interval",86400)} defmod DEVICE HTTPMOD https://update.homematic.com/firmware/api/firmware/search/\DEVICE INTERVAL attr DEVICE userattr reading01AutoNumLen reading01Name reading01RegOpt reading01Regex reading02AutoNumLen reading02Name reading02RegOpt reading02Regex readingMaxAge readingMaxAgeReplacementMode:text,reading,internal,expression,delete showNewFWOnly:yes,no attr DEVICE do_not_notify 1 attr DEVICE enableControlSet 1 attr DEVICE icon hm_ccu attr DEVICE reading01AutoNumLen 3 attr DEVICE reading01Name hmfw-type attr DEVICE reading01RegOpt g attr DEVICE reading01Regex (?i)"type":"((?:\w+[-]*){1,}) attr DEVICE reading02AutoNumLen 3 attr DEVICE reading02Name hmfw-version attr DEVICE reading02RegOpt g attr DEVICE reading02Regex (?si)"version":"(\d+[.]\d+[.]\d+) attr DEVICE readingMaxAge 10 attr DEVICE readingMaxAgeReplacementMode delete attr DEVICE showError 1 attr DEVICE showMatched 1 attr DEVICE showNewFWOnly yes attr DEVICE stateFormat { my $ret ="";\ my $lastCheck = FmtDateTime(InternalVal($name,".LastUpdate",0));\ my $nextCheck = FmtDateTime(InternalVal($name,".TRIGGERTIME",0));\ my $cellstyle = "padding:3pt;border-bottom:1px dotted lightgray;";\ $ret .= '

';\ $ret .= '
last homematic-fw-check => '.$lastCheck;\ $ret .= '
';\ my $check = ReadingsVal($name,"newFwForDevices","error => no or wrong data from eq3-server!");\ if($check eq "no fw-updates needed!") {\ $ret .= '
';\ $ret .= $check;\ $ret .= '
';\ } elsif($check eq "error => no or wrong data from eq3-server!") {\ $ret .= '
';\ $ret .= $check;\ $ret .= '
';\ } else {\ $ret .= '
';\ $ret .= '
';\ $ret .= '
device
';\ $ret .= '
model
';\ $ret .= '
current
';\ $ret .= '
new
';\ $ret .= '
'; #header\ my @devices = split(',',$check);\ foreach my $devStr (@devices) {\ my ($dev,$idx) = $devStr =~ m/([^\s]+)\s[(](\d+)[)]/;\ my $md = ReadingsVal($name,("hmfw-type-".$idx),"?");\ my $ofw = InternalVal($dev,"firmware",AttrVal($dev,"firmware","0.0"));\ my $nfw = ReadingsVal($name,("hmfw-version-".$idx),"none");\ my $fw_link = "https://ccu3-update.homematic.com/firmware/download?cmd=download&serial=0&product=".$md;\ $ret .= '
';\ $ret .= '';\ $ret .= '
';\ $ret .= $md;\ $ret .= '
';\ $ret .= '
';\ $ret .= $ofw;\ $ret .= '
';\ $ret .= '';\ $ret .= '
'; #row\ }\ $ret .= '
'; #table\ }\ $ret .= "
(next check: ".$nextCheck.")
";\ $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(uc(ReadingsVal($name,"hmfw-type-".$_,"?")).":".ReadingsVal($name,"hmfw-version-".$_,"?").":".$_);\ } ReadingsVal($name,"MATCHED_READINGS","?")=~ m/hmfw-version-(\d\d\d)/g;\ \ foreach my $dev (devspec2array("TYPE=CUL_HM|HMCCUDEV:FILTER=DEF=(......|..............):FILTER=subType!=virtual")) {\ my $md = uc(InternalVal($dev,"ccutype",AttrVal($dev,"model","?")));\ my $v = InternalVal($dev,"firmware",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." (".$idx.")";\ }\ }\ }\ } else {\ $ret = "error => no or wrong data from eq3-server!";\ }\ return ($ret eq "")?"no fw-updates needed!":$ret;\ } attr DEVICE webCmd reread attr DEVICE room WHICHROOM attr DEVICE model hm_fw_check_v2 setreading DEVICE attrTemplateVersion 20201206 #Contributed by yersinia, see https://forum.fhem.de/index.php/topic,97694.msg1045829.html#msg1045829 name:aculfw_fw_check filter:TYPE=HTTPMOD desc: checks a-culfw firmware updates
Define a HTTPMOD device like
define aculfw_fw_check HTTPMOD https://github.com/heliflieger/a-culfw/blob/master/CHANGELOG 86400
Source: Forum order:TECHZ05 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} par:INTERVAL;Actual interval for updating, defaults to daily (86400s); {InternalVal("DEVICE","Interval",86400)} defmod DEVICE HTTPMOD https://github.com/heliflieger/a-culfw/blob/master/CHANGELOG INTERVAL attr DEVICE userattr reading01Name reading01Regex updatableDevicesMode:onlyUpdatable,all attr DEVICE do_not_notify 1 attr DEVICE enableControlSet 1 attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS attr DEVICE handleRedirects 1 attr DEVICE icon cul_usb attr DEVICE reading01Name latestVersion attr DEVICE reading01Regex \#\#\# ([\d]\.[\d]{2}\.[\d]{2}) attr DEVICE room WHICHROOM attr DEVICE showError 1 attr DEVICE showMatched 1 attr DEVICE stateFormat { my $ret ="";;\ my $lastCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"MATCHED_READINGS","2000-01-01 00:00:00"))));;\ my $nextCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(InternalVal($name,"TRIGGERTIME_FMT","2000-01-01 00:00:00"))));;\ my $cellstyle = "padding:3pt;;border-bottom:1px dotted lightgray;;";;\ $ret .= '
';;\ $ret .= 'last a-culfw version check => '.$lastCheck;;\ $ret .= '
';;\ my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\ if($check eq "no updates needed!") {\ $ret .= '
';;\ $ret .= $check;;\ $ret .= '
';;\ } elsif($check eq "error => no or wrong data from server!") {\ $ret .= '
';;\ $ret .= $check;;\ $ret .= '
';;\ } else {\ my @devices = split(',',$check);;\ $ret .= '
';;\ $ret .= '
';;\ $ret .= '
device
';;\ $ret .= '
current
';;\ $ret .= '
new
';;\ $ret .= '
';; #header\ foreach my $devStr (@devices) {\ my ($dev,$old,$new) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\)]+)\)$/;;\ $ret .= '
';;\ $ret .= '';;\ $ret .= '';;\ $ret .= '';;\ $ret .= '
';; #row\ }\ $ret .= '
';; #table\ }\ $ret .= "
(next check: ".$nextCheck.")
";;\ $ret .= '
';;\ return $ret;;\ } attr DEVICE updatableDevicesMode onlyUpdatable attr DEVICE userReadings updatableDevices {\ my $ret = "";;\ my $updateall = AttrVal($name,"updatableDevicesMode","");;\ if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\ $ret = "error => no or wrong data from server!";;\ } else {\ my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\ foreach my $dev (devspec2array("TYPE=CUL")) {\ my $version = InternalVal($dev,"VERSION","unknown");;\ $version =~ m/([\d]\.[\d]{2}\.[\d]{2})/;;\ $version = $1;;\ if(($updateall eq "all") || ($version ne $VERSION)) {\ $ret .= "," if($ret ne "");;\ $ret .= $dev." (".$version." | ".$VERSION.")";;\ }\ }\ }\ return ($ret eq "")?"no updates needed!":$ret;;\ } attr DEVICE webCmd reread attr DEVICE room WHICHROOM attr DEVICE model aculfw_fw_check setreading DEVICE attrTemplateVersion 20201129 #Contributed by OdfFHEM, see https://forum.fhem.de/index.php/topic,97694.msg992348.html#msg992348 name:tasmota_firmware_updates filter:TYPE=HTTPMOD desc: Check Tasmota homepage for available new firmware files
Define a HTTPMOD device like
define tasmotaupdates HTTPMOD https://github.com/arendst/Tasmota/tags 86400Source: Forum. order:TECHZ06 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} par:UPDATABLEDEVICESMODE;Actual mode for updatableDevices, defaults to onlyUpdatable; {AttrVal("DEVICE","updatableDevicesMode","onlyUpdatable")} par:INTERVAL;Actual interval for updating, defaults to one week; {InternalVal("DEVICE","Interval","604800")} defmod DEVICE HTTPMOD https://github.com/arendst/Tasmota/tags INTERVAL attr DEVICE userattr reading01Name reading01Regex reading02Name reading02OExpr reading02Regex updatableDevicesMode:onlyUpdatable,all attr DEVICE enableControlSet 1 attr DEVICE event-on-change-reading .* attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS attr DEVICE handleRedirects 0 attr DEVICE reading01Name latestVersion attr DEVICE reading01Regex commit-title">[\w\W]*?[\w\W]*?v(\d*.\d*.\d*)[\w\W]*? attr DEVICE reading02Name latestDate attr DEVICE reading02OExpr $val =~ m/^(.{4})-(.{2})-(.{2})$/ ;; "$3.$2.$1" attr DEVICE reading02Regex relative-time[\w\W]*?datetime="(\d*-\d*-\d*)T\d*:\d*:\d*Z" attr DEVICE showError 1 attr DEVICE showMatched 1 attr DEVICE stateFormat { my $ret ="";;\ my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;\ $ret .= '
';;\ $ret .= 'last tasmota-check => '.$lastCheck;;\ $ret .= '

';;\
    $ret .= "| device                           | current |   new   |  released  |
";;\ $ret .= "---------------------------------------------------------------------
";;\ my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\ if($check eq "no updates needed!") {\ $ret .= '| ';;\ $ret .= sprintf("%-65s",$check);;\ $ret .= ' |';;\ } elsif($check eq "error => no or wrong data from server!") {\ $ret .= '| ';;\ $ret .= sprintf("%-65s",$check);;\ $ret .= ' |';;\ } else {\ my @devices = split(',',$check);;\ foreach my $devStr (@devices) {\ my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;\ $ret .= '| ';;\ $ret .= sprintf("%-32s",AttrVal($dev,"alias",$dev));;\ $ret .= ' | ';;\ $ret .= '';;\ $ret .= '';;\ $ret .= sprintf("%7s",$old);;\ $ret .= ' | ';;\ $ret .= '';;\ $ret .= '';;\ $ret .= sprintf("%7s",$new);;\ $ret .= ' | ';;\ $ret .= '';;\ $ret .= '';;\ $ret .= sprintf("%-10s",$date);;\ $ret .= '';;\ $ret .= " |
";;\ }\ }\ $ret .= '
';;\ return $ret;;\ } attr DEVICE timestamp-on-change-reading .* attr DEVICE updatableDevicesMode UPDATABLEDEVICESMODE attr DEVICE userReadings updatableDevices:MATCHED_READINGS.* {\ my $ret = "";;\ if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\ $ret = "error => no or wrong data from server!";;\ } else {\ my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\ my $DATE = ReadingsVal($name,"latestDate","unknown");;\ foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=readingList~.*tele[/].*INFO.*:FILTER=Version!=,TYPE=MQTT[2]?_[D]EVICE:FILTER=readingList~.*tele[/].*INFO.*:FILTER=INFO1_Version!=")) {\ my $version = ReadingsVal($dev,"Version",ReadingsVal($dev,"INFO1_Version","0.0.0"));;\ $version =~ m/([0-9.]*).*/;;\ $version = $1;;\ if ( AttrVal($name,"updatableDevicesMode","onlyUpdatable") eq "all" || $version ne $VERSION ) {\ $ret .= "," if($ret ne "");;\ $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE.")";;\ }\ }\ }\ return ($ret eq "")?"no updates needed!":$ret;;\ } attr DEVICE webCmd reread attr DEVICE room WHICHROOM attr DEVICE model tasmota_firmware_updates setreading DEVICE attrTemplateVersion 20201129 #Contributed by OdfFHEM, see https://forum.fhem.de/index.php/topic,97694.msg998835.html#msg998835 name:zigbee2mqtt_daemon_updates filter:TYPE=HTTPMOD desc: Check zigbee2mqtt homepage for new versions of the deamon software.
Define a HTTPMOD device like
define zigbee2mqtt_updates HTTPMOD https://github.com/Koenkk/zigbee2mqtt/tags 604800
Source: Forum. order:TECHZ07 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} par:INTERVAL;Actual interval for updating, defaults to one day; {InternalVal("DEVICE","Interval",604800)} par:UPDATABLEDEVICESMODE;Actual mode for updatableDevices, defaults to onlyUpdatable; {AttrVal("DEVICE","updatableDevicesMode","onlyUpdatable")} defmod DEVICE HTTPMOD https://github.com/Koenkk/zigbee2mqtt/tags INTERVAL attr DEVICE userattr reading01Name reading01Regex reading02Name reading02OExpr reading02Regex updatableDevicesMode:onlyUpdatable,all attr DEVICE enableControlSet 1 attr DEVICE event-on-change-reading .* attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS attr DEVICE handleRedirects 0 attr DEVICE reading01Name latestVersion attr DEVICE reading01Regex commit-title">[\w\W]*?[\w\W]*?(\d*\.\d*\.\d*)[\w\W]*? attr DEVICE reading02Name latestDate attr DEVICE reading02OExpr $val =~ m/^(.{4})-(.{2})-(.{2})$/ ;; "$3.$2.$1" attr DEVICE reading02Regex relative-time[\w\W]*?datetime="(\d*-\d*-\d*)T\d*:\d*:\d*Z" attr DEVICE showError 1 attr DEVICE showMatched 1 attr DEVICE stateFormat { my $ret ="";;\ my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;\ $ret .= '
';;\ $ret .= 'last ZigBee-check => '.$lastCheck;;\ $ret .= '

';;\
    $ret .= "| device                           | current |   new   |  released  |
";;\ $ret .= "---------------------------------------------------------------------
";;\ my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\ if($check eq "no updates needed!") {\ $ret .= '| ';;\ $ret .= sprintf("%-65s",$check);;\ $ret .= ' |';;\ } elsif($check eq "error => no or wrong data from server!") {\ $ret .= '| ';;\ $ret .= sprintf("%-65s",$check);;\ $ret .= ' |';;\ } else {\ my @devices = split(',',$check);;\ foreach my $devStr (@devices) {\ my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;\ $ret .= '| ';;\ $ret .= sprintf("%-32s",$dev);;\ $ret .= ' | ';;\ $ret .= '';;\ $ret .= sprintf("%7s",$old);;\ $ret .= ' | ';;\ $ret .= '';;\ $ret .= '';;\ $ret .= sprintf("%7s",$new);;\ $ret .= ' | ';;\ $ret .= '';;\ $ret .= '';;\ $ret .= sprintf("%-10s",$date);;\ $ret .= '';;\ $ret .= " |
";;\ }\ }\ $ret .= '
';;\ return $ret;;\ } attr DEVICE updatableDevicesMode UPDATABLEDEVICESMODE attr DEVICE timestamp-on-change-reading .* attr DEVICE userReadings updatableDevices:MATCHED_READINGS.* {\ my $ret = "";;\ if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\ $ret = "error => no or wrong data from server!";;\ } else {\ my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\ my $DATE = ReadingsVal($name,"latestDate","unknown");;\ foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=permit_join!=")) {\ my $version = ReadingsVal($dev,"version","0.0.0");;\ $version =~ m/([0-9.]*).*/;;\ $version = $1;;\ if (AttrVal($name,"updatableDevicesMode","onlyUpdatable") eq "all" || $version ne $VERSION) {\ $ret .= "," if($ret ne "");;\ $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE.")";;\ }\ }\ }\ return ($ret eq "")?"no updates needed!":$ret;;\ } attr DEVICE webCmd reread attr DEVICE room WHICHROOM attr DEVICE model zigbee2mqtt_daemon_updates setreading DEVICE attrTemplateVersion 20201129 #Contributed by yersinia, see https://forum.fhem.de/index.php/topic,97694.msg992432.html#msg992432 name:ESPEasy_firmware_updates filter:TYPE=HTTPMOD desc: Check letscontrollit homepage for available new firmware files
Define a HTTPMOD device like
define ESPEasy_updates HTTPMOD https://github.com/letscontrolit/ESPEasy/releases 86400Source: Forum. order:TECHZ08 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} attr DEVICE userattr reading01Name reading01Regex attr DEVICE enableControlSet 1 attr DEVICE event-on-change-reading .* attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS attr DEVICE handleRedirects 1 attr DEVICE reading01Name latestVersion attr DEVICE reading01Regex Release mega-([\d]{8}) attr DEVICE showError 1 attr DEVICE showMatched 1 attr DEVICE stateFormat { my $ret ="";;\ my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;\ $ret .= '
';;\ $ret .= 'last ESPEasy version check => '.$lastCheck;;\ $ret .= '

';;\
    $ret .= "| device                                       | current  |   new    | 
";;\ $ret .= "----------------------------------------------------------------------
";;\ my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\ if($check eq "no updates needed!") {\ $ret .= '| ';;\ $ret .= sprintf("%-65s",$check);;\ $ret .= ' |';;\ } elsif($check eq "error => no or wrong data from server!") {\ $ret .= '| ';;\ $ret .= sprintf("%-65s",$check);;\ $ret .= ' |';;\ } else {\ my @devices = split(',',$check);;\ foreach my $devStr (@devices) {\ my ($dev,$old,$new) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\)]+)\)$/;;\ $ret .= '| ';;\ $ret .= sprintf("%-44s",$dev);;\ $ret .= ' | ';;\ $ret .= '';;\ $ret .= '';;\ $ret .= sprintf("%7s",$old);;\ $ret .= ' | ';;\ $ret .= '';;\ $ret .= '';;\ $ret .= sprintf("%7s",$new);;\ $ret .= ' |
';;\ }\ }\ $ret .= '
';;\ return $ret;;\ } attr DEVICE timestamp-on-change-reading .* attr DEVICE userReadings updatableDevices:MATCHED_READINGS.* {\ my $ret = "";;\ if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\ $ret = "error => no or wrong data from server!";;\ } else {\ my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\ foreach my $dev (devspec2array("TYPE=ESPEasy:FILTER=HOST!=bridge")) {\ my $version = InternalVal($dev,"ESP_BUILD_GIT","unknown");;\ $version =~ m/([\d]{8})/;;\ $version = $1;;\ if($version ne $VERSION) {\ $ret .= "," if($ret ne "");;\ $ret .= $dev." (".$version." | ".$VERSION.")";;\ }\ }\ }\ return ($ret eq "")?"no updates needed!":$ret;;\ } attr DEVICE webCmd reread attr DEVICE room WHICHROOM attr DEVICE model ESPEasy_firmware_updates setreading DEVICE attrTemplateVersion 20201129 #Contributed by yersinia, see name:dnscrypt-proxy_updates filter:TYPE=HTTPMOD desc: Show updates for DNSCRYPT.
Define a HTTPMOD device like
defmod dnscrypt_proxy_version HTTPMOD https://api.github.com/repos/jedisct1/dnscrypt-proxy/releases/latest 86400
Source: Forum order:TECHZ09 par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )} attr DEVICE userattr userattr myInstalledVersion attr DEVICE extractAllJSON 1 attr DEVICE extractAllJSONFilter tag_name attr DEVICE stateFormat {"

".ReadingsTimestamp($name,'tag_name','')."
Online: ".ReadingsVal($name,'tag_name','')."
\ pihole: ".AttrVal($name,'myInstalledVersion','')."

"} attr DEVICE myInstalledVersion 2.0.31 attr DEVICE room WHICHROOM attr DEVICE enableControlSet 1 attr DEVICE model dnscrypt-proxy_updates setreading DEVICE attrTemplateVersion 20201129