httpmod.template: bugs, Fragen, Anregungen

Begonnen von Beta-User, 21 Februar 2019, 12:04:17

Vorheriges Thema - Nächstes Thema

mrfloppy

Hallo
Ich würde mir ein Template für den Österreichischen Spritpreisrechner der E-control wünschen.
Vielleicht kann da ja wer was zusammen basteln.

LG Thomas
RaspiMatic, RFXtrx433 E USB, Div. Thermostate, CUL433, Fhemduino, Signalduino, Temp/luftfeuchesensoren,Fensterkontakte,Intertechno Schalter,....... HM-IP

SirUli

#31
Hi Beta-User,

Clever-Tanken hat ein Update der Website gemacht, daher ist folgender Patch notwendig:

--- httpmod-orig.template       2019-05-04 11:45:58.050623533 +0200
+++ httpmod.template    2019-05-04 11:48:58.940098540 +0200
@@ -24,11 +24,11 @@
attr DEVICE userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex readingOExpr
attr DEVICE enableControlSet 1
attr DEVICE reading01Name Diesel
-attr DEVICE reading01Regex SpritsortenController[^0-9]+([0-9,]+)[^0-9]+Diesel
+attr DEVICE reading01Regex "price-type-name">Diesel</div>[\d\D]{700,900}"current-price-.">([0-9\.]+[^0-9]+suffix-price-.">[0-9])
attr DEVICE reading02Name SuperE10
-attr DEVICE reading02Regex SpritsortenController[^0-9]+([0-9,]+)[^0-9]+Super E10
+attr DEVICE reading02Regex "price-type-name">Super E10</div>[\d\D]{700,900}"current-price-.">([0-9\.]+[^0-9]+suffix-price-.">[0-9])
attr DEVICE reading03Name SuperE5
-attr DEVICE reading03Regex SpritsortenController[^0-9]+([0-9,]+)[^0-9]+Super E5
+attr DEVICE reading03Regex "price-type-name">Super E5</div>[\d\D]{700,900}"current-price-.">([0-9\.]+[^0-9]+suffix-price-.">[0-9])
attr DEVICE readingOExpr $val =~ tr/,/./;;$val
attr DEVICE stateFormat E5: SuperE5 € / E10: SuperE10 € / D: Diesel €
attr DEVICE timeout 10


Vielen Dank im Voraus!

Cheers,
Uli

Edit: Sehe da grad noch einen Copy&Paste Fehler:

--- httpmod-orig.template       2019-05-04 11:57:08.837329308 +0200
+++ httpmod.template    2019-05-04 11:59:49.444661159 +0200
@@ -115,7 +115,7 @@
#Geschwindigkeitsüberwachung, Forum: https://forum.fhem.de/index.php/topic,90014.msg824805.html#msg824805
name:A_03a_blitzer
filter:TYPE=HTTPMOD
-desc: Get austrian weather.<br>Define a HTTPMOD device like <br>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 <br>Change city to your needs <br><a href="https://forum.fhem.de/index.php/topic,90014.msg824805.html#msg824805">Source: Forum</a>
+desc: Get speed cameras.<br>Define a HTTPMOD device like <br>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 <br>Change city to your needs <br><a href="https://forum.fhem.de/index.php/topic,90014.msg824805.html#msg824805">Source: Forum</a>
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

Beta-User

Zitat von: SirUli am 04 Mai 2019, 11:54:11
Clever-Tanken hat ein Update der Website gemacht, daher ist folgender Patch notwendig:
Vielen Dank zurück!
Hab's eben eingecheckt :) .


Zitat von: mrfloppy am 29 April 2019, 11:30:12
Hallo
Ich würde mir ein Template für den Österreichischen Spritpreisrechner der E-control wünschen.
Vielleicht kann da ja wer was zusammen basteln.
Etwas Vorarbeit wäre schon gut.
Meine eigenen Regex-Kenntnisse sind leider nicht so gut, als dass ich da "einfach so" was erfinden könnte.



Zu bergfex und dem ORF-Wetter noch eine Anmerkung:

das klemmt beides irgendwie, ich weiß nur leider nicht, warum. Ich wollte erst ORF fixen. Da geht nur eine der beiden Abfragen, die andere liefert einfach nichts, bergfex scheint sogar das ganze System zu blockieren (auf dem Testsystem, kann sein, dass da das dns-Attribut bei global helfen könnte, aber Inet-Zugang ist eigentlich da?).
Wie gesagt, ich bin nicht der regex-Experte und habe leider im Moment nach wie vor keine Idee, an was es eigentlich hängt.

Schubsen wäre nett... ::)
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

SirUli

Zitat von: Beta-User am 04 Mai 2019, 12:05:49Hab's eben eingecheckt :)

Merci und ich lege gleich nochmal nach. Basierend auf Artikeln in meinem Blog, hier noch für die HP Printer ne Erweiterung und der Brother Scanner mit dazu als Template. Ich habe den letzteren mal unter B_02a rein sortiert, das kannst du natürlich machen wie deine Idee dazu ist ;) Dazu habe ich noch die aktuelle Notfallapotheke und für Pihole die statistiken ;)

--- httpmod-orig.template       2019-05-04 12:00:32.502030867 +0200
+++ httpmod.template    2019-05-04 13:33:50.035551364 +0200
@@ -145,6 +145,57 @@
attr DEVICE set01NoArg 1
attr DEVICE model A_02c_homebridge_videodoorbell

+# Pihole Statistics, Website: https://wolf-u.li/5987/einbindung-der-pihole-statistiken-in-fhem/
+name:A_02e_pihole_statistics
+filter:TYPE=HTTPMOD
+desc: Get Statistics from your pihole instance.<br />Define a HTTPMOD device like <br />define DEVICE HTTPMOD http://192.168.133.7/admin/api.php 300<br />Change IP to your needs<br /><a href="https://wolf-u.li/5987/einbindung-der-pihole-statistiken-in-fhem/">Source: Website</a>
+attr DEVICE userattr getURL
+attr DEVICE extractAllJSON 1
+attr DEVICE getURL http://dns/admin/api.php
+attr DEVICE stateFormat DNS Anfragen: dns_queries_today<br>Geblockte Seiten: ads_blocked_today (ads_blocked_today_formatted %)
+attr DEVICE userReadings ads_blocked_today_formatted {round(ReadingsNum($name,"ads_percentage_today",0),0)}
+
+# Pharmacy Emergency Service Germany, Forum: https://forum.fhem.de/index.php?topic=87234.0
+name:A_02f_pharmacy_emergency_service_germany
+filter:TYPE=HTTPMOD
+desc: Gets the current emergency service of a pharmacy closeby your postal code<br />Define a HTTPMOD device like <br />define DEVICE HTTPMOD http://apothekenfinder.mobi/interface/json.php?device=web&source=not&search=1337 0<br />Change the postalcode (1337 in this example) to yours<br /><a href="https://forum.fhem.de/index.php/topic,87234.0.html>Source: Forum</a><br />Hint: The emergency service changes every day at 09:00 CET, thus create a AT like this to update the DEVICE timely:<br />defmod UPDATE_EMERGENCY_SERVICE at *09:15:00 set EMERGENCY_HTTPMOD_DEVICE reread
+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 strftime "%a %e.%m.%Y %H:%M", localtime($val)
+attr DEVICE reading08JSON result_01_end
+attr DEVICE reading08Name Ende
+attr DEVICE reading08OExpr strftime "%a %e.%m.%Y %H:%M", localtime($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
+
#################################
#HP Printers
#
@@ -173,8 +224,8 @@
# Printer cartridge states
name:B_01a_hp_printer_cartridge_status
filter:TYPE=HTTPMOD
-desc: Get cartridge states of your hp printer.<br>Define a HTTPMOD device like <br>defmod DEVICE HTTPMOD http://192.168.5.43/DevMgmt/ProductConfigDyn.xml 3600 <br>Change IP to your needs <br><a href="https://forum.fhem.de/index.php/topic,90601.msg874683.html#msg874683">Source: Forum</a>
-attr DEVICE userattr reading01Name reading01XPath-Strict reading02Name reading02XPath-Strict reading03Name reading03XPath-Strict reading04Name reading04XPath-Strict
+desc: Get cartridge states of your HP printer.<br>Define a HTTPMOD device like <br>defmod DEVICE HTTPMOD http://192.168.5.43/DevMgmt/ConsumableConfigDyn.xml 3600 <br>Change IP to your needs <br><a href="https://forum.fhem.de/index.php/t$
+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[2]/dd:ConsumablePercentageLevelRemaining/text()
@@ -184,32 +235,62 @@
attr DEVICE reading03XPath-Strict //ccdyn:ConsumableInfo[4]/dd:ConsumablePercentageLevelRemaining/text()
attr DEVICE reading04Name Black
attr DEVICE reading04XPath-Strict //ccdyn:ConsumableInfo[1]/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 model B_01a_hp_printer_cartridge_status

# Printer statistics
name:B_01a_hp_printer_statistics
filter:TYPE=HTTPMOD
-desc: Get cartridge states of your hp printer.<br>Define a HTTPMOD device like <br>defmod DEVICE HTTPMOD http://192.168.5.43/DevMgmt/ProductUsageDyn.xml 3600<br>Change IP to your needs <br><a href="https://forum.fhem.de/index.php/topic,90601.msg874683.html#msg874683">Source: Forum</a>
-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
+desc: Gets various statistics from your HP printer.<br>Define a HTTPMOD device like <br>defmod DEVICE HTTPMOD http://192.168.5.43/DevMgmt/ProductUsageDyn.xml 3600<br>Change IP to your needs <br><a href="https://forum.fhem.de/index.php/topic,90601.msg874683.html#msg874683">Source: Forum</a>
+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 Pages_Total
+attr DEVICE reading01Name Printer_Pages_Total
attr DEVICE reading01XPath-Strict //pudyn:PrinterSubunit/dd:TotalImpressions/text()
-attr DEVICE reading02Name Pages_Monochrome
+attr DEVICE reading02Name Printer_Pages_Monochrome
attr DEVICE reading02XPath-Strict //pudyn:PrinterSubunit/dd:MonochromeImpressions/text()
-attr DEVICE reading03Name Pages_Color
+attr DEVICE reading03Name Printer_Pages_Color
attr DEVICE reading03XPath-Strict //pudyn:PrinterSubunit/dd:ColorImpressions/text()
-attr DEVICE reading04Name Pages_Duplex
+attr DEVICE reading04Name Printer_Pages_Duplex
attr DEVICE reading04XPath-Strict //pudyn:PrinterSubunit/dd:DuplexSheets/text()
-attr DEVICE reading05Name Jam_Events
+attr DEVICE reading05Name Printer_Jam_Events
attr DEVICE reading05XPath-Strict //pudyn:PrinterSubunit/dd:JamEvents/text()
-attr DEVICE reading06Name Mispick_Events
+attr DEVICE reading06Name Printer_Mispick_Events
attr DEVICE reading06XPath-Strict //pudyn:PrinterSubunit/dd:MispickEvents/text()
-attr DEVICE reading07Name ADF_Image_Scans
-attr DEVICE reading07XPath-Strict //pudyn:ScannerEngineSubunit/dd:AdfImages/text()
-attr DEVICE reading08Name Flatbed_Image_Scans
-attr DEVICE reading08XPath-Strict //pudyn:ScannerEngineSubunit/dd:FlatbedImages/text()
-attr DEVICE stateFormat Total: Pages_Total Monochrome: Pages_Monochrome Color: Pages_Color
+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 model B_01a_hp_printer_statistics

# Printer status
@@ -270,6 +351,42 @@
attr DEVICE reading05Regex <th>1<\/th><td>(.*?)<
attr DEVICE model B_01c_brother_printer_cartridge_status

+#################################
+#Brother Scanners
+
+# Brother ADS Scanners
+name:B_02a_brother_scanner_ads_status
+filter:TYPE=HTTPMOD
+desc: Get status of your Brother scanner.<br>Define a HTTPMOD device like <br>defmod DEVICE HTTPMOD http://192.168.133.7/ft/gen_maintenance 3600<br>Change IP to your needs <br><a href="https://wolf-u.li/6005/darstellung-der-statistiken-des-brother-ads-1700w-in-fhem/">Source: Website</a>.<br />Tested to work with ADS-1700W, possibly others.
+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
+
+#################################
#RESOL Solaranlage, Forum: https://forum.fhem.de/index.php/topic,86678.0.html
name:C_01a_resol_solar
filter:TYPE=HTTPMOD

Beta-User

Thx!
Ist ebenfalls bereits eingecheckt :) .
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

#35
Hi,

wie an andere Stelle angekündigt, ich habe (ohne wirkliche Kennung) ein HTTMOD Device für die Konfiguration des Shell PlugS gebaut. Das ist noch nicht komplett, aber da ist so ziemlich alles drin was die API bietet.

Ich habe das wirklich Schritt für Schritt zu Fuß gemacht, ob das in dem Modul in Wirklichkeit viel einfacher geht, hat sich mir noch nicht erschlossen.  :-[
defmod shellyplug_s_h HTTPMOD none 0
attr shellyplug_s_h userattr get01Name get01URL get02Name get02URL get03Name get03URL set01IMap set01Name set01TextArg:0,1 set01URL set02Name set02TextArg:0,1 set02URL set03Name set03TextArg:0,1 set03URL set04Name set04TextArg:0,1 set04URL set05Name set05TextArg:0,1 set05URL set06Name set06TextArg:0,1 set06URL set07Name set07TextArg:0,1 set07URL set10Name set10TextArg:0,1 set10URL set11Name set11TextArg:0,1 set11URL set12Name set12TextArg:0,1 set12URL set15Name set15TextArg:0,1 set15URL set16Name set16URL set17Name set18URL
attr shellyplug_s_h eventMap /switch on:on/switch off:off/switch toggle:toggle
attr shellyplug_s_h extractAllJSON 1
attr shellyplug_s_h get01Name settings
attr shellyplug_s_h get01URL http://shellyplug-s-040E41/settings
attr shellyplug_s_h get02Name status
attr shellyplug_s_h get02URL http://shellyplug-s-040E41/status
attr shellyplug_s_h get03Name settings_relay_0
attr shellyplug_s_h get03URL http://shellyplug-s-040E41/settings/relay/0
attr shellyplug_s_h room HTTPMOD_Device
attr shellyplug_s_h set01Name mqtt_max_qos
attr shellyplug_s_h set01URL http://shellyplug-s-040E41/settings/?mqtt_max_qos=$val
attr shellyplug_s_h set02Name mqtt_retain
attr shellyplug_s_h set02TextArg 1
attr shellyplug_s_h set02URL http://shellyplug-s-040E41/settings/?mqtt_retain=$val
attr shellyplug_s_h set03Name mqtt_update_period
attr shellyplug_s_h set03URL http://shellyplug-s-040E41/settings/?mqtt_update_period=$val
attr shellyplug_s_h set04Name settings_relay_0_default_state
attr shellyplug_s_h set04TextArg 1
attr shellyplug_s_h set04URL http://shellyplug-s-040E41/settings/relay/0/?default_state=$val
attr shellyplug_s_h set05Name settings_relay_0_btn_type
attr shellyplug_s_h set05TextArg 1
attr shellyplug_s_h set05URL http://shellyplug-s-040E41/settings/relay/0/?btn_type=$val
attr shellyplug_s_h set06Name settings_relay_0_auto_on
attr shellyplug_s_h set06URL http://shellyplug-s-040E41/settings/relay/0/?auto_on=$val
attr shellyplug_s_h set07Name settings_relay_0_auto_off
attr shellyplug_s_h set07URL http://shellyplug-s-040E41/settings/relay/0/?auto_off=$val
attr shellyplug_s_h set10Name led_status_disable
attr shellyplug_s_h set10TextArg 1
attr shellyplug_s_h set10URL http://shellyplug-s-040E41/settings/?max_power=$val
attr shellyplug_s_h set11Name led_status_disable
attr shellyplug_s_h set11TextArg 1
attr shellyplug_s_h set11URL http://shellyplug-s-040E41/settings/?led_status_disable=$val
attr shellyplug_s_h set12Name led_power_disable
attr shellyplug_s_h set12TextArg 1
attr shellyplug_s_h set12URL http://shellyplug-s-040E41/settings/?led_power_disable=$val
attr shellyplug_s_h set15Name switch
attr shellyplug_s_h set15TextArg 1
attr shellyplug_s_h set15URL http://shellyplug-s-040E41/relay/0/?turn=$val
attr shellyplug_s_h set16Name timeron
attr shellyplug_s_h set16URL http://shellyplug-s-040E41/relay/0/?timer=$val&turn=on
attr shellyplug_s_h set17Name timeroff
attr shellyplug_s_h set18URL http://shellyplug-s-040E41/relay/0/?timer=$val&turn=off

Am meisten hat mich geärgert, das ich es nicht gerafft habe ob man die URL zum Gerät ein einer Stelle setzen kann und alle set denn relativ angeben kann. Aber in der Doku steht das auch nur absolut.

Ich weiß noch nicht ob es ein Weg wäre, im Falle Shelly, das MQTT Device und das HTTMOD Device "zu kombinieren" um z.B. on-for-timer usw. einfach mit dem HTTPMOD umzusetzen.
Zum normalen Betrieb taugt das HTTPMOD Device für Shelly meiner Meinung nach nicht. Zum Konfigurieren und ein paar Funktionen (Timer) aber schon

Nach dem Urlaub schau ich mir dann mal die Template Geschichte noch weiter an, versprochen. :)
Ich muss an einem von beiden Beispielen lernen, wie man aus seiner Raw Def ein Template strickt :)

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

...Danke mal vorab...

Was die Fragen zu HTTPMOD angeht, solltest du die ggf. separat im "Neue Version.."-Thread stellen, ich bin wie gesagt - eigentlich gar nicht der HTTPMOD-Experte, sondern versuche nur, das template-Thema einigermaßen sinnvoll z kuratieren... Dafür reicht in der Regel eine RAW-Definition von einem funktionierenden Device; um festzustellen, ob sich da was optimieren läßt, reichen meine Kenntnisse der HTTPMOD-Spezifika leider in der Regel nicht (deswegen frage ich ja bei jeder halbwegs sinnvollen Gelegenheit, ob nicht jemand Interesse hat, der weiß, was da möglich ist...).

MMn. macht eine Kombination zwischen MQTT- und HTTPMOD-Welt nicht den großen Sinn, evtl. kann man in MQTT2_DEVICE "etwas Perl" verbauen, um ein paar HTTP-Posts zu setzen. Insgesamt weiß ich nicht recht, inwieweit es sinnvoll ist, z.B. für die Konfiguration einen HTTPMOD zu verwenden statt das direkt in dem Web-Interface (auf das man ohne weiteres vom MQTT2_DEVICE kommt, oder?) einzugeben. Ist ja in der Regel eine Einmalaktion.

Von RAW nach template ist "eigentlich" einfach. Insbesondere "par:" ist in der Regel "einfach nur etwas regex", der Rest ist entweder selbsterklärend oder eine Übungsfrage (was löst man am besten wie?), bei der die Antwort teilweise sehr stark davon abhängt, was das jeweilige Device "kann".
Um entsprechende Fragen zu erörtern, kannst du gerne auch einen separaten Thread aufmachen (vermutlich sinnvollerweise im MQTT-Bereich).
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

yersinia

#37
Hallo,

ich nutze HTTPMOD auch um mir FW-aktualisierungen anzeigen zu lassen - und zwar bisher von ESPEasy und dnscrypt-proxy:

ESPEasy Firmware-Check:
defmod ESPEasy_version HTTPMOD https://github.com/letscontrolit/ESPEasy/releases 86400
attr ESPEasy_version userattr reading01Name reading01Regex
attr ESPEasy_version reading01Name esp_version
attr ESPEasy_version reading01Regex Release (mega-[\d]{8})
attr ESPEasy_version stateFormat {"<p align=\"left\">".ReadingsTimestamp($name,'esp_version','')."<br />Online: <a href=\"https://github.com/letscontrolit/ESPEasy/releases\"\
title=\"ChangeLog\" rel=\"noopener noreferrer\" target=\"_blank\"><b>".ReadingsVal($name,'esp_version','none')."</b></a><br />\
ESP01: <b>".InternalVal('ESP01-Reading1','ESP_BUILD_GIT','-')."</b><br />\
ESP02: <b>".InternalVal('ESP02-Reading1','ESP_BUILD_GIT','-')."</b><br />\
ESP03: <b>".InternalVal('ESP03-Reading1','ESP_BUILD_GIT','-')."</b>\
</p>"}
attr ESPEasy_version timeout 5

Hierbei muss nur bei ESP01: <b>".InternalVal('ESP01-Reading1','ESP_BUILD_GIT','-')."</b> das entsprechende ESP Device ESP01-Reading1 durch ein echtes ESP Device ersetzt werden.

dnscrypt-proxy:
defmod dnscrypt_proxy_version HTTPMOD https://api.github.com/repos/jedisct1/dnscrypt-proxy/releases/latest 86400
attr dnscrypt_proxy_version userattr reading01Name
attr dnscrypt_proxy_version extractAllJSON 1
attr dnscrypt_proxy_version extractAllJSONFilter tag_name
attr dnscrypt_proxy_version stateFormat {"<p align=\"left\">".ReadingsTimestamp($name,'tag_name','')."<br />Online: <a href=\"https://github.com/DNSCrypt/dnscrypt-proxy/blob/master/ChangeLog\"\
title=\"ChangeLog\" rel=\"noopener noreferrer\" target=\"_blank\"><b>".ReadingsVal($name,'tag_name','')."</b></a><br />\
installed: <b>".ReadingsVal($name,'installed_version','')."</b></p>"}
attr dnscrypt_proxy_version userReadings installed_version {ReadingsVal($name,"value","2.0.31");;}

allerdings muss hier die installierte Version manuell angepasst werden (userReading installed_version).

Vielleicht kann man sowas auch in ein Template einbauen. Oder jmd. kann es gebrauchen. Oder verbessern. :)
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

Beta-User

Vorab mal Danke für den Vorschlag bzw. die Vorschläge.

Zu ESPEasy:
Die Liste in dem stateFormat könnte man vermutlich ähnlich (und automatisiert) zusammenbauen wie bei dem homematic-template (CUL_HM_firmware_update_downloader), allerdings müßte das hier einfacher gehen.
Magst du dich daran mal versuchen, ist mMn. eine gute Perl-Übung  ;) ?
(Sonst finden sich evtl. auch andere ESPEasy-Nutzer, die das interessant finden...?)

Bei dem anderen verstehe ich den Umweg über das userReading im Moment nicht. Warum geht das nicht direkt via "value" (das muß man dann ggf. halt setzen mit setreading (+reload für die Anzeige), ist aber (ohne praktische Erfahrung damit zu haben dem Bauchgefühl nach) besser, als im Attribut rumzueditieren; die Bedienungsanleitung kann man ja z.B. in den comment nehmen).
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

yersinia

Zitat von: Beta-User am 11 November 2019, 16:59:10Die Liste in dem stateFormat könnte man vermutlich ähnlich (und automatisiert) zusammenbauen wie bei dem homematic-template (CUL_HM_firmware_update_downloader), allerdings müßte das hier einfacher gehen.
Magst du dich daran mal versuchen, ist mMn. eine gute Perl-Übung  ;) ?
(Sonst finden sich evtl. auch andere ESPEasy-Nutzer, die das interessant finden...?)
Da bin ich mir gar nicht so sicher, ob sich das sinnvoll umsetzen lässt. Es kann pro ESPEasy ja m devices geben, aber ich habe nur eine ESPEasy Version. (In meinem Fall: 3 ESPs und 8 ESP Devices) perl ist darüberhinaus auch nicht meine Haussprache. ;) Für mich funktioniert es erstmal, vielleicht überkommt es mich und ich pass' das irgendwann an.

Zitat von: Beta-User am 11 November 2019, 16:59:10Bei dem anderen verstehe ich den Umweg über das userReading im Moment nicht. Warum geht das nicht direkt via "value" (das muß man dann ggf. halt setzen mit setreading (+reload für die Anzeige), ist aber (ohne praktische Erfahrung damit zu haben dem Bauchgefühl nach) besser, als im Attribut rumzueditieren; die Bedienungsanleitung kann man ja z.B. in den comment nehmen).
Für mich war das ein gangbarer Weg mit dem UserReadings; ich meine, direkt den Text "2.0.31" einzugeben ging nicht. Oder ich war zu ungeduldig. Im Prinzip missbrauche ich die Funktion ReadingsVal hier.
Hinzu kommt, dass ich zum einen nicht weiss wie ich die Version des dnscrypt-proxys aus FHEM heraus aufrufe - und ich mir noch nicht einmal sicher bin, ob ich das will.
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

OdfFhem

@Beta-User

Hallo,

dies ist ein Vorschlag für die Prüfung auf mögliche Tasmota-Updates (optisch angelehnt an die Homematic-Variante).


defmod DEVICE HTTPMOD https://github.com/arendst/Tasmota/releases/latest 86400
attr DEVICE userattr reading01JSON reading01Name reading01OExpr reading01Regex reading02Name reading02OExpr reading02Regex reading03Name reading03OExpr reading03Regex
attr DEVICE alignTime 10:00
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 <h2>Changelog</h2>[\w\W]*?<p>Version (\d*.\d*.\d*)\s\d*</p>
attr DEVICE reading02Name latestDate
attr DEVICE reading02OExpr $val =~ m/^(.{4})(.{2})(.{2})$/ ;; "$3.$2.$1"
attr DEVICE reading02Regex <h2>Changelog</h2>[\w\W]*?<p>Version \d*.\d*.\d*\s(\d*)</p>
attr DEVICE room Tasmota
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat {   my $ret ="";;\
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;\
    $ret .= '<div style="text-align:left">';;\
    $ret .= 'last <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'">tasmota</a>-check => '.$lastCheck;;\
    $ret .= '<br><br><pre>';;\
    $ret .= "| device                           | current |   new   |  released  |<br>";;\
    $ret .= "---------------------------------------------------------------------<br>";;\
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
    if($check eq "no updates needed!") {\
      $ret .= '| <b style="color:green">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } elsif($check eq "error => no or wrong data from server!") {\
      $ret .= '| <b style="color:red">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } 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 .= '| <a href="/fhem?detail='.$dev.'"><b>';;\
        $ret .= sprintf("%-32s",$dev);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<b style="color:lightgray">';;\
        $ret .= sprintf("%7s",$old);;\
        $ret .= '</b> | ';;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
        $ret .= '<b style="color:red">';;\
        $ret .= sprintf("%7s",$new);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
        $ret .= '<b style="color:black">';;\
        $ret .= sprintf("%-10s",$date);;\
        $ret .= '</b></a>';;\
        $ret .= " |<br>";;\
      }\
    }\
    $ret .= '</pre></div>';;\
  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");;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;\
    foreach my $dev (devspec2array("TYPE=MQTT[2]?_DEVICE:FILTER=INFO1_Version=.*\\(.*sonoff\\)")) {\
      my $version = ReadingsVal($dev,"INFO1_Version","unknown");;\
      $version =~ m/([0-9.]*).*/;;\
      $version = $1;;\
      if($version ne $VERSION) {\
        $ret .= "," if($ret ne "");;\
        $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE.")";;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}
attr DEVICE webCmd reread

Beta-User

@OdfFhem: Wow, das ging schnell!

Hier dann das ganze mit der vorgesehenen "Einbettung" in die template-file:

name:tasmota_firmware_updates
filter:TYPE=HTTPMOD
desc: Check Tasmota homepage for available new firmware files<br>Define a HTTPMOD device like <br>define tasmotaupdates HTTPMOD https://github.com/arendst/Tasmota/releases/latest 86400<a href="https://forum.fhem.de/index.php/topic,97694.msg992308.html#msg992308">Source: Forum</a>.
order:X_01e
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
attr DEVICE userattr reading01JSON reading01Name reading01OExpr reading01Regex reading02Name reading02OExpr reading02Regex reading03Name reading03OExpr reading03Regex
attr DEVICE alignTime 10:00
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 <h2>Changelog</h2>[\w\W]*?<p>Version (\d*.\d*.\d*)\s\d*</p>
attr DEVICE reading02Name latestDate
attr DEVICE reading02OExpr $val =~ m/^(.{4})(.{2})(.{2})$/ ;; "$3.$2.$1"
attr DEVICE reading02Regex <h2>Changelog</h2>[\w\W]*?<p>Version \d*.\d*.\d*\s(\d*)</p>
attr DEVICE room Tasmota
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat {   my $ret ="";;\
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;\
    $ret .= '<div style="text-align:left">';;\
    $ret .= 'last <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'">tasmota</a>-check => '.$lastCheck;;\
    $ret .= '<br><br><pre>';;\
    $ret .= "| device                           | current |   new   |  released  |<br>";;\
    $ret .= "---------------------------------------------------------------------<br>";;\
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
    if($check eq "no updates needed!") {\
      $ret .= '| <b style="color:green">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } elsif($check eq "error => no or wrong data from server!") {\
      $ret .= '| <b style="color:red">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } 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 .= '| <a href="/fhem?detail='.$dev.'"><b>';;\
        $ret .= sprintf("%-32s",$dev);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<b style="color:lightgray">';;\
        $ret .= sprintf("%7s",$old);;\
        $ret .= '</b> | ';;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
        $ret .= '<b style="color:red">';;\
        $ret .= sprintf("%7s",$new);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
        $ret .= '<b style="color:black">';;\
        $ret .= sprintf("%-10s",$date);;\
        $ret .= '</b></a>';;\
        $ret .= " |<br>";;\
      }\
    }\
    $ret .= '</pre></div>';;\
  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");;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;\
    foreach my $dev (devspec2array("TYPE=MQTT[2]?_DEVICE:FILTER=INFO1_Version=.*\\(.*sonoff\\)")) {\
      my $version = ReadingsVal($dev,"INFO1_Version","unknown");;\
      $version =~ m/([0-9.]*).*/;;\
      $version = $1;;\
      if($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 enableControlSet 1
attr DEVICE model tasmota_firmware_updates

Wäre nett, wenn's vorab nochmal jemand gegentesten könnte, ich habe derzeit keine Tasmota-ESP's im Einsatz... Ansonsten geht das voraussichtlich für morgen ins svn.

Hier noch das andere, mMn. müßte das mit einem userattr genauso funktionieren, aber ich bekomme leider mit meinem Testsystem weder mit yersinias noch mit der template-Version irgendwelche Readings, daher aktualisiert sich das in STATE gar nicht...

name:dnscrypt-proxy_updates
filter:TYPE=HTTPMOD
desc: Show updates for <a href="https://dnscrypt.info/">DNSCRYPT.</a><br>Define a HTTPMOD device like <br>defmod dnscrypt_proxy_version HTTPMOD https://api.github.com/repos/jedisct1/dnscrypt-proxy/releases/latest 86400<br><a href="https://forum.fhem.de/index.php/topic,97694.msg992002.html#msg992002">Source: Forum</a>
order:X_01x
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
attr DEVICE userattr reading01Name myInstalledVersion
attr DEVICE extractAllJSON 1
attr DEVICE extractAllJSONFilter tag_name
attr DEVICE stateFormat {"<p align=\"left\">".ReadingsTimestamp($name,'tag_name','')."<br />Online: <a href=\"https://github.com/DNSCrypt/dnscrypt-proxy/blob/master/ChangeLog\"\
title=\"ChangeLog\" rel=\"noopener noreferrer\" target=\"_blank\"><b>".ReadingsVal($name,'tag_name','')."</b></a><br />\
installed: <b>".AttrVal($name,'myInstalledVersion','')."</b></p>"}
attr DEVICE myInstalledVersion 2.0.31
attr DEVICE room WHICHROOM
attr DEVICE enableControlSet 1
attr DEVICE model dnscrypt-proxy_updates
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

OdfFhem

@Beta-User / tasmota_firmware_updates

Noch einige, kleine Anmerkungen ...


Beim userattr haben leider ein paar Altlasten überlebt; sollte besser so aussehen:

attr DEVICE userattr reading01Name reading01Regex reading02Name reading02OExpr reading02Regex


Am Ende hast Du ein zweites attr DEVICE enableControlSet 1 eingeschleust - eine von beiden Stellen sollte wegfallen.

Gleiches gilt für den room; da sollte wohl besser meine "Vorgabe" wegfallen.

Fraglich ist außerdem, ob man via Template eine alignTime vorgeben will/soll ... dann prüfen alle zum gleichen Zeitpunkt ... würde ich im Zweifel eher wegfallen lassen, weil dann die nächste Prüfzeit vom ersten Prüfzeitpunkt abhängt ...

Beta-User

Thx für die Rückmeldung,

dass ich da was doppelt reingebaut hat, war wir irgendwie entgangen...

Das mit alignTime kann wirklich raus, zumal man das ja bei Bedarf auch manuell anschubsen kann.

Damit werde ich wohl das hier einchecken:

name:tasmota_firmware_updates
filter:TYPE=HTTPMOD
desc: Check Tasmota homepage for available new firmware files<br>Define a HTTPMOD device like <br>define tasmotaupdates HTTPMOD https://github.com/arendst/Tasmota/releases/latest 86400<a href="https://forum.fhem.de/index.php/topic,97694.msg992308.html#msg992308">Source: Forum</a>.
order:X_01e
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
attr DEVICE userattr reading01Name reading01Regex reading02Name reading02OExpr reading02Regex
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 <h2>Changelog</h2>[\w\W]*?<p>Version (\d*.\d*.\d*)\s\d*</p>
attr DEVICE reading02Name latestDate
attr DEVICE reading02OExpr $val =~ m/^(.{4})(.{2})(.{2})$/ ;; "$3.$2.$1"
attr DEVICE reading02Regex <h2>Changelog</h2>[\w\W]*?<p>Version \d*.\d*.\d*\s(\d*)</p>
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat {   my $ret ="";;\
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;\
    $ret .= '<div style="text-align:left">';;\
    $ret .= 'last <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'">tasmota</a>-check => '.$lastCheck;;\
    $ret .= '<br><br><pre>';;\
    $ret .= "| device                           | current |   new   |  released  |<br>";;\
    $ret .= "---------------------------------------------------------------------<br>";;\
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
    if($check eq "no updates needed!") {\
      $ret .= '| <b style="color:green">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } elsif($check eq "error => no or wrong data from server!") {\
      $ret .= '| <b style="color:red">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } 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 .= '| <a href="/fhem?detail='.$dev.'"><b>';;\
        $ret .= sprintf("%-32s",$dev);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<b style="color:lightgray">';;\
        $ret .= sprintf("%7s",$old);;\
        $ret .= '</b> | ';;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
        $ret .= '<b style="color:red">';;\
        $ret .= sprintf("%7s",$new);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
        $ret .= '<b style="color:black">';;\
        $ret .= sprintf("%-10s",$date);;\
        $ret .= '</b></a>';;\
        $ret .= " |<br>";;\
      }\
    }\
    $ret .= '</pre></div>';;\
  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");;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;\
    foreach my $dev (devspec2array("TYPE=MQTT[2]?_DEVICE:FILTER=INFO1_Version=.*\\(.*sonoff\\)")) {\
      my $version = ReadingsVal($dev,"INFO1_Version","unknown");;\
      $version =~ m/([0-9.]*).*/;;\
      $version = $1;;\
      if($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


Macht vermutlich Sinn, das dann auch noch irgendwo im Wiki zu verlinken, allerdings bin ich unschlüssig, wo (MQTT#Tasmota, ESP8266, Praxisbeispiele?)... (Btw.: Ein Screenshot von dem HTTPMOD "in Aktion" für's/im Wiki wäre hilfreich.).

@yersinia:
Evtl. ist es auf dieser Basis jetzt deutlich einfacher, den Transfer auch für ESPEasy hinzubekommen? (Ich habe aber zugegebenermaßen den Einwand nicht so ganz verstanden, dass die Zahlen/Versionen nicht passen müssen. Das obige template sollte (wenn es ist wie bei HM) immer nur jeweils die Microcontroller anzeigen, die nicht die aktuelle firmware haben und den Rest/die aktuellen gar nicht.)
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

OdfFhem

@Beta-User / tasmota_firmware_updates

Ich habe Deine Template-Fassung mal getestet und daraus ergibt sich noch eine wichtige Anpassung ...

Die Zeile

foreach my $dev (devspec2array("TYPE=MQTT[2]?_DEVICE:FILTER=INFO1_Version=.*\\(.*sonoff\\)")) {\

muss durch folgende Zeile ersetzt werden

foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=INFO1_Version=.*\\(.*sonoff\\)")) {\


Ansonsten wird DEVICE durch den Gerätenamen ersetzt ... und das soll ja nicht passieren.