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
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
defmod n_Beschattung notify Sonnenstand:azimuth:.* {beschattung()}
Sonnenstand ist mein Twilight-Device, beschattung() die Sub die in MyUtils aufgerufen wird.sub CalculateTime()
{
return strftime("%H%M", localtime()); # 1528 -> ohne Doppelpunkt, zum Vergleichen
}
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...<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.<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.<ftui-chart unit="decade">
<ftui-chart-data log="FileLog_Years" file="CURRENT" spec="4:pvData.eTest" type="bar"></ftui-chart-data>
</ftui-chart>