Hauptmenü

Neueste Beiträge

#1
Solaranlagen / Aw: 76_SolarForecast - Informa...
Letzter Beitrag von Rave Rebel - 06 Oktober 2025, 21:30:43
Hallo zusammen, nach dem Update auf die aktuelle Version sind nahezu alle Icons in der Flow Graphic winzig klein und nahezu nicht mehr sichtbar.
Wie kann ich das beheben?

Gruß Chris
#2
Automatisierung / Aw: ctrl + c über script
Letzter Beitrag von Guybrush - 06 Oktober 2025, 20:55:56
wie rufst du das denn auf? ext. script kann ja alles mögliche heissen.. unter linux wäre das zb einfach mit "kill -INT <pid>"
#3
Automatisierung / ctrl + c über script
Letzter Beitrag von satprofi - 06 Oktober 2025, 20:45:33
Hallo.
Habe hier ein ext. script, das zum beenden ctrl + c über tastatur verlangt. wie kann ich das aber automatisch erledigen lassen?
das script erneuert einen token, und solange es nicht beendet ist kann man sich mit fhem dort nicht einloggen.
#4
Anfängerfragen / Shelly1 mit ESPeasy: devStateI...
Letzter Beitrag von TubeHead - 06 Oktober 2025, 20:18:48
Hallo Forengemeinde,

ich habe gerade einen alter Shelly1 wiederbelebt, da ESPeasy drauf geflasht und in FHEM eingebunden. Dsa klappt vollkommen schmerzfrei soweit.
Wo ich aber gegen die Wand laufe, ist meine bevorzugte devStateIcon - Definition.
In State wird leider nicht einfach nur "on|off" dargestellt, sondern "Rel: on|Rel: off". Dsa habe ich noch hinbekommen.
Wo ich aber dran scheitere, ist das Umschalten des Relais mit der Definition als drittes Attribut hinter der Icon-Definition.
Schalten kann ich per "gpio 4 on|gpio 4 off". Das aber als drittes Attribut zu definieren schaffe ich nicht.
Die Definition in WebCMD hingegen funktioniert so.

Hier mal der aktuelle Stand meiner Experimente:

defmod SH_DFUE_PSU ESPEasy 192.168.1.82 80 espBridge SH_DFUE_PSU
attr SH_DFUE_PSU Interval 300
attr SH_DFUE_PSU devStateIcon .*on:message_socket@lime:gpio-4-off .*off:message_socket@grey:gpio-4-on
attr SH_DFUE_PSU group ESPEasy Device
attr SH_DFUE_PSU presenceCheck 1
attr SH_DFUE_PSU readingSwitchText 1
attr SH_DFUE_PSU room 321 - Büro,_90 HW - ESPeasy
attr SH_DFUE_PSU setState 3
attr SH_DFUE_PSU webCmd gpio 4 on:gpio 4 off

setstate SH_DFUE_PSU Rel: on
setstate SH_DFUE_PSU 2025-10-06 20:17:34 Relay on
setstate SH_DFUE_PSU 2025-10-06 20:16:33 presence present
setstate SH_DFUE_PSU 2025-10-06 20:17:34 state Rel: on

Frage ist also, wie man es fertig bringt, bei einem Klick auf das Icon den Zustand des GPIO 4 zu ändern, wie es beim WebCMD funktioniert.
#5
Anfängerfragen / Aw: Tabelle
Letzter Beitrag von Sebastian84 - 06 Oktober 2025, 19:21:44
Hab das in das device "attr FBDECT_FritzBox_11963_0142552 batteryType ignore" in Raw definition eingetragen. Aber trotzdem kommt in den Gruppen reading.
#6
DOIF / Aw: Übergroße Symbole in uitab...
Letzter Beitrag von Damian - 06 Oktober 2025, 19:16:13
Zitat von: JudgeDredd am 06 Oktober 2025, 18:43:27Du gehörst aber (zum Glück der User) auch zur Gruppe der Hyperativen, oder ? 😉
Habe mir gerade mal das Update gezogen. Alles bestens, weder als Desktop noch Mobil keinerlei Anzeigefehler (bei mir).
Vielen Dank für den superschnellen Fix.
Gruß,
JudgeDredd

Naja, wenn man selber auf dem Desktop nichts mehr sieht, dann liegt es in der Natur der Sache :)
#7
Automatisierung / Aw: Rollo-Steuerung durch Hell...
Letzter Beitrag von DerITler - 06 Oktober 2025, 19:13:22
Super! Danke dir!
#8
Automatisierung / Aw: Rollo-Steuerung durch Hell...
Letzter Beitrag von frober - 06 Oktober 2025, 19:02:10
Da ich es hier veröffentliche, nochmal der Hinweis:
Der Code dient rein als Inspiration und ist so nicht verwendbar, da er auf mein Haus/meine Fhem-Konfiguration maßgeschneidert ist!!!


Das notify ist simpel:
defmod n_Beschattung notify Sonnenstand:azimuth:.* {beschattung()}Sonnenstand ist mein Twilight-Device, beschattung() die Sub die in MyUtils aufgerufen wird.

Die Temperaturdifferenz wird über userReadings direkt im Device (bei mir ein Dummy) berechnet.

Für den Vergleich der Uhrzeit benutze ich eine separate Sub:
sub CalculateTime()
{
  return strftime("%H%M", localtime());            # 1528 -> ohne Doppelpunkt, zum Vergleichen
}

und hier die eigentliche Sub:
sub beschattung {

  # debug
  my $logging = 0;

  # definition von azimuth pro Himmelsrichtung (Ausgerichten an Ost = Schlafzimmer, Sued = Küche, West = Esszi, Nord = Wohnzi)
  my $RolloOstZu    =  10;    #  -6° ??
  my $RolloOstAuf    = 127;    # 127°
  my $RolloSuedZu    =  82;    #  82°
  my $RolloSuedAuf    = 220;    # 214°
  my $RolloWestZu    = 162;    # 162°
  my $RolloWestAuf    = 286;    # 318°
  my $RolloNordZu    = 251;    # 251°
  my $RolloNordAuf    = 286;    # 360° ??
 
  # Definition der Grenzwerte
  my $pctDiff        =  8;                                                    # Differenz, wann die Rollos an die Sonnenhöhe angepasst werden
  my $BeschGrenze    = 20;                                                    # Tempdiff, Grenze für Beschattung
  my $maxRolloClose = 15;                                                    # maximale Beschattung (Rillen offen)
  my $SonnenHoeheMin=  5;                                                    # minimale Sonnenhöhe, wo die Berechnungern ausgeführt werden
     
  # Zustand der Rolladen (auf/zu)
  my $RolloOst        = ReadingsVal('MQTT2_Rollo_WC','state',100);
  my $RolloSued        = ReadingsVal('MQTT2_Rollo_Kueche_Sued','state',100);
  my $RolloWestU     = ReadingsVal('RolloWestUnten','state',100);
  my $RolloWestO     = ReadingsVal('RolloWestOben','state',100);
  my $RolloNord        = ReadingsVal('MQTT2_Rollo_Wohnzimmer','state',100);
  my $RolloSchlafzi = ReadingsVal('MQTT2_Rollo_Schlafzimmer','state',100);  # Schlafzimmer ganztags zu bei Sonne
 
  my $Sonnenstand    = ReadingsNum('Sonnenstand','azimuth','err',1);            # azimuth (0 = Nord, 180 = Süd)
  return debug('Sonnenstand konnte nicht gelesen werden') if ($Sonnenstand eq "err");
  my $Sonnenhoehe    = ReadingsNum('Sonnenstand','elevation',0,1);            # elevation (starten bei 20°, max. 60°)
  my $Beschattung    = ReadingsNum('Sonnenstand','beschatten',1);            # 1 = beschatten, 0 = nicht beschatten, ermitteln über Bewölkung, reading setzen und timestamp auswerten
  my $Tempdiff        = ReadingsNum('SonnenTemp','TempDiff',0,1);                # Differenz "Sonnentemp" - Lufttemp (Test bei 10°)
  my $Aussentemp    = ReadingsNum('KS300','temperature',0,1);                # Fahren ab 20°C Außentemeratur
  my $TuerWohn        = 'zu';                                                    # Fahren verhindern bei auf
  my $TuerEss        = 'zu';                                                    # Fahren verhindern bei auf
  my $Wohntemp        = ReadingsNum('BME280','temperature',22);                # Wohnraumtemperatur
  my $WohnT         = 0;                                                    # Unter 21°C im Wohnraum nicht beschatten
  my $Badtemp        = ReadingsNum('Bad','temperature',22);                    # Badtemperatur
  my $BadT             = 0;                                                    # Unter 21°C im Bad RolloObenWest nicht beschatten
  my $cTime            = CalculateTime();
  my $SonnenUnterg  = 0;
 
 
  if ($cTime >= 1900)
  {
    debug('Beschattung wurde aufgerufen') if $logging;
  }
 
 
  return if($Sonnenhoehe < $SonnenHoeheMin && $cTime < 900); # verhindert, dass Rollos zu früh am Morgen auf gehen
  # Bewölkung ermitteln
  if ($Sonnenhoehe >= $SonnenHoeheMin)
  {
      if ($Aussentemp >= 27)         # bei hohen Aussentemperaturen wird die Tempdiff kleiner, daher wird die Grenze herabgesetzt (alt Temp = 27, Diff = 16/13)
    {
          $BeschGrenze = 13;
      }
     if ($Aussentemp <= 19)         # bei niedrigen Aussentemperaturen (alt = 20°) wird die Tempdiff größer, daher wird die Grenze hoch gesetzt
    {
          $BeschGrenze = 25;
      }
    if ($cTime < 940)             # vor 09:40 Uhr Tempdiff auf 15 setzen, damit die Verschattung im Schlafzimmer rechtzeitig funktioniert
    {
          $BeschGrenze = 11;
      }
    if ($Sonnenhoehe <= 16 && $cTime > 1930)
    {
        $SonnenUnterg = 1;
        debug("Sonnenuntergang aktiv") if $logging;
    }
    if ($Aussentemp > 30 && $Tempdiff >= $BeschGrenze && $Beschattung != 2 && $SonnenUnterg != 1)
    {
        $Beschattung = 2;       # alle Fenster beschatten (Wärmestrahlung)
        fhem('setreading Sonnenstand beschatten 2');
        debug("Beschattung aktiviert (Tempdiff)") if $logging;
    }
      elsif ($Aussentemp <= 30 && $Tempdiff >= $BeschGrenze && $Beschattung != 1 && $SonnenUnterg != 1)
    {
        $Beschattung = 1;       # nur Fester mit direkter Sonneneinstrahlung beschatten
        fhem('setreading Sonnenstand beschatten 1');
        debug("Beschattung aktiviert (Tempdiff)") if $logging;
    }
    elsif ($Tempdiff < $BeschGrenze && $Beschattung != 0 || $SonnenUnterg == 1)
    {
        $Beschattung = 0;       
        fhem('setreading Sonnenstand beschatten 0');
        debug("Beschattung deaktiviert (Tempdiff)") if $logging;
    }
  }
  my $EinstrahlZeit = ReadingsAge('Sonnenstand','beschatten',0);            # bewölkt seit in sek.
 
 
  # Bei Sonnenschein länger als xxx und Sonnenstand öffnen, bzw. schließen
  if ($Sonnenhoehe >= $SonnenHoeheMin && $Beschattung == 1 && $EinstrahlZeit > 120) {
  
    my $pct = int(0.5 + $Sonnenhoehe - 25);                    # anpassung des Beschattungswinkels (bei 60° Sonnenhöhe -> Rolladen 50% geschlossen)
    if ($pct < $maxRolloClose) {$pct = $maxRolloClose};        # Rolladen nicht ganz zu fahren (Rillen noch offen)
    my $pct1 = $pct - 15;                                    # Beschattungswert für Rolladen oben (höhere Fenster)
    if ($pct1 < 15) {$pct1 = 15};                            # RolladenOben nicht ganz zu fahren (Rillen noch offen)
   
    if ($Wohntemp >= 21) {$WohnT = 1;}                        # nur fahren wenn Wohntemperatur größer 21°C ist -> vereinfachte Schreibweise (if $WohnT)
    if ($Badtemp  >= 21) {$BadT  = 1;}                        # nur fahren wenn Badtemperatur größer 21°C ist  -> vereinfachte Schreibweise (if $BadT)
   
    if ($Sonnenstand > $RolloOstZu && $Sonnenstand < $RolloOstAuf)
    {
        if ($pct > $RolloOst + $pctDiff || $pct < $RolloOst - $pctDiff)
        {
            fhem("set MQTT2_Rollo_WC pct $pct");
            debug("Rolladen WC wird auf $pct% _ZU_ gefahren") if $logging;
            $selectlog = 1;
        }
    }
    elsif ($Sonnenstand > $RolloOstAuf)
    {
        if ($RolloOst != 100)
        {
            fhem('set MQTT2_Rollo_WC pct 100');
            debug('Rolladen WC wird _AUF_ gefahren') if $logging;
        }
    }
    if ($Sonnenstand > $RolloOstZu && $Sonnenstand < $RolloWestAuf)  # Rollo Schlafzimmer ganztags zu, wenn Sonne scheint
    {
        my $Urlaub = 0;
        if (IsWe() && $cTime <= 800) {$Urlaub = 1;}
        if ($RolloSchlafzi != 15 && $Urlaub == 0)
        {
            fhem('set MQTT2_Rollo_Schlafzimmer pct 15');
            debug('Rolladen Schlafzimmer wird auf 15% _ZU_ gefahren') if $logging;
            $selectlog = 1;
        }
    }
    elsif ($Sonnenstand > $RolloWestAuf)
    {
        if ($RolloSchlafzi != 100)
        {
            fhem('set MQTT2_Rollo_Schlafzimmer pct 100');
            debug('Rolladen Schlafzimmer wird _AUF_ gefahren') if $logging;
        }
    }
    if ($Sonnenstand > $RolloSuedZu && $Sonnenstand < $RolloSuedAuf)
    {
        if ($pct > $RolloSued + $pctDiff || $pct < $RolloSued - $pctDiff)
        {
            fhem("set MQTT2_Rollo_Kueche_Sued pct $pct") if $WohnT;                        # nur schließen, wenn es im Wohnraum mehr als 21°C sind
            debug("Rolladen Sued wird auf $pct% _ZU_ gefahren") if $logging && $WohnT;
            $selectlog = 1 if $WohnT;
        }
    }
    elsif ($Sonnenstand > $RolloSuedAuf)
    {
        if ($RolloSued != 100)
        {
            fhem('set MQTT2_Rollo_Kueche_Sued pct 100');
            debug('Rolladen Sued wird _AUF_ gefahren') if $logging;
        }
    }
    if ($Sonnenstand > $RolloWestZu && $Sonnenstand < $RolloWestAuf)
    {
        if ($pct > $RolloWestU + $pctDiff || $pct < $RolloWestU - $pctDiff)
        {
            fhem("set RolloWestUnten pct $pct") if $WohnT;                                 # nur schließen, wenn es im Wohnraum mehr als 21°C sind
            debug("Rolladen West unten wird auf $pct% _ZU_ gefahren") if $logging && $WohnT;
            $selectlog = 1 if $WohnT;
        }
        if ($pct1 > $RolloWestO + $pctDiff || $pct1 < $RolloWestO - $pctDiff)
        {
            fhem("set RolloWestOben pct $pct1") if $BadT;                                 # nur schließen, wenn es im Bad mehr als 21°C sind
            debug("Rolladen West oben wird auf $pct1% _ZU_ gefahren") if $logging && $BadT;
            $selectlog = 1 if $BadT;
        }
    }
    elsif ($Sonnenstand > $RolloWestAuf)
    {
        if ($RolloWestU != 100)
        {
            fhem('set RolloWestOben pct 100');
            debug('Rolladen West wird _AUF_ gefahren') if $logging;
        }
    }
    if ($Sonnenstand > $RolloNordZu && $Sonnenstand < $RolloNordAuf)
    {
        if ($pct > $RolloNord + $pctDiff || $pct < $RolloNord - $pctDiff && $WohnT == 1)    # nur schließen, wenn es im Wohnraum mehr als 21°C sind 
        {
            if ($TuerEss ne 'offen') {fhem("set MQTT2_Rollo_Esszi_Nord pct $pct")};   # nicht fahren bei geöffneter Terrassentür ->Im Shelly shedule ausschalten!
            if ($TuerWohn ne 'offen') {fhem("set MQTT2_Rollo_Wohnzimmer pct $pct")};  # nicht fahren bei geöffneter Terrassentür ->Im Shelly shedule ausschalten!
            debug("Rolladen Nord wird auf $pct% _ZU_ gefahren") if $logging;
            $selectlog = 1;
        }
    }
    elsif ($Sonnenstand > $RolloNordAuf)
    {
        if ($RolloNord != 100)
        {
            fhem('set RolloNord pct 100');
            debug('Rolladen Nord wird _AUF_ gefahren') if $logging;
        }
    }
    debug("Azimuth = $Sonnenstand, Sonnenhoehe = $Sonnenhoehe, Temp = $Aussentemp, Ost = $RolloOst, Sued = $RolloSued, West = $RolloWestU, Nord = $RolloNord, Beschgr = $BeschGrenze, Tempdiff = $Tempdiff, Sonne scheint $Beschattung seit $EinstrahlZeit s") if $logging;
    debug("PCT = $pct%, PCT1 = $pct1%, Wohntemp = $Wohntemp, WohnT = $WohnT, Badtemp = $Badtemp, BadT = $BadT") if $logging;
    return;
  }
 
  # Bei Aussentemperatur von > 30°C alle Fenster beschatten (Wärmestrahlung)
  if ($Sonnenhoehe >= $SonnenHoeheMin && $Beschattung == 2 && $EinstrahlZeit > 120) {
  
    my $pct = $maxRolloClose;                       # RolladenOben nicht ganz zu fahren (Rillen noch offen)
   
    if ($Sonnenstand > $RolloOstZu && $Sonnenstand < $RolloNordAuf)
    {
        fhem("set RolloAlle pct $pct");
        debug("Alle Rolladen werden auf $pct% _ZU_ gefahren") if $logging;
        $selectlog = 1;
    }
   
    debug("Azimuth = $Sonnenstand, Sonnenhoehe = $Sonnenhoehe, Temp = $Aussentemp, Ost = $RolloOst, Sued = $RolloSued, West = $RolloWestU, Nord = $RolloNord, Beschgr = $BeschGrenze, Tempdiff = $Tempdiff, Sonne scheint $Beschattung seit $EinstrahlZeit s") if $logging;
    debug("PCT = $pct%, Wohntemp = $Wohntemp, WohnT = $WohnT, Badtemp = $Badtemp, BadT = $BadT") if $logging;
    return;
  }
 
  return if ($RolloOst == 100 && $RolloSued == 100 && $RolloWestU == 100 && $RolloNord == 100);
 
  # bei Bewölkung länger als x * 5 Min wieder öffen oder nach 19:00 wenn Sonne tiefer als 6° steht
  if ($Sonnenhoehe > $SonnenHoeheMin && $Beschattung == 0 && $EinstrahlZeit > 800 || $Sonnenhoehe <= $SonnenHoeheMin && $Sonnenhoehe > 0 && $cTime > 1900) {
   
      debug("Uhrzeit = $cTime, Sonnenhoehe = $Sonnenhoehe, Azimut = $Sonnenstand, Temp = $Aussentemp, Beschgr = $BeschGrenze, Tempdiff = $Tempdiff, Sonne scheint $Beschattung seit $EinstrahlZeit s") if ($logging);
   
    if ($RolloOst != 100)
    {
        fhem('set MQTT2_Rollo_WC pct 100');
        debug('Rolladen WC wird _AUF_ gefahren') if $logging;
    }
    if ($RolloSchlafzi != 100)
    {
        fhem('set MQTT2_Rollo_Schlafzimmer pct 100');
        debug('Rolladen Schlafzimmer wird _AUF_ gefahren') if $logging;
    }
    if ($RolloSued != 100)
    {
        fhem('set MQTT2_Rollo_Kueche_Sued pct 100');
        debug('Rolladen Sued wird _AUF_ gefahren') if $logging;
    }
    if ($RolloWestU != 100)
    {
        fhem('set RolloWestOben pct 100');
        debug('Rolladen West wird _AUF_ gefahren') if $logging;
    }
    if ($RolloNord != 100)
    {
        fhem('set RolloNord pct 100');
        debug('Rolladen Nord wird _AUF_ gefahren') if $logging;
    }
    return;
  }
return; 
}
leider verschiebt sich teilweise die Einrückung beim posten...


Einige Sonderlocken habe ich drin gelassen...
Wenn $logging auf 1 gesetzt ist, werden die debug-Meldungen ins Fhem-Log geschrieben.
Die Sub dient nur zur Beschattung, morgens und abends fahren die Rollladen autark.
Es wird auch nur beschattet, wenn die Heizung aus (habe ich eigentlich im notify) und eine gewisse Raumtemperatur erreicht ist.
Die Rollladen sind zum Teil in einer structure zusammengefasst, werden aber auch teilweise einzeln angesteuert.
Die Beschattungshöhe wird je nach Fensterhöhe angepasst, so dass überall der "gleiche" Spalt offen ist, bzw. keine Sonne rein scheint.
Die Rollladen werden nur bei einer Mindestveränderung verfahren. Damit wird das "Tanzen" vermindert. 

Viel Spaß damit  ;)
#9
DOIF / Aw: Übergroße Symbole in uitab...
Letzter Beitrag von JudgeDredd - 06 Oktober 2025, 18:43:27
Du gehörst aber (zum Glück der User) auch zur Gruppe der Hyperativen, oder ? 😉
Habe mir gerade mal das Update gezogen. Alles bestens, weder als Desktop noch Mobil keinerlei Anzeigefehler (bei mir).
Vielen Dank für den superschnellen Fix.
Gruß,
JudgeDredd
#10
TabletUI / Balkengrafik mehrerer Jahre mi...
Letzter Beitrag von DocCyber - 06 Oktober 2025, 18:43:06
Hallo zusammen.

das Anzeigen von Tagesdaten in einem Chart funktioniert so:
<ftui-chart unit="month">
  <ftui-chart-data log="FileLog_Days" file="CURRENT" spec="4:pvData.Wert" type="bar"></ftui-chart-data>
</ftui-chart>
Du darfst diesen Dateianhang nicht ansehen.

bei Monatswerten funktioniert das analog:
<ftui-chart unit="year">
  <ftui-chart-data log="FileLog_Months" file="CURRENT" spec="4:pvData.eTest" type="bar"></ftui-chart-data>
</ftui-chart>
Du darfst diesen Dateianhang nicht ansehen.

Aber wie funktioniert es bei Jahreswerten?
Auf der x-Achse hätte ich dann gern 2019, 2020, 2021, 2022, ...
Ich habe schon vieles ausprobiert, aber ich bekomme es nicht hin.
Ohne ´unit´ wird eine Stundenachse verwendet, ´years´ gibt es nicht.
Hier wäre etwa ´decade´ wünschenswert, um die letzten 10 Jahre dazustellen.
<ftui-chart unit="decade">
  <ftui-chart-data log="FileLog_Years" file="CURRENT" spec="4:pvData.eTest" type="bar"></ftui-chart-data>
</ftui-chart>

Ich kann mir nicht vorstellen, dass es mit chart.js nicht funktioniert.
Vermutlich müsste man hierfür den Code in chart.component.js anpassen (@setstate)
Leider habe ich kaum Kenntnisse von JS...

Hat jemand eine Lösung?