FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: Damian am 17 Oktober 2026, 14:17:20

Titel: noch ein Thermostat
Beitrag von: Damian am 17 Oktober 2026, 14:17:20
defmod di_Thermostat DOIF (1)
attr di_Thermostat room Heizung
attr di_Thermostat uiTable {\
  package $SELF;;;;\
\
  sub FUNC_thermostat {\
    my ($ist, $soll, $device, $name) = @_;;\
\
    $ist = 0\
      if !defined($ist) || $ist !~ /^-?\d+(?:\.\d+)?$/;;\
\
    $soll = 20\
      if !defined($soll) || $soll !~ /^-?\d+(?:\.\d+)?$/;;\
\
    $soll = 5  if $soll < 5;;\
    $soll = 30 if $soll > 30;;\
\
    my $minus = $soll - 0.5;;\
    my $plus  = $soll + 0.5;;\
\
    $minus = 5  if $minus < 5;;\
    $plus  = 30 if $plus > 30;;\
\
    my $istText  = sprintf("%.1f", $ist);;\
    my $sollText = sprintf("%.1f", $soll);;\
\
    my $cmdMinus =\
      "set $device desired-temp " . sprintf("%.1f", $minus);;\
\
    my $cmdPlus =\
      "set $device desired-temp " . sprintf("%.1f", $plus);;\
\
    my $urlMinus = main::urlEncode($cmdMinus);;\
    my $urlPlus  = main::urlEncode($cmdPlus);;\
\
    my $csrf = defined($main::FW_CSRF) ? $main::FW_CSRF : "";;\
    $csrf =~ s/&/&amp;;/g;;\
\
    my $html =\
      "<div style=\"text-align:center;;;;min-width:150px;;;;padding:6px;;;;border:1px solid #888;;;;border-radius:8px\">";;\
\
    $html .=\
      "<div style=\"font-size:18px;;;;color:#888\">$name</div>";;\
\
    $html .=\
      "<div style=\"font-size:24px;;;;font-weight:bold;;;;padding:1px 0\">$istText&deg;;C</div>";;\
\
    $html .=\
      "<div style=\"font-size:11px;;;;color:#888;;;;margin-top:2px\">SOLLTEMPERATUR</div>";;\
\
    $html .=\
      "<div style=\"display:flex;;;;align-items:center;;;;justify-content:center;;;;gap:10px;;;;margin-top:4px\">";;\
\
    if ($soll > 5) {\
      $html .=\
        "<span onmousedown=\"this.style.backgroundColor=&quot;;#aaa&quot;;;;this.style.transform=&quot;;scale(0.92)&quot;;\" onmouseup=\"this.style.backgroundColor=&quot;;&quot;;;;this.style.transform=&quot;;&quot;;\" onmouseleave=\"this.style.backgroundColor=&quot;;&quot;;;;this.style.transform=&quot;;&quot;;\" onclick=\"FW_cmd(FW_root+&quot;;?cmd=$urlMinus&amp;;XHR=1$csrf&quot;;);;return false;;\" style=\"display:inline-block;;;;font-size:18px;;;;width:32px;;;;padding:2px 0;;;;border:1px solid #888;;;;border-radius:5px;;;;cursor:pointer;;;;transition:background-color 0.05s,transform 0.05s\">-</span>";;\
    } else {\
      $html .=\
        "<span style=\"font-size:18px;;;;width:32px\">-</span>";;\
    }\
\
    $html .=\
      "<span style=\"font-size:21px;;;;font-weight:bold;;;;min-width:50px\">$sollText&deg;;C</span>";;\
\
    if ($soll < 30) {\
      $html .=\
        "<span onmousedown=\"this.style.backgroundColor=&quot;;#aaa&quot;;;;this.style.transform=&quot;;scale(0.92)&quot;;\" onmouseup=\"this.style.backgroundColor=&quot;;&quot;;;;this.style.transform=&quot;;&quot;;\" onmouseleave=\"this.style.backgroundColor=&quot;;&quot;;;;this.style.transform=&quot;;&quot;;\" onclick=\"FW_cmd(FW_root+&quot;;?cmd=$urlPlus&amp;;XHR=1$csrf&quot;;);;return false;;\" style=\"display:inline-block;;;;font-size:18px;;;;width:32px;;;;padding:2px 0;;;;border:1px solid #888;;;;border-radius:5px;;;;cursor:pointer;;;;transition:background-color 0.05s,transform 0.05s\">+</span>";;\
    } else {\
      $html .=\
        "<span style=\"font-size:18px;;;;width:32px\">+</span>";;\
    }\
\
    $html .= "</div></div>";;\
\
    return $html;;\
  }\
}\
\
FUNC_thermostat([TH_WZ_HM:measured-temp],[TH_WZ_HM:desired-temp],"TH_WZ_HM","Wohnzimmer")

Man kann am Ende durch Hinzufügen weiterer Zeilen beliebig viele Thermostate nebeneinander oder untereinander als Tabelle darstellen.

Die Solltemperatur kann mit Plus und Minus geändert werden. Der Befehl zum Setzen (set $device desired-temp) der Temperatur kann für das eigene Thermostat im Code angepasst werden.