76_SolarForecast - Informationen/Ideen zu Weiterentwicklung und Support

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

Vorheriges Thema - Nächstes Thema

hugomckinley

@Heiko
Danke für den Denkanstoß, das Problem fand sich zwischen Sessel und Bildschirm, nach dem Motto: Als ichs mir dachte wars noch gut!

Ich Depp habe Variablen außerhalb der Sub deklariert, da ich sie an mehreren Stellen brauche. Das Problem war, dass es keine Config-Variablen waren, sondern, dass diese in der Definition ein ReadingsVal() enthielten. Das hat dazu geführt, dass jedes Speichern die aktuellen Werte gelesen hat und somit in diesem Moment "funktionierte".

Jetzt dürfte es tatsächlich funktionieren ;-)

Das mit der doppelten Ausführung der swoffcond muss ich mir noch anschauen, denn das ist noch immer der Fall.
Bewusst führe ich sie nicht zusätzlich aus, aber wer weiß ...

Danke,
Hugo

----------------------------------------------------
FHEM in TrueNAS-Jail
HMLGW + HM-Komponenten, alexa-fhem, Modbus/TCP, Modbus/RS485, LG-WebOS, Firmata, 1wire, ESP-RGBWW, DaikinAC per WLAN, Shellys, Denon AVR, Fronius WR, Helios Wohnraumlüftung, ...

Wolle02

Hallo Heiko,

Zitat von: DS_Starter am 24 August 2025, 22:25:56planControl->genPVdeviation ist erweitert um den Perspektivwechsel für die Darstellung der Abweichung zu ermöglichen:

genPVdeviation    Legt die Methode zur Berechnung der Abweichung von prognostizierter und realer PV Erzeugung fest.
   Das Reading Today_PVdeviation wird in Abhängigkeit dieser Einstellung erstellt.
   Der optionale Zusatz ':reverse' legt fest, dass PV-Erzeugung > Prognose als positiver statt negariver Wert dargestellt wird (Perspektivwechsel)
   daily[:reverse] - Berechnung und Erstellung von Today_PVdeviation erfolgt nach Sonnenuntergang (default)
   continuously[:reverse] - Berechnung und Erstellung von Today_PVdeviation erfolgt fortlaufend
   


scheint gut zu funktionieren. Vielen herzlichen Dank.

hugomckinley

ZitatDas mit der doppelten Ausführung der swoffcond muss ich mir noch anschauen, denn das ist noch immer der Fall.
Bewusst führe ich sie nicht zusätzlich aus, aber wer weiß ...
Ist bei swoffcond der Fall, aber bei swoncond beim selben Verbraucher nicht:
(auch dort habe ich die Log-Ausgabe genauso vor den returns eingefügt)
sub
Check_Pump_Low_Off{
my $bath_mode = ReadingsVal($pool_dummy,"bath_mode",0);
my $m3_l1 = ReadingsVal($water_counter_l1,"waterAmount",0);
my $m3_l2 = ReadingsVal($water_counter_l2,"waterAmount",0);
my $water_volume = AttrVal($pool_dummy,"water_volume",42); #42m³
my $desired_cf_l1 = AttrVal($pool_dummy,"desired_cf_l1",0); #circulation_factor_level1
my $desired_cf_l2 = AttrVal($pool_dummy,"desired_cf_l2",0); #circulation_factor_level2
my $bathmode_factor = AttrVal($pool_dummy,"bathmode_factor",1);
my $desired_amount_l1;
my $desired_amount_l2;
my $amount = $m3_l1 + $m3_l2;
if($bath_mode == 1){
$desired_amount_l1 = $desired_cf_l1 * $water_volume;
$desired_amount_l2 = $desired_cf_l2 * $water_volume;
}else{
$desired_amount_l1 = $desired_cf_l1 * $water_volume/$bathmode_factor;
$desired_amount_l2 = $desired_cf_l2 * $water_volume/$bathmode_factor;
}

if(($amount > $desired_amount_l1)
&& (ReadingsVal($pool_dummy,"pump_high","on") eq "off"  && ReadingsAge($pool_dummy,"pump_high",0) >160)
&& ReadingsVal($pool_dummy,"special_function","") eq "none"
&& ReadingsVal($pool_dummy,"valve_position","") eq "normal"
)
{
Log3 ("SolarForecast", 1, qq{SolarForecast: Pump Low swoffcond - true});
return 1;
}else{
Log3 ("SolarForecast", 1, qq{SolarForecast: Pump Low swoffcond - false});
return 0;
}
}
2025.08.25 09:00:04 1: SolarForecast: Pump Low swoncond - true
2025.08.25 09:00:04 1: SolarForecast: Pump Low swoffcond - false
2025.08.25 09:00:04 1: SolarForecast: Pump Low swoffcond - false
2025.08.25 09:01:00 1: SolarForecast: Pump Low swoncond - true
2025.08.25 09:01:00 1: SolarForecast: Pump Low swoffcond - false
2025.08.25 09:01:00 1: SolarForecast: Pump Low swoffcond - false
2025.08.25 09:02:00 1: SolarForecast: Pump Low swoncond - true
2025.08.25 09:02:00 1: SolarForecast: Pump Low swoffcond - false
2025.08.25 09:02:00 1: SolarForecast: Pump Low swoffcond - false
2025.08.25 09:03:00 1: SolarForecast: Pump Low swoncond - true
2025.08.25 09:03:00 1: SolarForecast: Pump Low swoffcond - false
2025.08.25 09:03:00 1: SolarForecast: Pump Low swoffcond - false

Definition des Consumers:
dum_valve:Pool+Low
aliasshort=Low
asynchron=0
auto=pump_low_auto
icon=scene_pool
interruptable=0
mintime=SunPath:0:180
mode=must
noshow=0
notafter=08:00
off="pump_low off"
on="pump_low on"
pcurr=pump_low_power
power=250
surpmeth=median_13
switchdev=dum_valve
swoffcond=dum_valve:sf_true:{main::Check_Pump_Low_Off}
swoncond=dum_valve:sf_true:{main::Check_Pump_Low_On}
swstate=pump_low:on:off
type=other

Da es (anscheinend) keine Auswirkung hat und nur bei mir auftritt, irgnoriere ich es erstmal. Vielleicht finde ich mal etwas.
----------------------------------------------------
FHEM in TrueNAS-Jail
HMLGW + HM-Komponenten, alexa-fhem, Modbus/TCP, Modbus/RS485, LG-WebOS, Firmata, 1wire, ESP-RGBWW, DaikinAC per WLAN, Shellys, Denon AVR, Fronius WR, Helios Wohnraumlüftung, ...

Wolle02

Ich hätte eine Frage zu swoffcond bei den Consumern. Im Hilfetext ist nur von einem Device:Reading Paar die Rede. Kann ich hier auch auf mehrere, logisch verknüpfte Device:Reading Paare prüfen? Oder muss ich hier ein Userreading erstellen in dem das Ergebnis der Prüfung abgelegt wird und auf das dann in swoffcond geprüft wird?

hugomckinley

#3829
Ich mache diese Prüfungen in einer eigenen Funktion, deren Rückgabewert dann mit "true" aus einem Dummyreading, das immer 1 ist, verglichen wird. Somit sind beliebig aufwendige Prüfungen möglich.
Im Wiki kannst du dir anschauen, wie ich das mache: Wiki -Abschnitt Poolsteuerung ...

Grüße,
Hugo
----------------------------------------------------
FHEM in TrueNAS-Jail
HMLGW + HM-Komponenten, alexa-fhem, Modbus/TCP, Modbus/RS485, LG-WebOS, Firmata, 1wire, ESP-RGBWW, DaikinAC per WLAN, Shellys, Denon AVR, Fronius WR, Helios Wohnraumlüftung, ...

DS_Starter

Hallo zusammen,

ich habe den Request aus #3801 umgesetzt.
Jetzt gibt es die Möglichkeit die Dummy-Leistung als Reading zu bekommen.
In ctrlSpecialReadings->

dummyConsumption   Liefert den aktuellen, Verbrauchern nicht zuordenbaren Hausverbrauch. Enthält auch Verlustleistungsanteile.

Das Modul im Contrib ist upgedated. Restart nach dem Download ist wichtig.

LG,
Heiko 
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

DS_Starter

@Hugo,

wenn du in deine Sub diese Zeilen einbaust:

  for (caller(1)) {
    Log3 ('SolarForecast', 1, "SolarForecast - Aufrufinfo: ".$_);
  }

bekommst du heraus woher der Aufruf erfolgt. Zum Beispiel:

2025.08.25 23:20:39.417 1: SolCast - Aufrufinfo: FHEM::SolarForecast          -> Paket
2025.08.25 23:20:39.418 1: SolCast - Aufrufinfo: ./FHEM/76_SolarForecast.pm   -> das File
2025.08.25 23:20:39.418 1: SolCast - Aufrufinfo: 24584                        -> die Zeile wo der Aufruf erfolgt
2025.08.25 23:20:39.418 1: SolCast - Aufrufinfo: FHEM::SolarForecast::__ANON__
2025.08.25 23:20:39.418 1: SolCast - Aufrufinfo: 1
2025.08.25 23:20:39.419 1: SolCast - Aufrufinfo:

Vllt. hilft dir das für deine Aufrufanalyse.

Grüße,
Heiko
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

hugomckinley

2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoncond): FHEM::SolarForecast
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoncond): ./FHEM/76_SolarForecast.pm
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoncond): 23186
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoncond): (eval)
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoncond): 0
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoncond):
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoncond): {main::Check_Pump_Low_On}
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoncond):
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoncond): 8390626
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoncond): UUUUUUUUUUUUUUUUUUUU
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoncond):
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond): FHEM::SolarForecast
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond): ./FHEM/76_SolarForecast.pm
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond): 23260
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond): (eval)
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond): 0
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond):
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond): {main::Check_Pump_Low_Off}
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond):
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond): 8390626
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond): UUUUUUUUUUUUUUUUUUUU
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond):
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond): FHEM::SolarForecast
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond): ./FHEM/76_SolarForecast.pm
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond): 23260
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond): (eval)
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond): 0
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond):
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond): {main::Check_Pump_Low_Off}
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond):
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond): 8390626
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond): UUUUUUUUUUUUUUUUUUUU
2025.08.26 07:25:34 1: SolarForecast - Aufrufinfo(swoffcond):

Das schaut aber schon so aus, als würde hier aus Zeile 23260 zweimal die swoffcond aufgerufen, oder?
swoncond wird nur einmal aus Zeile 23186 aufgerufen.

Grüße,
Hugo
----------------------------------------------------
FHEM in TrueNAS-Jail
HMLGW + HM-Komponenten, alexa-fhem, Modbus/TCP, Modbus/RS485, LG-WebOS, Firmata, 1wire, ESP-RGBWW, DaikinAC per WLAN, Shellys, Denon AVR, Fronius WR, Helios Wohnraumlüftung, ...

DS_Starter

#3833
Guten Morgen,

ZitatDas schaut aber schon so aus, als würde hier aus Zeile 23260 zweimal die swoffcond aufgerufen, oder?
swoncond wird nur einmal aus Zeile 23186 aufgerufen.
Ja, da war diesmal ich gedanklich im falschen Kontext unterwegs.  ;)
Ich war, aus welchen Gründen auch immer, der Meinung wir würden uns über eine Funktion aufgerufen in userExitFn unterhalten.
Das ist natürlich Unsinn, da es sich ja um swoffcond und swoncond handelt ... oh man.  ::)

Jedenfalls ist das ok. Im Einschaltzweig wird die swoncond und die swoffcond Prüfung durchgeführt um zu prüfen ob eine evtl. vorlegende Einschaltbedingung  gleich wieder durch swoffcond negiert wird. Im Ausschaltzweig dann nochmal die swoffcond.

LG,
Heiko
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

DS_Starter

#3834
@Parallix,

zu deiner Anregung in #3789:

ZitatNun zeigt sich aber, dass es schön wäre, auch einen von SF dynamisch kalkulierten Wert zu haben, der unabhängig von der o.g. Ladeschlussleistung die
verbleibenden Stunden eines Tages angibt, mit denen ein Speicher bis zum Einbruch der Dunkelheit mit einer (sich ggf. dynamisch ändernden,
aber dann bis Tagesende als konstant anzunehmenden) Leistung auf den in ,,ctrlBatSocManagementXX" angegebenen ,,upSoC" und/oder ,,maxSoC" gebracht werden kann.
Ich bin mir noch nicht wirklich im Klaren worin das Ziel besteht. Im ersten Ansatz würde ich meinen, du möchtest als Ergebnis die Anzahl der Stunden die benötigt werden, um die Bat bis Sonnenuntergang auf z.B. maxSoC zu laden. Als dynamische Variable käme in der Rechnung dann der noch bis Sonnenuntergang pro Stunde prognostizierte PV-Überschuß sowie setupBatteryDevXX->pinmax zum Ansatz. Abhängig vom aktuellen SoC errechnen sich die Stunden bis maxSoC erreicht wäre.

Habe ich es bis zu diesem Punkt richtig interpretiert?

Nun kann es sein, dass maxSoC unter den beschriebenen Gesichtspunkten überhaupt nicht erreicht werden kann, weil einfach kein/zu wenig PV-Überschuß vorhanden sein wird. Was sollte dann im Ergebnis der Stundenangabe stehen? 0 wäre m.M. nach keine Option weil suggeriert wird, dass das Ziel bereits erreicht ist. Das kommt jetzt m.M. nach etwas darauf an wie man dieses special-Reading verwenden möchte.

Edit: Vorschlag wäre '9999' in diesem Fall. Den numerischen Wert könnten man prüfen und als 'nicht möglich' (9999 Stunden) interpretieren.

LG,
Heiko
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

grappa24

folgender Fehler mit der 1.57.3 bei mir:
2025.08.26 10:31:48 1: solErtrag - ERROR in execute graphicHeaderOwnspecValForm: Search pattern not terminated at (eval 5661) line 1.
Bin dann zurück auf die 1.57.2 aber der Fehler bleibt :(
Gebäudesicherheit/-komfort, PV-Prognose/Verbrauchssteuerung, Heizungssteuerung, Multimedia, ...
KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200, Netatmo, Nuki, SolarForecast, HEOS, Alexa-FHEM, ...
FHEM 6.4, 2 x RasPi 3B+, Debian Bullseye

DS_Starter

Hier wird ein Konfigurationsfehler im Attr graphicHeaderOwnspecValForm abgefangen.
Zeige mal bitte den Inhalt des Attributes.
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

grappa24

#3837
hab ich aber schon lange so:

{
    'Today_PVforecast'                        => "(sprintf '%.1f  kWh', ($VALUE / 1000))",
    'special_todayConsumption'           => "(sprintf '%.1f  kWh', ($VALUE / 1000))",
    'Tomorrow_ConsumptionForecast'  => "(sprintf '%.1f  kWh', ($VALUE / 1000))",
    'Tomorrow_PVforecast'                  => "(sprintf '%.1f  kWh', ($VALUE / 1000))",
    'special_todayGridConsumption'     => "(sprintf '%.3f  kWh', ($VALUE / 1000))",
    'special_todayGridFeedIn'              => "(sprintf '%.3f  kWh', ($VALUE / 1000))",
    'Inverter_Common_MPPT1_Value'   => "(sprintf '%.0f  W', ($VALUE))",
    'Inverter_Common_MPPT2_Value'   => "(sprintf '%.0f  W', ($VALUE))",
    'User_Energy_Bat_Efficiency'         => "(sprintf '%.1f%%', ($VALUE))",
    'special_todayEVG'                        => "(sprintf '%.2f   EUR', ($VALUE))",
    'Verlust'                                        => "(sprintf '%.1f%%', ($VALUE))"
}

und hier noch graphicHeaderOwnspec:

#Batterie
Management:userFn_BatterySoCManagement
Limit&nbspsetzen:BatConfigReserve@BYD_Battery
SoC evcc&nbsptablet:batteryPercent@SAMSUNG_SM_X210
Wirkungsgrad BYD:User_Energy_Bat_Efficiency@SymGen24

SoC aktuell:BatteryChargeFormatted@BYD_Battery
PV heute:Today_PVforecast
Netzbezug heute:special_todayGridConsumption
Wandlungsverlust:Verlust@SymGen24

Limit aktuell:BatConfigReserveFormatted@BYD_Battery
PV morgen:Tomorrow_PVforecast
Netzeinspeisung heute:special_todayGridFeedIn
EVG heute:special_todayEVG
:

Limit optimal:Battery_OptimumTargetSoC_01
Verbrauch heute:special_todayConsumption
Süd-West:Inverter_Common_MPPT1_Value@SymGen24
:

Ladeanforderung:Battery_ChargeRequest_01
Verbrauch morgen:Tomorrow_ConsumptionForecast
Nord-Ost:Inverter_Common_MPPT2_Value@SymGen24
:

Laden uneingeschr.:Battery_ChargeUnrestricted_01
ContribUpdate:userFn_LoadContribcUpdate


Gebäudesicherheit/-komfort, PV-Prognose/Verbrauchssteuerung, Heizungssteuerung, Multimedia, ...
KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200, Netatmo, Nuki, SolarForecast, HEOS, Alexa-FHEM, ...
FHEM 6.4, 2 x RasPi 3B+, Debian Bullseye

DS_Starter

#3838
Ich habe deine Konfig 1:1 übernommen.
Der Fehler ergibt sich wenn der Wert, der in graphicHeaderOwnspecValForm mathematisch behandelt werden soll, nicht vorhanden ist oder geliefert wird. Als Beispiel dieser hier:

'special_todayGridConsumption'     => "(sprintf '%.3f  kWh', ($VALUE / 1000))",
special_todayGridConsumption gibt es bei meiner Instanz nicht und die Funktion läuft auf Fehler ($VALUE / 1000).
Mit:

'special_todayGridConsumption'     => "(sprintf '%.3f  kWh', $VALUE)",
gibt es kein Problem, die Anzeige bleibt einfach leer.
Den Fehler konnte ich so umgehen:

'special_todayGridConsumption'     => "(sprintf '%.3f  kWh', ($VALUE*1 / 1000))",

Die Anzeige zeigt dann:

Netzbezug heute:  0.000  kWh
Das hat also nichts mit der SF-Version zu tun.

LG
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

grappa24

#3839
;D ich hatte mit specialReadings gespielt und dabei wohl alle gelöscht, zu blöd :D
Danke für deine Analyse, jetzt gehts wieder

Gebäudesicherheit/-komfort, PV-Prognose/Verbrauchssteuerung, Heizungssteuerung, Multimedia, ...
KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200, Netatmo, Nuki, SolarForecast, HEOS, Alexa-FHEM, ...
FHEM 6.4, 2 x RasPi 3B+, Debian Bullseye