76_SolarForecast - Informationen/Ideen zu Weiterentwicklung und Support

Begonnen von DS_Starter, 11 Februar 2024, 14:11:00

Vorheriges Thema - Nächstes Thema

DS_Starter

Moin,
ZitatSieht evtl. nach dem neuen LRU aus ?
nein, aber du hast in deiner userExitFn wahrscheinlich die timestringsFromOffset drin:

FHEM::SolarForecast::timestringsFromOffset ($startts, 0);

Die Funktion braucht nun den Namen mitgegeben, also so als Beispiel:

FHEM::SolarForecast::timestringsFromOffset ($name, $startts, 0);

Dann passt es wieder.
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

300P

Nutze ich da aber m.W.n. so nicht "direkt" :-[
....eventuell "indirekt" ???;)


{
  # === BEGIN Heater Peak Control ===
  my $soc   = ReadingsNum($name,"special_BatWeightedTotalSOC",0);
  my $pv    = ReadingsNum($name,"RestOfDayPVforecast",0);
  my $con   = ReadingsNum($name,"RestOfDayConsumptionForecast",0);
  my $pvmax = ReadingsVal($name,"Today_MaxPVforecastTime","");
  my $net = $pv - $con;
  my $runtime = $net / 2100;
  my $Eheater  = (split " ", AttrVal ($name, 'consumer06', ''))[0];   # Heater-Name von ConsumerXX
  my ($sec,$min,$hour) = localtime(); # aktuelle Stunde
  my ($peak_hour) = $pvmax =~ /(\d{2}):\d{2}:\d{2}$/; # Peak-Stunde extrahieren
  my $in_peak = 0;
  $in_peak = 1 if(defined $peak_hour && abs($hour - $peak_hour) <= 3);
  my $allow_heater = ( $in_peak && $soc > 80 && $runtime > 1.2); # Entscheidung


  my $consmode = (ConsumerVal($name, '06', 'mode', "unklar"));
 
  if (!$allow_heater) # Consumer06 steuern
    {
                if  ($consmode ne "mustNot")
                    {
                    fhem("set $name attrKeyVal consumer06 mode=mustNot");
                    Log3($name, 2, "$name - Heatersteuerung                            mode war = $consmode - >>>>ab jetzt aktueller mode = mustNot");
                    }
                if (ReadingsVal($Eheater,"state","") ne "off")
                    {
                    fhem ("set $Eheater off");
                    Log3 ($name, 2, qq{$name - userFn -> $name Consumer $Eheater in $name set to --off--});
                    }
     Log3($name, 3, "$name - Heatersteuerung   mode=mustNot         Laufzeit  $runtime - Peak_hour = $peak_hour -  in_peak = $in_peak  - SOC = $soc   setreading $name consumer06 mode mustNot");
     }
else
    {
                if  ($consmode ne "can")
                    {
                    fhem("set $name attrKeyVal consumer06 mode=can");
                    Log3($name, 2, "$name - Heatersteuerung                            mode war = $consmode - >>>>ab jetzt aktueller mode = can");
                    }
                if (ReadingsVal($Eheater,"state","") ne "on")
                   {
                   fhem ("set $Eheater on");
                   Log3 ($name, 2, qq{$name - userFn -> $name Consumer $Eheater in $name set to --on--});
                   }
     Log3($name, 3, "$name - Heatersteuerung    runtime = $runtime - Peak_hour = $peak_hour -  in_peak = $in_peak  - SOC = $soc    jetzt ist setreading $name consumer06 mode can");
     }
Log3($name, 4, "$name - Heatersteuerung                runtime = $runtime - Peak_hour = $peak_hour -  in_peak = $in_peak  - SOC = $soc");
#########################


## BEGIN ######## loadsfcontribupdate #######
##
## ::loadsfcontribupdate ($name);
##
## ENDE ######## loadsfcontribupdate #######


# BEGIN ######## Load_Contrib_Update #######
#
# Wenn attr userFn_LoadContribcUpdate = 1 dann ...
# lade das aktuelle nur 1 x das Solarforecast Update ...
# aus dem Contrib von DS_Starter.
  my $updatefromcontrib = AttrVal ($name, 'userFn_LoadContribcUpdate', "0");
  if ($updatefromcontrib eq "1")
    {  # lade die aktuelle Dateiversion vom Contrib DS_Starter
    Log3 ($name, 2, qq{$name - start download Update Solarforecast from Contrib   ====>>> wird gestartet});
    fhem ('"wget -qO ./FHEM/76_SolarForecast.pm https://svn.fhem.de/fhem/trunk/fhem/contrib/DS_Starter/76_SolarForecast.pm"');
    # setze aber sofort wieder zurück auf 0 (= nicht weiter laden >> 1 x reicht)
    Log3 ($name, 2, qq{$name - end download Update Solarforecast from Contrib});
    fhem (" attr $name userFn_LoadContribcUpdate 0");
    Log3 ($name, 2, qq{$name - attr $name userFn_LoadContribcUpdate 0             ====>>> wurde ausgefuehrt});
    }
# ENDE ######## Load_Contrib_Update #######

# BEGIN ######## WP-Heater ################
#
my $ubsm = AttrVal ($name, 'userFn_HeaterManagement', 'off');
      Log3 ($name, 5, qq{$name - $ubsm});
  if ($ubsm eq 'on')
  {
  # alles nur wenn attr für Heater 'on' ist
  my $dt    = timestringsFromOffset (time, 0);
  my $hour  = $dt->{hour};                                                 # aktuelle Stunde in 24h format (00-23)
  my $timestart = 2;  # ab welcher Uhrzeit soll es sein.  ===>> Wert evtl. anpassen
  my $timeend = 8;   # bis wieviel Uhr soll es sein.         ===>> Wert evtl. anpassen
  my $summertime = "8" ; # bis wieviel Grad keine EHK-Einsätze in der Nacht (Aussentenperatur Haeizungsthermostat             ===>> Wert evtl. anpassen
  my $outtemp = ReadingsNum("MQTT_ESMwp","boiler_data_outdoortemp",0); # ===>> Aussentenperatur Heizungsthermostat
  my $forecastpvtodaymin = "20000"; # ca. max Tagesverbrauch ohne viel PV-Überschuss          ===>> Wert evtl. anpassen
  my $forecastpvtoday = ReadingsNum($name,"Today_PVforecast",0); # Today_PVforecast SF
      if ( $outtemp >= $summertime )
          {  # Nur ab xy:00 Grad
          Log3 ($name, 2, qq{$name - userFn -> WWHeater Temperatur  = $outtemp °C - Mindesttemperatur ist überschritten = $summertime °C});
          if ( $forecastpvtoday >= $forecastpvtodaymin )
             {  # nur wenn Today_PVforecast >= XYZ Watt
             Log3 ($name, 2, qq{$name - userFn -> WWHeater Forcast HEUTE  = $forecastpvtoday Wh - Mindestforecast HEUTE ist überschritten = $forecastpvtodaymin Wh});
             if (int $hour >= $timestart && int $hour < $timeend )
                {  # Nur zwischen xy:00 bis max. xy:59 (!!!! $timeend -1 Stunde !!!!)  Uhr
                my $minsocbat = 30;    # nur bis mindesten XY SoC aller Batterien. ===>> Wert evtl. anpassen
                my $heater  = (split " ", AttrVal ($name, 'consumer06', ''))[0];   # Heater-Name von ConsumerXX
                my $soctotal = CurrentVal ($name, 'batsoctotal', 0);         # SoC über alle Bat als Durchschnitt
                my $pvtot =  ReadingsNum ($name, 'RestOfDayPVforecast', 0);  # Restliche PV Prognose total heute in Wh
                my $caps  = CurrentVal ($name, 'batcapsum', 0);          # Summe installierte Bat Wh
                my $need  = $caps - ($soctotal/100 * $caps);             # benötigte Ladeenergie Bat bis 100% Ladung
                Log3 ($name, 2, qq{$name - userFn -> WWHeater Reading ist = $heater - aktuelle Stunde = $hour   aus $dt erzeugt });
                Log3 ($name, 2, qq{$name - userFn -> StartZeit von = $timestart bis EndeZeit = $timeend und mindestens ein SoC von $minsocbat % muss in den vorhandenen Batterien gegeben sein });
                Log3 ($name, 2, qq{$name - userFn -> Der PV-Tages-Restertrag betraegt $pvtot Wh ???mehr??? als die offene und noch zu ladende Batteriekapazitaet von $need Wh});
                Log3 ($name, 2, qq{$name - $ubsm});
                if ($soctotal >= ($minsocbat - 2) && $pvtot > $need)
                   {  # Zwischen xy:00 bis max. xy:59 (!!!! $timeend -1 Stunde !!!!)  Uhr
                   # und % SoC-Vorgabe erfüllt
                   # und der PV-Tages-Rest-Ertrag > 100% Batteriekapazitaet
                   # send "on"-Kommando an Heater Device if(ne "on");
                   if (ReadingsVal($heater,"state","") ne "on") {
                   fhem ("set $heater on");
                   Log3 ($name, 2, qq{$name - userFn -> $name Consumer $heater in $name set to --on--});
                   }
               }
               else
               {
               if (($soctotal < $minsocbat) || ($pvtot <= $need))
                  {  # Wenn die (SoC-Vorgabe unterschritten !!!!! oder !!!! derTages-Rest-Ertrag < 100% Batteriekapazitaet)
                  # danach sollte der Heater-ConsumerXY wieder nach "seinen" Regeln steuern...
                  # send "off"-Kommando an Heater Device if(ne "off");
                  if (ReadingsVal($heater,"state","") ne "off")
                     { fhem ("set $heater off");
                     Log3 ($name, 2, qq{$name - userFn -> $name Consumer $heater in $name set to --off--});
                     }
                  }
               }
            }
         }
      }
    }
# ENDE ######## WP-Heater ################
}







Nachsatz !!!!!
Nutze es doch schon in der nächtlichen WPHeater-Routine (seit 1 Jahr)!!!!!!

alt
my $dt    = timestringsFromOffset (time, 0);

NEU
my $dt    = timestringsFromOffset ($name, time, 0);
Gruß
300P

FHEM 6.4|RPi|SMAEM|SMAInverter|SolarForecast| DbLog|DbRep|MariaDB|Buderus-MQTT_EMS|
Fritzbox|fhempy|JsonMod|HTTPMOD|Modbus ser+TCP| ESP32_AI_on_the_Edge|ESP32CAM usw.

DS_Starter

#5852
my $dt    = timestringsFromOffset ($name, time, 0);
Ja, genau.
Wenn ich die V offiziell einchecke, gebe ich nochmal einen Hinweis und werfe einen diesbezüglichen Blick in das Wiki.
Im Zuge der Weiterentwicklung war es nicht zu umgehen diese Routine anzupassen da sie teuer ist und nun gecacht wird.
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

300P

Gruß
300P

FHEM 6.4|RPi|SMAEM|SMAInverter|SolarForecast| DbLog|DbRep|MariaDB|Buderus-MQTT_EMS|
Fritzbox|fhempy|JsonMod|HTTPMOD|Modbus ser+TCP| ESP32_AI_on_the_Edge|ESP32CAM usw.