Leistungsprognose für Wechselrichter

Begonnen von ch.eick, 18 Januar 2021, 08:35:46

Vorheriges Thema - Nächstes Thema

DS_Starter

Hallo @all,

soeben habe ich eine Weiterentwicklung eingecheckt. Sie ist ebenso sofort in meinem contrib abrufbar.
Neu ist der key noshow im Consumer Attribut der das Ausblenden des Consumers in der Grafik statisch oder auch dynamisch steuerbar über ein Reading ermöglicht:

noshow    Verbraucher in Grafik ausblenden oder einblenden (optional).
   0 - der Verbraucher wird eingeblendet (default)
   1 - der Verbraucher wird ausgeblendet
   [Device:]Reading - Reading im Verbraucher oder optional einem alternativen Device.
   Hat das Reading den Wert "0" oder ist nicht vorhanden, wird der Verbraucher eingeblendet.
   Hat das Reading den Wert "1", wird der Verbraucher ausgeblendet.

LG
ESXi@NUC+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

tobi01001

#3136
Zitat von: DS_Starter am 10 Oktober 2023, 20:35:29Hallo @all,

soeben habe ich eine Weiterentwicklung eingecheckt. Sie ist ebenso sofort in meinem contrib abrufbar.
Neu ist der key noshow im Consumer Attribut der das Ausblenden des Consumers in der Grafik statisch oder auch dynamisch steuerbar über ein Reading ermöglicht:

noshow    Verbraucher in Grafik ausblenden oder einblenden (optional).
    0 - der Verbraucher wird eingeblendet (default)
    1 - der Verbraucher wird ausgeblendet
    [Device:]Reading - Reading im Verbraucher oder optional einem alternativen Device.
    Hat das Reading den Wert "0" oder ist nicht vorhanden, wird der Verbraucher eingeblendet.
    Hat das Reading den Wert "1", wird der Verbraucher ausgeblendet.

LG

Dankeschön. ;)

Jetzt hatte ich mir in meiner naturgegebenen Ungeduld und Wissbegier selbst was eingebaut, was dank deines gut dokumentierten und strukturierten Code ziemlich leicht war aber die Device:Reading Variante ist besser, da mittels userreading sehr leicht steuerbar.

EDIT:
und gleich nach dem Ausprobieren Verbesserungsvorschläge - sorry:

noshow    Verbraucher in Grafik ausblenden oder einblenden (optional).
    0 - der Verbraucher wird eingeblendet (default)
    1 - der Verbraucher wird in der Flowgrafik ausgeblendet
    2 - der Verbraucher wird im Header ausgeblendet
    3 - der Verbraucher wird in der Flowgrafik und im Header ausgeblendet
    [Device:]Reading - Reading im Verbraucher oder optional einem alternativen Device.
    Hat das Reading den Wert "0" oder ist nicht vorhanden, wird der Verbraucher eingeblendet.
    Hat das Reading den Wert "1", wird der Verbraucher nur in der Flowgrafik ausgeblendet.
    Hat das Reading den Wert "2", wird der Verbraucher nur im Header ausgeblendet.
    Hat das Reading den Wert "3", wird der Verbraucher in der Flowgrafik und im Header ausgeblendet.

In etwa so?
#Im Header nur ausblenden, wenn noshow > 1:
Zeile  9223:       next if(isConsumerNoshow ($hash, $c)>1);                                                        # Consumer ausblenden
in der Flowgrafik nur ausblenden wenn 1, oder 3 , also nicht modulo 2
zudem die Anordnung unterhalb nach Anzahl der angezeigten Consumer wählen:
ab Zeile 10061
my $type       = $paref->{type};
for my $c (sort{$a<=>$b} keys %{$data{$type}{$name}{consumers}})                        # definierte Verbraucher ermitteln
{
push(@consumers, $c) if(!(isConsumerNoshow ($hash, $c)%2));   # ausgeblendete Consumer nicht berücksichtigen
}
$consumercount = scalar @consumers;
Damit wird auch die Anordnung anhand der eingeblendeten Consumers gestaltet.
Damit müssten auch die nachfolgenden Zeilen entfallen.
Zeile 10075:           next if(isConsumerNoshow ($hash, $c));                                                 
Zeile 10153:           next if(isConsumerNoshow ($hash, $c));                                                   
Zeile 10203:           next if(isConsumerNoshow ($hash, $c));                                                     
Außer das war bewusst so gewählt, dann eventuell so anstatt vorheriger "Arrayreduktion" lediglich:
next if(isConsumerNoshow ($hash, $c)%2);

Jetzt kann ich am Beispiel meiner Poolpumpe mittels Userreading "noshow" unterschieden zwischen:
  • pvAutomatik ein und Pumpe ein: noshow 0 <-- Automatikbetrieb mittels PV-Überschuss Consumer wird überall angezeigt
  • pvAutomatik ein und Pumpe aus: noshow 1 <-- Automatikbetrieb, aber aktuell aus und dann nicht in der Flowgrafik
  • pvAutomatik aus und Pumpe aus: noshow 3 <-- "Wintermodus" - der Verbraucher ist dauerhaft aus und wird daher nciht angezeigt
  • pvAutomatik aus und Pumpe ein: noshow 2 <-- "Wintermodus" - Aber die Pumpe läuft trotzdem -> Anzeige als Verbraucher in der Flowgrafik
im Userreading ist das dann auch recht einfach:
noshow { my $flowShow = ReadingsVal($name, "state", "off")eq"off"?1:0; my $headerShow = ReadingsVal($name, "pvAuto", 0)==1?0:2; ($flowShow+$headerShow) }

Was meinst du dazu? Und lass mich bitte wissen, wenn ich dir hier zu sehr "rumpfusche"...

Gruß,
Tobias
FHEM@UbuntuServer on Lenovo ThinkCentre M900 [i5-6500T / 8GB RAM] MySQL-DbLog, Grafana, FTUI3 / HmIP incl. CCU3 / LGESS / Wärempumpe über TA CMI und CANoE / Shellies u.v.m.

DS_Starter

Für Ideen bin ich immer offen.
Ich schaue mir das mal an.
ESXi@NUC+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

Ich habe das Modul erweitert.
@Tobias, ich habe deinen Vorschlag weitgehend übernommen. Allerdings mit der Änderung der Bedeutung der Werte wie folgt:

noshow    Verbraucher in Grafik ausblenden oder einblenden (optional).
   0 - der Verbraucher wird eingeblendet (default)
   1 - der Verbraucher wird ausgeblendet
   2 - der Verbraucher wird in der Verbraucherlegende ausgeblendet
   3 - der Verbraucher wird in der Flußgrafik ausgeblendet
   [Device:]Reading - Reading im Verbraucher oder optional einem alternativen Device.
   Hat das Reading den Wert 0 oder ist nicht vorhanden, wird der Verbraucher eingeblendet.
   Die Wirkung der möglichen Readingwerte 1, 2 und 3 ist wie beschrieben.

Dadurch ist die Kompatilität zur vorherigen Version gegeben und außerdem sind die "gebäuchlichsten" Verwendungen durch 0/1 abgedeckt. Wer es spezifischer mag geht etwas "tiefer".

Weiterhin ist die Arbeitsweise der KI etwas erweitert. Die Ergebnisabfrage erlaubt jetzt eine Schätzung wenn der spezifische Strahlungswert noch nicht im Trainingsvorrat enthalten ist.
Im Beispiel ist bisher kein Ergebnis für den Strahlungswert 190.00 verfügbar. Das Modul testet nun positive sowie negative Nebenwerte bis zu einer gesetzten Grenze mit der Schrittweite 10.
Sind Ergebnisse in diesem Rahmen verfügbar (hier 338 nach oben bzw. 184 nach unten), wird aus diesen Werten ein geschätzter Mittelwert (hier 261) geliefert.

Im Log mit ctrlDebug=aiData ist dann zu sehen:

2023.10.12 13:15:42.929 1: SolCast6 DEBUG> no accurate result AI found with initial value "190.00"
2023.10.12 13:15:42.930 1: SolCast6 DEBUG> test AI estimation with variance "50", positive/negative step "10"
2023.10.12 13:15:42.931 1: SolCast6 DEBUG> AI estimation with test value "200.00": 338
2023.10.12 13:15:42.931 1: SolCast6 DEBUG> AI estimation with test value "170.00": 184
2023.10.12 13:15:42.932 1: SolCast6 DEBUG> appreciated result AI: pvaifc: 261 (hod: 17, wcc: 90, wrp: 45, temp: 15)

Die Version 1.0.5 ist erstmal nur in meinem contrib !! verfügbar da ich die nächsten Tage nur bedingt eingreifen und unterstützen kann.
Der reguläre CheckIn erfolgt dann später.

LG
ESXi@NUC+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

SparcWolf

Zitat von: DS_Starter am 09 Oktober 2023, 18:55:59@Guido, ich habe den Grund gefunden weshalb die Logausgabe manchmal nicht erscheint.
Es wurde immer dann nicht ausgegeben, wenn der alte und neu berechnete Korrekturfaktor gleich war.

Das ist verwirrend und ich habe es nun so geändert dass auch in diesen Fällen die Logausgabe erscheint.
Manchmal hilft eine Nacht darüber schlafen.  ;)

Die Änderung fließt in das nächste Release mit ein.

Ist jetzt OK. Danke!

minierm

Zitat von: DS_Starter am 10 Oktober 2023, 12:37:28
ZitatDie PV Anlage liefert den Total-Wert über die Lebenszeit, Jahreswerte, Monatswerte und halt den täglich Wert, der jeden Tag bei 0 anfängt und die Erzeugung im Laufe des Tages summiert. Dieser Tageswert hat eine passende Genauigkeit. Mit diesem Tagessaldo statt dem Lebenszeitsaldo könnte man die Stundenwerte berechnen. Man muss halt nur berücksichtigen, daß der Zähler jeden Tag bei 0 anfängt.
Jetzt ist es klarer, danke. Ein solches Thema hatte wir bereits öfter.
Eine Lösung gibt es bereits durch Erstellung eines userReadings mit dem modifier "monotonic".
siehe https://fhem.de/commandref_DE.html#userReadings

Im Prinzip ist diese Variante ebenfalls eine Lösung für dich bzgl. der unsteten und unzuverlässigen Zählerereichbarkeit.

In allen diesen Fällen gibt man das entsprechende userReading in den Modulsettern an. Diese Readings enthalten dann durch den monotonic Modifier immer den geforderten sich stetig erhöhenden Zählerwert.
Danke, sieht erfolgsversprechend aus:
attr MTEC userReadings data_accumulatedData_totalEnergy_fromtoday monotonic {my $val = ReadingsNum("MTEC", "data_accumulatedData_todayEnergy", 0);; if (ReadingsVal("MTEC", "data_accumulatedData_todayEnergyUnit", "?") eq "Wh") {$val / 1000} else {$val}}

DS_Starter

#3141
Moin,

sieht soweit gut aus.
Zwei Tipps hätte ich noch. Bei den userReadings macht es sich gut ein Triggerreading einzusetzen, weil ansonsten das userReading u.U. mehrfach getriggert wird (Performance und Events).
Ansonsten klappt es den eigenen Devicenamen verallgemeinernd durch "$name" oder "$NAME" zu ersetzen. Macht sich beim Kopieren etc. gut.

Dann könntest du das userReading so schreiben:

data_accumulatedData_totalEnergy_fromtoday:data_accumulatedData_todayEnergy.* monotonic {
my $val = ReadingsNum ($name, "data_accumulatedData_todayEnergy", 0);
$val    = ReadingsVal ($name, "data_accumulatedData_todayEnergyUnit", "") eq "Wh" ? $val / 1000 : $val;
},

Man kann den Code mehrzeilig angeben. Bei mehreren userReadings das "," dazwischen nicht vergessen.
ESXi@NUC+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

tobi01001

Zitat von: DS_Starter am 12 Oktober 2023, 13:33:36Ich habe das Modul erweitert.
@Tobias, ich habe deinen Vorschlag weitgehend übernommen. Allerdings mit der Änderung der Bedeutung der Werte wie folgt:

noshow    Verbraucher in Grafik ausblenden oder einblenden (optional).
   0 - der Verbraucher wird eingeblendet (default)
   1 - der Verbraucher wird ausgeblendet
   2 - der Verbraucher wird in der Verbraucherlegende ausgeblendet
   3 - der Verbraucher wird in der Flußgrafik ausgeblendet
   [Device:]Reading - Reading im Verbraucher oder optional einem alternativen Device.
   Hat das Reading den Wert 0 oder ist nicht vorhanden, wird der Verbraucher eingeblendet.
   Die Wirkung der möglichen Readingwerte 1, 2 und 3 ist wie beschrieben.

Dadurch ist die Kompatilität zur vorherigen Version gegeben und außerdem sind die "gebäuchlichsten" Verwendungen durch 0/1 abgedeckt. Wer es spezifischer mag geht etwas "tiefer".

Weiterhin ist die Arbeitsweise der KI etwas erweitert. Die Ergebnisabfrage erlaubt jetzt eine Schätzung wenn der spezifische Strahlungswert noch nicht im Trainingsvorrat enthalten ist.
Im Beispiel ist bisher kein Ergebnis für den Strahlungswert 190.00 verfügbar. Das Modul testet nun positive sowie negative Nebenwerte bis zu einer gesetzten Grenze mit der Schrittweite 10.
Sind Ergebnisse in diesem Rahmen verfügbar (hier 338 nach oben bzw. 184 nach unten), wird aus diesen Werten ein geschätzter Mittelwert (hier 261) geliefert.

Im Log mit ctrlDebug=aiData ist dann zu sehen:

2023.10.12 13:15:42.929 1: SolCast6 DEBUG> no accurate result AI found with initial value "190.00"
2023.10.12 13:15:42.930 1: SolCast6 DEBUG> test AI estimation with variance "50", positive/negative step "10"
2023.10.12 13:15:42.931 1: SolCast6 DEBUG> AI estimation with test value "200.00": 338
2023.10.12 13:15:42.931 1: SolCast6 DEBUG> AI estimation with test value "170.00": 184
2023.10.12 13:15:42.932 1: SolCast6 DEBUG> appreciated result AI: pvaifc: 261 (hod: 17, wcc: 90, wrp: 45, temp: 15)

Die Version 1.0.5 ist erstmal nur in meinem contrib !! verfügbar da ich die nächsten Tage nur bedingt eingreifen und unterstützen kann.
Der reguläre CheckIn erfolgt dann später.

LG

Musste die Logik einmal auf den Kopf stellen, aber funktioniert wunderbar...Danke! Ich hätte da noch eine Idee bzw einen Wunsch - wenn du wieder aufmerksamer folgen und eingreifen kannst. ;-)
FHEM@UbuntuServer on Lenovo ThinkCentre M900 [i5-6500T / 8GB RAM] MySQL-DbLog, Grafana, FTUI3 / HmIP incl. CCU3 / LGESS / Wärempumpe über TA CMI und CANoE / Shellies u.v.m.

DS_Starter

ESXi@NUC+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

tobi01001

Zitat von: DS_Starter am 13 Oktober 2023, 10:37:10Lesen kann ich schonmal  ;)
Na gut, ich versuche es kurz zu beschreiben:
Es gibt gewisse Verbraucher die sich als Smart verkaufen - zumindest aber ihren Fortschritt und die Restlaufzeit kommunizieren (bei mir z.B. Trockner und Spülmaschine). Vielleicht könnte man den Consumern im SolarForecast diese Information mitgeben und anstatt der geplanten Restlaufzeit anzeigen?

Wann und ob der Verbraucher eingeplant werden soll, kann ich ja aktuell schon über "auto" steuern?

Nachteil:
- Wenn man das Gerät öfter laufen lassen möchte / muss, geht das wohl unter.

Vorteil:
- Das Modul wüsste z.B. wann die Leistung, die das Gerät bezieht, wieder für ander Aufgaben zur Verfügung steht.
- Ich sehe im Flow, wann das Gerät fertig wird.
- ...

Wenn man das weiter treibt: die Spülmaschine kann z.B. auch über Befehl gestartet werden und hat für das aktuell eingestellte Programm eine prognostizierte Laufzeit, die man zur Verbraucherplanung hernehmen könnte. Beim Trockner (bei meinem zumindest) geht das nicht, weil die Fernsteuerung extra aktiviert werden muss und die Verbindung nur da ist, wenn der Tatsächlich eingeschaltet wurde. Aber dann kommen auch die Werte.
FHEM@UbuntuServer on Lenovo ThinkCentre M900 [i5-6500T / 8GB RAM] MySQL-DbLog, Grafana, FTUI3 / HmIP incl. CCU3 / LGESS / Wärempumpe über TA CMI und CANoE / Shellies u.v.m.

tobi01001

Zitat von: DS_Starter am 13 Oktober 2023, 10:37:10Lesen kann ich schonmal  ;)

Noch eine Frage:
Wann und wie werden denn die Readings ConsumerXX und ConsumerXX_.* aktualisiert?
Hintergrund: ich habe den Getränkekühlschrank iom Keller von reiner Anzeige zu "Überschusseinplanung" geändert...
Die Readings zeigen:
consumer07 name='STKD_UG_FridgeBeverage' state='off' planningstate='noSchedule'
consumer07_currentPower  0 W
Das Attribut ist aber gesetzt auf:
STKD_UG_FridgeBeverage power=150 type=other mode=can mintime=sunpath on=on icon=kuehlschrank_small pcurr=power:W:100 etotal=energy_total:Wh swstate=state:on:off auto=pvAuto noshow=noshow swoncond=di_Getraenke_KS_Switch:CanCool:1 locktime=300:300
Hab die Automatik (pvAuto) bereits mal deaktiviert und aktiviert, was nichts ändert. Ich hätte erwartet, dass ich die aktuelle Konfiguration und Readings für Planungsdaten sehen müsste?

Danke und Gruß,
Tobias
FHEM@UbuntuServer on Lenovo ThinkCentre M900 [i5-6500T / 8GB RAM] MySQL-DbLog, Grafana, FTUI3 / HmIP incl. CCU3 / LGESS / Wärempumpe über TA CMI und CANoE / Shellies u.v.m.

DS_Starter

Typischerweise, abhängig vom Planungsstatus, erfolgt kurz nach Mitternacht eine Neuinitialisierung.
Manuell kann man es mit

Set ... reset consumerPlanning <no>

auslösen.
ESXi@NUC+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

SparcWolf

Hallo Heiko,

ich nutze das neue Attribut <graphicHeaderOwnspec> und da hätte ich einen Anpassungswunsch.
Abends (nach Sonnenuntergang ?) hat die Anzeige von <Today_PVreal> sehr viele Nachkommastellen (siehe Anhang).
Tagsüber werden alle Werte ohne Nachkommastellen oder mit einer Nachkommastelle angezeigt.
So fände ich das auch am Abend für <Today_PVreal> gut.

VG,
  Guido.

minierm

#3148
Zitat von: SparcWolf am 16 Oktober 2023, 10:42:51Hallo Heiko,

ich nutze das neue Attribut <graphicHeaderOwnspec> und da hätte ich einen Anpassungswunsch.
Abends (nach Sonnenuntergang ?) hat die Anzeige von <Today_PVreal> sehr viele Nachkommastellen (siehe Anhang).
Tagsüber werden alle Werte ohne Nachkommastellen oder mit einer Nachkommastelle angezeigt.
So fände ich das auch am Abend für <Today_PVreal> gut.

VG,
  Guido.
Einfach selber definieren:
attr PVForecastDach userReadings Today_PVreal_kWh:Today_PVreal.* {sprintf("%0.1f kWh", ReadingsNum($NAME, "Today_PVreal", 0)/1000)}

stefanru

Hi Heiko,

hätte eine Frage zum Reading statistic_conForecastTillNextSunrise.

Ich rechne mit den Überschuss bis zum nächsten Sonnenaufgang aus und zeige diesen an.
Also Batterie_Wh_verbleibend - statistic_conForecastTillNextSunrise.
Was mir aber auffällt der Wert passt jede Stunde gut und weicht dann ab.

Ich denke da die conForecast Daten nur stündlich vorliegen wird nur stündlich aktualisiert und unter der Stunde keine Korrektur vorgenommen, richtig?
Dadurch weicht man immer maximal ab bis er dann wieder auf einmal nach unten fällt.
Könnte man den Wert für die Stunde nicht einfach durch die Zeit teilen um auch eine aktualisierung und genaueren Wert auch während einer laufenden Stunde zu haben?

Danke und Gruß,
Stefan