curl --head --insecure https://fhempi
HTTP/2 302
server: nginx
content-type: text/html; charset=utf-8
location: https://fhempi/login
cache-control: max-age=0, must-revalidate, private
date: Mon, 09 Feb 2026 14:55:29 GMT
expires: Mon, 09 Feb 2026 14:55:29 GMT
set-cookie: PHPSESSID=bd97a3d97777e733a32c36c237d1d4da; path=/; secure; httponly; samesite=lax
x-content-type-options: nosniff
x-frame-options: SAMEORIGINcat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.1.1 fhempiZitat von: Wernieman am 09 Februar 2026, 17:56:57Komisch .. wie häufig ich schon bei diversen Projekten von "Umsteigern" solche Werbung gehört habe ....
warum bist Du dann auch wieder da?
(Sorry musste mal raus ... da schöne ist ja, das es verschiedene Arten gibt ein Problem zu lösen. Jedem das seine)

defmod z2m_version_check HTTPMOD https://api.github.com/repos/Koenkk/zigbee2mqtt/releases/latest 86400
attr z2m_version_check userattr bridgeRegexp showDevices:all,updatable
attr z2m_version_check bridgeRegexp TYPE=MQTT2?_DEVICE:FILTER=NAME=.*zigbee.*bridge.*
attr z2m_version_check devStateIcon {\
my $lver = ReadingsVal($name,'latestVersion','');;\
my $spec = AttrVal($name,'bridgeRegexp','TYPE=MQTT2?_DEVICE:FILTER=NAME=.*zigbee.*bridge.*');;\
my $url = 'https://github.com/Koenkk/zigbee2mqtt/';;\
my $link = '<a title="z2m versions" href="'.$url.'tags" target="_blank">z2m version</a>';;\
my $fwb = 'font-weight:bold';;\
my $tal = 'text-align:left';;\
my $tar = 'text-align:right';;\
my $ret = '<div style="'.$tal.'">';;\
$ret .= '<p>last '.$link.' check: '.POSIX::strftime('%d.%m.%Y %H:%M',localtime(time_str2num(ReadingsTimestamp($name,'latestVersion','1970-01-01 00:00:00')))).'</p>';;\
my $update = AttrVal($name,'showDevices','updatable');;\
my $state = devspec2array($spec)?InternalVal($name,'STATE',''):'error => no valid devices found for devspec "'.$spec.'"';;\
if ($state =~ m/^error/x) {\
$ret .= '<p style="color:red;;'.$fwb.'">'.$state.'</p>'\
} else {\
$ret .= '<p style="color:limegreen;;'.$fwb.'">'.$state.'</p>';;\
if ($state =~ m/^\d/x || $update eq 'all') {\
my @devs = devspec2array($spec.($update eq 'all'?'':':FILTER=r:version!='.$lver));;\
if (@devs) {\
$url .= 'releases/tag/';;\
my $bs = '1px solid grey';;\
my $pa = 'padding:5px';;\
my $br = 'border-right:'.$bs.';;'.$pa;;\
$ret .= '<table style="'.$tal.';;border-collapse:collapse;;margin:10px 0 10px 0">';;\
$ret .= '<thead><tr style="border-bottom:'.$bs.'"><th style="'.$br.'">device</th><th style="'.$br.';;'.$tar.'">current</th><th style="'.$br.';;'.$tar.'">new</th><th style="'.$pa.';;'.$tar.'">released</th></tr></thead>';;\
$ret .= '<tbody>';;\
my $cdevs = 0;;\
for (@devs) {\
my $ver = ReadingsVal($_,'version','');;\
next if ($ver !~ m/^(\d+\.){2}\d+$/x);;\
$cdevs += 1;;\
$ret .= '<tr'.($cdevs==scalar(@devs)-1?' style="border-bottom:'.$bs.'"':'').'>';;\
$ret .= '<td style="'.$br.'"><a href="/fhem?detail='.$_.'">'.AttrVal($_,'alias',$_).'</a></td>';;\
$ret .= '<td style="'.$br.';;'.$tar.'"><a href="'.$url.$ver.'" target="_blank">'.$ver.'</a></td>';;\
$ret .= '<td style="'.$br.';;'.$tar.'"><a'.($ver ne $lver?' style="color:red!important;;'.$fwb.'"':'').' href="'.$url.$lver.'" target="_blank">'.$lver.'</a></td>';;\
$ret .= '<td style="'.$pa.';;'.$tar.'"><a ref="'.$url.$lver.'" target="_blank">'.ReadingsVal($name,'latestDate','').'</a></td>';;\
$ret .= '</tr>';;\
}\
$ret .= '</tbody></table>';;\
}\
}\
}\
$ret .= '<p">next '.$link.' check: '.POSIX::strftime('%d.%m.%Y %H:%M',localtime(InternalVal($name,'.TRIGGERTIME',0))).'</p>';;\
$ret .= '</div>';;\
return $ret;;\
}
attr z2m_version_check enableControlSet 1
attr z2m_version_check event-on-change-reading latestVersion
attr z2m_version_check event-on-update-reading latestDate
attr z2m_version_check handleRedirects 0
attr z2m_version_check icon mqtt_bridge_1
attr z2m_version_check reading01JSON tag_name
attr z2m_version_check reading01Name latestVersion
attr z2m_version_check reading01OExpr $val =~ m/^(\d+\.){2}\d+$/x;; $val
attr z2m_version_check reading02JSON published_at
attr z2m_version_check reading02Name latestDate
attr z2m_version_check reading02OExpr $val =~ m/^(\d{4})-(\d\d)-(\d\d)T.*$/x;; "$3.$2.$1"
attr z2m_version_check stateFormat {\
my $ret;;\
if (!ReadingsVal($name,'latestVersion','')) {\
$ret = 'error => no/wrong data from server!'\
} else {\
my @devs = devspec2array(AttrVal($name,'bridgeRegexp','TYPE=MQTT2?_DEVICE:FILTER=NAME=.*zigbee.*bridge.*'));;\
my $cupd = 0;;\
for (@devs) {\
my $ver = ReadingsVal($_,'version','');;\
$cupd += 1 if ($ver =~ /^((\d+\.){2}\d+)$/ && $ver ne ReadingsVal($name,'latestVersion',''))\
}\
$ret = $cupd==0?'no z2m update'.(scalar(@devs)>1?'s':'').' needed!':$cupd.' update'.($cupd>1?'s':'').' needed!';;\
}\
return $ret;;\
}
attr z2m_version_check webCmd reread
Zitat von: betateilchen am 07 Februar 2026, 11:53:37Warum prüft man nicht einfach auf den 33. Tag des Jahres, anstatt unzählige Vergleiche auf Monat und Tag zu machen?
Zumindest mir erschließt sich die gewünschte Funktion so leichter, beim späteren lesen.ZitatFür das Ausfüllen des Symbols habe ich einen Änderungsvorschlag (siehe Diff-Datei).Das wuerde bewirken, dass die Flaeche nicht mit der vom ausgewaehlten Stil bestimmten Fuellfarbe gefuellt wird, sondern mit der Linienfarbe.
ZitatNicht gefunden habe ich die Stelle für die Plot-Legende. Die kommt immer noch in der falschen Farbe.Bei mir scheint sie in Ordnung zu sein.
Zitat von: betateilchen am 12 Februar 2025, 13:41:56Aber da kommst Du sicher auch noch drauf![]()


<!-- 3b CHART Spritpreise DIESEL mit POPUP -->
<li data-row="5" data-col="11" data-sizex="4" data-sizey="3">
<div class="top-narrow" data-type="popup" data-mode="fade" data-width="1100px" data-height="720px">
<div
data-type="chart"
data-height="185px"
data-device="TankstelleARAL"
data-get="Diesel"
data-logdevice="logdb"
data-logfile="HISTORY"
data-columnspec='["TankstelleARAL:Diesel","TankstelleESSO:Diesel","TankstelleSTAR:Diesel"]'
data-style='["ftui l0", "ftui l2", "ftui l4"]'
data-ptype='["lines","lines","lines"]'
data-uaxis='["primary","primary","primary"]'
data-ytext="D I E S E L"
data-minvalue="1.1"
data-maxvalue="1.7"
data-xticks="auto"
data-yticks="0.05"
data-yticks_format="#.##"
data-daysago_start="0"
data-daysago_end="-1"
data-showlegend="false"
class="nobuttons home_sprit_chart1">
</div>
<div class="dialog">
<header>
<div class="home_sprit_popchart_head">
<table width="60%">
<tr>
<th class="home_sprit_ARALhead">ARAL</th>
<th class="home_sprit_ESSOhead">ESSO</th>
<th class="home_sprit_STARhead">STAR</th>
</tr>
</table>
</div>
</header>
<div
data-type="chart"
data-height="320px"
data-device="TankstelleARAL"
data-get="Diesel"
data-logdevice="logdb"
data-logfile="HISTORY"
data-columnspec='["TankstelleARAL:Diesel","TankstelleESSO:Diesel","TankstelleSTAR:Diesel"]'
data-style='["ftui l0", "ftui l2", "ftui l4"]'
data-ptype='["lines","lines","lines"]'
data-uaxis='["primary","primary","primary"]'
data-ytext="D I E S E L"
data-minvalue="1.1"
data-maxvalue="1.7"
data-xticks="auto"
data-yticks="0.05"
data-yticks_format="#.##"
data-daysago_start="2"
data-daysago_end="-1"
data-showlegend="false"
data-crosshair="true"
>
</div>
<div
data-type="chart"
data-height="320px"
data-device="TankstelleARAL"
data-get="Diesel"
data-logdevice="logdb"
data-logfile="HISTORY"
data-columnspec='["TankstelleARAL:SuperE5","TankstelleESSO:SuperE5","TankstelleSTAR:SuperE5"]'
data-style='["ftui l0", "ftui l2", "ftui l4"]'
data-ptype='["lines","lines","lines"]'
data-uaxis='["primary","primary","primary"]'
data-ytext="S U P E R"
data-minvalue="1.2"
data-maxvalue="1.75"
data-xticks="auto"
data-yticks="0.05"
data-yticks_format="#.##"
data-daysago_start="2"
data-daysago_end="-1"
data-showlegend="false"
data-crosshair="true"
class="home_sprit_popchart2">
</div>
</li>
<!-- Ende CHART DIESEL -->