{gelöst] SolarForecast - PV-Vorhersage an evcc übertragen geht nicht

Begonnen von dieter114, 21 März 2026, 16:36:44

Vorheriges Thema - Nächstes Thema

DS_Starter

Ich würde nochmal dafür plädieren den Code und den Aufruf wie von mir in #9 zu ändern. Dann wäre der Code im Wiki universell verwendbar nach der Änderung.
Könnt ihr gern mal anpassen und Rückantwort geben.
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

dieter114

#16
Ich füge hier nochmal meine Einstellungen an.
userReading im Modul mit Namen Forecast:
userReadings  jsonReading:nextCycletime.* { main::forecast_json($NAME) }Eintrag in 99_myUtils.pm:
#####################################################################################################################
#  Wandelt die Forecast-Werte in JSON und ins UTC-Zeitformat um, zur Verwendung durch evcc
#  Für die Kommunikation wird der Webserver WEBapi benutzt (8086, kein HTTPS, kein csrfToken)
#  evcc.yaml siehe tariffs: solar: ...
#  uri: http://192.168.178.44:8086/fhem?cmd=%7BReadingsVal%28%27[b]<SF-Device>[/b]%27%2C%27jsonReading%27%2C%27%27%29%7D&XHR=1
#####################################################################################################################
package main;

use strict;
use warnings;
use POSIX;
use JSON;
use DateTime;
use DateTime::Format::Strptime;

sub forecast_json {

    my $hour = 0;
    my @output;

    # Parser für Datum mit CET/CEST
    my $parser = DateTime::Format::Strptime->new(
        pattern   => '%Y-%m-%d %H:%M:%S',
        time_zone => 'Europe/Berlin',
    );

    # Alle NextHour-Daten durchsuchen
    while ($hour < 100) {
        my $hour_str = sprintf('NextHour%02d', $hour);
        my $start_str = FHEM::SolarForecast::NexthoursVal ('Forecast', $hour_str, 'starttime', 'na');
        my $pvfc = FHEM::SolarForecast::NexthoursVal ('Forecast', $hour_str, 'pvfc', 'na');

        # Schleife beenden, wenn keine Werte mehr vorhanden sind
        last if $start_str eq 'na' or $pvfc eq 'na';

        # parse und konvertiere Zeit
        my $start_dt = $parser->parse_datetime($start_str);
        my $end_dt   = $start_dt->clone->add(hours => 1);

        # nach UTC konvertieren
        $start_dt->set_time_zone('UTC');
        $end_dt->set_time_zone('UTC');

        push @output, {
            start => $start_dt->iso8601() . 'Z',
            end   => $end_dt->iso8601() . 'Z',
            value => 0 + $pvfc,
        };
       
        $hour++;
    }

    # Ausgabe als JSON
    my $json = JSON->new->utf8->pretty->encode(\@output);
    return $json;
}
dann die Einstellungen in evcc Titel: <irgendwas> Anbieter: Benutzerdefiniertes Gerät
tariff: solar
forecast:
  source: http
  uri: http://192.168.178.25:8089/fhem?cmd=%7BReadingsVal%28%27Forecast%27%2C%27jsonReading%27%2C%27%27%29%7D&XHR=1
  jq: |
    map({
      "start": .start,
      "end": .end,
      "value": .value
    }) | tostring



RPi II+III+V,OWX,div.1W Module,HM Zisterne,div. CUL, sduino MAPLESDuino(adv), div ESPEasy, div Tasmota, MQTT2Server,WU-Upload,TabletUI,Poolsteuerung mit fhem, Fronius, BYD Solaranlage

DS_Starter

#17
Wenn du den Aufruf so machst:

userReadings  jsonReading:nextCycletime.* { main::forecast_json($NAME) }

Dann kannst du deine festen Namen im Code durch $NAME ersetzen und es passt immer:

#####################################################################################################################
#  Wandelt die Forecast-Werte in JSON und ins UTC-Zeitformat um, zur Verwendung durch evcc
#  Für die Kommunikation wird der Webserver WEBapi benutzt (8086, kein HTTPS, kein csrfToken)
#  evcc.yaml siehe tariffs: solar: ...
#  uri: http://192.168.178.44:8086/fhem?cmd=%7BReadingsVal%28%27[b]<SF-Device>[/b]%27%2C%27jsonReading%27%2C%27%27%29%7D&XHR=1
#####################################################################################################################

sub forecast_json {
    my ($NAME) = @_;
    my $hour = 0;
    my @output;

    # Parser für Datum mit CET/CEST
    my $parser = DateTime::Format::Strptime->new(
        pattern   => '%Y-%m-%d %H:%M:%S',
        time_zone => 'Europe/Berlin',
    );

    # Alle NextHour-Daten durchsuchen
    while ($hour < 100) {
        my $hour_str = sprintf('NextHour%02d', $hour);
        my $start_str = FHEM::SolarForecast::NexthoursVal ($NAME, $hour_str, 'starttime', 'na');
        my $pvfc = FHEM::SolarForecast::NexthoursVal ($NAME, $hour_str, 'pvfc', 'na');

        # Schleife beenden, wenn keine Werte mehr vorhanden sind
        last if $start_str eq 'na' or $pvfc eq 'na';

        # parse und konvertiere Zeit
        my $start_dt = $parser->parse_datetime($start_str);
        my $end_dt   = $start_dt->clone->add(hours => 1);

        # nach UTC konvertieren
        $start_dt->set_time_zone('UTC');
        $end_dt->set_time_zone('UTC');

        push @output, {
            start => $start_dt->iso8601() . 'Z',
            end   => $end_dt->iso8601() . 'Z',
            value => 0 + $pvfc,
        };
       
        $hour++;
    }

    # Ausgabe als JSON
    my $json = JSON->new->utf8->pretty->encode(\@output);
    return $json;
}

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

dieter114

So ist es richtig, das muss ins WIKI aber:
Für die Erstellung des Webservers WEBapi:
defmod WEBapi FHEMWEB IPV6:8089 global
attr WEBapi csrfToken none
ohne die IPV6 lief das Teil bei mir nicht.
Ich verwende IPV6 auch im Hausnetz.

LG WDS
RPi II+III+V,OWX,div.1W Module,HM Zisterne,div. CUL, sduino MAPLESDuino(adv), div ESPEasy, div Tasmota, MQTT2Server,WU-Upload,TabletUI,Poolsteuerung mit fhem, Fronius, BYD Solaranlage

DS_Starter

#19
Schaut es euch jetzt mal im Wiki an.
Sollte nun alles drin sein an Infos.
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

@Dieter: Schön, dass es jetzt läuft
@Heiko: Danke für die Arbeit am wiki und insb. für die "Normierung"

Nach einem Tag Arbeit und Recherche an diesem "doofen" evcc Template war ich so froh, dass ich diesen blöden Fehler (.power anstatt .value) gefunden hatte, dass ich nicht mehr an die Abstrahierung des Codes gedacht habe - obwohl, ein wenig Transferleistung hat ja noch niemandem geschadet.  ;)
Wir haben uns viel zu sehr daran gewöhnt, schlüsselfertige Lösungen zu übernehmen ohne sie zu verstehen und zu hinterfragen. Das ist eine Erfahrung, die ich insb. auch im Umgang mit KI gemacht habe.
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

#21
Noch ein Tipp ...
wenn euch der Inhalt des userReadings zu viel wird und deswegen die Ansicht des Device zu unübersichtlich, könnt ihr auch ein versteckes Reading verwenden.
Das geht mit einem "." vor dem Readingnamen, also so:

userReadings  .jsonReading:nextCycletime.* { main::forecast_json($NAME) }

Das Reading ist normal vorhanden, aber in der Detailansicht nicht aufgeführt. Mit einem "list" sieht man den Inhalt. Beim Abruf ist natürlich auch ".jsonReading" zu verwenden.
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

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

grappa24

noch ein joke am Rande:

nachdem ich nun evccc mit dem jsonReading zwecks Erstellung der PV-Vorhersage gefüttert hatte, hat es sich evcc nicht nehmen lassen, jeden einzelnen Wert (start, end, value) via MQTT zu veröffentlichen und in FHEM letztlich als Reading anzulegen.
Mehr noch, insgesamt hat mir evcc auf diesem Weg über 1000 (Tausend) Readings angelegt  ::) und mir mein FHEM lahmgelegt.

Ich hab dann das komplette MQTT-evcc Device gelöscht und mit nur den benötigten Readings neu angelegt, autocreate auf 0 gesetzt und event-on-change-reading benutzt. Plötzlich war Ruhe im Karton.
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