diff --git a/fhem/FHEM/lib/AttrTemplate/httpmod.template b/fhem/FHEM/lib/AttrTemplate/httpmod.template
index cc7a86b37..2cba0d372 100644
--- a/fhem/FHEM/lib/AttrTemplate/httpmod.template
+++ b/fhem/FHEM/lib/AttrTemplate/httpmod.template
@@ -564,3 +564,176 @@ attr DEVICE userReadings newFwForDevices:MATCHED_READINGS.* {\
}
attr DEVICE webCmd reread
attr DEVICE model CUL_HM_firmware_update_downloader
+
+#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/releases/latest 86400Source: Forum.
+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
Version (\d*.\d*.\d*)\s\d*
+attr DEVICE reading02Name latestDate +attr DEVICE reading02OExpr $val =~ m/^(.{4})(.{2})(.{2})$/ ;; "$3.$2.$1" +attr DEVICE reading02RegexVersion \d*.\d*.\d*\s(\d*)
+attr DEVICE showError 1 +attr DEVICE showMatched 1 +attr DEVICE stateFormat { my $ret ="";;\ + my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;\ + $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 .= '
';;\ + $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 .= '
".ReadingsTimestamp($name,'tag_name','')."
Online: ".ReadingsVal($name,'tag_name','')."
\
+pihole: ".AttrVal($name,'pihole_version','')."