Datenerfassung ortsnetz-auslastung.de

Begonnen von Hadl, 08 Oktober 2026, 00:14:46

Vorheriges Thema - Nächstes Thema

Hadl

Hallo zusammen,
ich hab mich an den Community Projekt https://ortsnetz-auslastung.de/ beteiligt und dort meine gemessenen Spannungen hochgeladen.

Falls jemand von euch das auch machen will, hier mein at dazu:

defmod at_OrtsnetzAuslastung at +*00:05:00 {\
  use HttpUtils;;\
  use JSON::PP ();;\
  my $deviceName = "at_OrtsnetzAuslastung";;\
  # --- Koordinaten --- \
  my $lat  = 12.34;;\
  my $lon  = 45.67;;\
  \
  # --- Zählerwerte --- \
  my $l1_v = ReadingsVal("Fronius_Symo1", "Meter_0_Voltage_AC_Phase_1", -1);;\
  my $l2_v = ReadingsVal("Fronius_Symo1", "Meter_0_Voltage_AC_Phase_2", -1);;\
  my $l3_v = ReadingsVal("Fronius_Symo1", "Meter_0_Voltage_AC_Phase_3", -1);;\
  my $freq = ReadingsVal("Fronius_Symo1", "Meter_0_Frequency_Phase_Average", -1);;\
  my $observed_at = strftime("%Y-%m-%dT%H:%M:%SZ", gmtime());;;;\
  # -------------------------------------------------- \
  \
  my $json = sprintf('{"observed_at":"%s", "latitude":%s,"longitude":%s,"l1_v":%s,"l2_v":%s,"l3_v":%s,"grid_frequency_hz":%s}',\
                       $observed_at,       $lat,         $lon,          $l1_v,    $l2_v,    $l3_v,     $freq);;\
  my $param = {\
    url      => "https://www.ortsnetz-auslastung.de/v1/measurements",\
    timeout  => 10,\
    method   => "POST",\
    header   => "Content-Type: application/json",\
    data     => $json,\
    hash     => $defs{$deviceName},\
    callback => sub($$$) {\
      my ($param, $err, $data) = @_;;\
      my $hash = $param->{hash};;\
\
      if ($err)                     { Log3 $deviceName, 3, "ortsnetz-auslastung.de API Fehler: $err";; return;;}\
      my $response = eval {JSON::PP->new->utf8(0)->decode($data) };;\
      if ($@)                       { Log3 $deviceName, 3, "ortsnetz-auslastung.de API JSON-Decode-Fehler: $@";; return;; }\
      if (ref($response) ne "HASH") { Log3 $deviceName, 3, "ortsnetz-auslastung.de API: JSON-Antwort ist kein Objekt: $data";; return;; }\
\
      readingsBeginUpdate($hash);;\
      readingsBulkUpdate($hash, "accepted",               $response->{accepted})                if defined $response->{accepted};;\
      readingsBulkUpdate($hash, "created",                $response->{created})                 if defined $response->{created};;\
      readingsBulkUpdate($hash, "storage_recommendation", $response->{storage_recommendation})  if defined $response->{storage_recommendation};;\
\
      if (ref($response->{status}) eq "HASH") {\
        for my $key (qw(l1 l2 l3 overall)) {\
          readingsBulkUpdate($hash, "status_$key", $response->{status}{$key})                   if defined $response->{status}{$key};;\
        }\
      }\
      readingsEndUpdate($hash, 1);;\
      Log3 $deviceName, 3, "ortsnetz-auslastung.de API Antwort: $data";;\
    }\
  };;\
  Log3 $deviceName, 3, "ortsnetz-auslastung.de API Anfrage: POST $param->{url} | Body: $json";;\
  HttpUtils_NonblockingGet($param);;\
}

Viele Grüße

Hadl
FHEM: Rpi 5 + SSD / WR: Fronius Symo Gen24 10.0 Plus + BYD HVS 7.7, Fronius Symo Gen24 12.0 SC (60%) PV: (Ost=3.5 West=6.6 Nord=9.9 Ost=4.5) / Homematic BidCoS / Shelly / Viessmann

KölnSolar

#1
Morjen Hadl,
interessant.
Wenn die Daten nicht wirklich aus Italien kommen, Alles OK. Sonst vielleicht lat/lon anonymisieren.
Oder gleich die Daten, bei vielen wohl vorhanden, aus dem Global-device nehmen.
  my $lat  = ReadingsVal("global", "latitude", -1);;\
  my $lon  = ReadingsVal("global", "longitude", -1);;\

Mal sehen, ab wann meine Daten in der Karte auftauchen.

Danke&Grüße
Markus
Edit: und Nobbynews hat mit dem folgenden Post völlig recht. Kaum macht mans richtig, erscheint man auch sofort in der Karte.
RPi5/3/2 Trixie-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-ecovacs(mqtt2)-zigbee2mqtt

Nobbynews

#2
Zitat von: KölnSolar am 08 Oktober 2026, 07:25:30Oder gleich die Daten, bei vielen wohl vorhanden, aus dem Global-device nehmen.
  my $lat  = ReadingsVal("global", "latitude", -1);;\
  my $lon  = ReadingsVal("global", "longitude", -1);;\
Das sind aber Attribute des device global.
Also:
my $lat  = AttrNum("global", "latitude", -1);;\
my $lon  = AttrNum("global", "longitude", -1);;\


KölnSolar

RPi5/3/2 Trixie-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-ecovacs(mqtt2)-zigbee2mqtt

Gisbert

Hallo Hadl,

anscheinend kann man auch die PV-Prognose hochladen (Forecast-Ertrag x.xx kWh/kWp/Tag).
Wie kan man das denn machen?

Viele Grüße Gisbert
Proxmox | UniFi | RHASSPY | DEYE | JK-BMS | ESPHome | Panasonic Heishamon | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Rauchmelder FA21/22RF

KölnSolar

Hab Dich schon in der Karte gesehen.  8)

Vermutlich

die Variablen in kWp, kWh
my $capacity= ReadingsVal("yourdevice", "capacity", -1);;\
my $forecast= ReadingsVal("yourdevice", "forecast", -1);;\
und
my $json = sprintf('{"observed_at":"%s", "latitude":%s,"longitude":%s,"l1_v":%s,"l2_v":%s,"l3_v":%s,"grid_frequency_hz":%s}',\
                       $observed_at,       $lat,         $lon,          $l1_v,    $l2_v,    $l3_v,     $freq);;\
in

my $json = sprintf('{"observed_at":"%s", "latitude":%s,"longitude":%s,"l1_v":%s,"l2_v":%s,"l3_v":%s,"grid_frequency_hz":%s,"plant_capacity_kwp":%s,"pv_forecast_kwh":%s}',\
                       $observed_at,       $lat,         $lon,          $l1_v,    $l2_v,    $l3_v,     $freq,    $capacity,     $forecast);;\
ändern.
Im Log gucken, was zurückgemeldet wird, dann kann man ggfs. readings für die Rückmeldung angeben.
Grüße nach L.
Markus
RPi5/3/2 Trixie-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-ecovacs(mqtt2)-zigbee2mqtt

KölnSolar

Und für en bisschen Eigenwerbung bei deren Statistikern schreiben wir noch leicht verändert  my $json = sprintf('{"observed_at":"%s", "latitude":%s,"longitude":%s,"l1_v":%s,"l2_v":%s,"l3_v":%s,"grid_frequency_hz":%s,"smartmeter_model":"FHEM"}',
                       $observed_at,       $lat,         $lon,          $l1_v,    $l2_v,    $l3_v,     $freq);
bzw.
my $json = sprintf('{"observed_at":"%s", "latitude":%s,"longitude":%s,"l1_v":%s,"l2_v":%s,"l3_v":%s,"grid_frequency_hz":%s,"plant_capacity_kwp":%s,"pv_forecast_kwh":%s,"smartmeter_model":"FHEM"}',
                       $observed_at,       $lat,         $lon,          $l1_v,    $l2_v,    $l3_v,     $freq,    $capacity,     $forecast);

Markus
RPi5/3/2 Trixie-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-ecovacs(mqtt2)-zigbee2mqtt

softwear

Requestfelder sind dem Github zu entnehmen: https://github.com/thomaslehmann1234/datenerfassung-ortsnetz-auslastung/blob/master/API.md

Danke für den Hinweis auf das Projekt. Ich habe mich auch direkt beteiligt, da hier bereits eine Meldung an die Westnetz durch mich erfolgte, da die Überspannung den Wechselrichter mehrfach zur Abschaltung nötigte.

Beste Grüße
Peter

Gisbert

Zitat von: KölnSolar am 10 Oktober 2026, 06:26:17Hab Dich schon in der Karte gesehen.  8)

Vermutlich

die Variablen in kWp, kWh
my $capacity= ReadingsVal("yourdevice", "capacity", -1);;\
my $forecast= ReadingsVal("yourdevice", "forecast", -1);;\
und
my $json = sprintf('{"observed_at":"%s", "latitude":%s,"longitude":%s,"l1_v":%s,"l2_v":%s,"l3_v":%s,"grid_frequency_hz":%s}',\
                      $observed_at,      $lat,        $lon,          $l1_v,    $l2_v,    $l3_v,    $freq);;\
in

my $json = sprintf('{"observed_at":"%s", "latitude":%s,"longitude":%s,"l1_v":%s,"l2_v":%s,"l3_v":%s,"grid_frequency_hz":%s,"plant_capacity_kwp":%s,"pv_forecast_kwh":%s}',\
                      $observed_at,      $lat,        $lon,          $l1_v,    $l2_v,    $l3_v,    $freq,    $capacity,    $forecast);;\
ändern.
Im Log gucken, was zurückgemeldet wird, dann kann man ggfs. readings für die Rückmeldung angeben.
Grüße nach L.
Markus


Hallo Markus,

log sieht gut aus - scheint damit funktioniert zu haben. Da ich in meinen Fhem-Devices die Gesamtleistung nicht als kWp habe, habe ich in die Definition die installierte Leistung als Zahl reingeschrieben - hat funktioniert.

Die Werbung in eigener Sache habe ich auch eingebaut, aber die erscheint offenbar nicht auf der Webseite.

Viele Grüße Gisbert
Proxmox | UniFi | RHASSPY | DEYE | JK-BMS | ESPHome | Panasonic Heishamon | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Rauchmelder FA21/22RF

KölnSolar

Prima, Deinen geänderten Eintrag gesehen. Diskutiere gerade in deren Forum, den Forecast visibler zu machen.
RPi5/3/2 Trixie-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-ecovacs(mqtt2)-zigbee2mqtt

Maista

Hallo zusammen,

ich bin nun auch mit dabei.
Ich habe das Sub in ein myUtils ausgelagert.

Die Netzfrequenz musste ich allerdings von einer HM-Steckdose borgen.
Meine Shelly 3EM soll keine Netzfrequenz per MQTT ausgeben können.
Alternativ gibt es noch ein HM-800 per Ahoy.

Gruss Gerd

Wzut

Zitat von: KölnSolar am 10 Oktober 2026, 07:08:55Und für en bisschen Eigenwerbung bei deren Statistikern schreiben wir noch leicht verändert
"smartmeter_model"

wäre IMHO nach der Parameter Erklärung bzw. den Beispielen auf Github statt smartmeter_model nicht eher integration_version passender ?

BTW : gute Sache !!!
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

KölnSolar

Was wir in welchem der beiden Felder eintragen, diskutiere ich noch mit denUrhebern
RPi5/3/2 Trixie-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-ecovacs(mqtt2)-zigbee2mqtt

Wzut

ah ok FHEM-v0.1 klingt gut und mein Model wäre dann SMA HM2.0  (SMA HomeManager).
Ich hatte erst die L1-L3 Daten direkt von meinem SMA Tripower 8000 genommen, aber der liefert Blödsinn via Modbus sobald auf der PV Seite nichts mehr kommt.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

passibe

Vielen Dank fürs Teilen! Funktioniert top bei mir.

Ich würde vorschlagen, bei integration_version einfach AttrVal("global", "version", "fhem") zu nehmen. Das ist dann für alle FHEM-Instanzen auch einheitlich formatiert und hängt nicht davon ab, dass die Leute irgendwas händisch eintragen.

Bei smartmeter_model dann die jeweilige Hardware, die tatsächlich misst. Bei mir z.B. ein DTSU666-H.

Sieht bei mir dann insgesamt so aus (aus dem DEF, nicht raw):

  # --- Koordinaten ---
  my $lat  = AttrNum("global", "latitude", -1);
  my $lon  = AttrNum("global", "longitude", -1);
 
  # --- Zählerwerte ---
  my $l1_v = ReadingsVal("pv_wr", "PM_Spannung_Netz_A", -1);
  my $l2_v = ReadingsVal("pv_wr", "PM_Spannung_Netz_B", -1);
  my $l3_v = ReadingsVal("pv_wr", "PM_Spannung_Netz_C", -1);
  my $grid_frequency_hz = ReadingsVal("pv_wr", "PM_Netzfrequenz", -1);
  my $observed_at = strftime("%Y-%m-%dT%H:%M:%SZ", gmtime());;
  my $smartmeter_model = "DTSU666-H 250 A/50 mA";
  my $integration_version = AttrVal("global", "version", "fhem");
  # --------------------------------------------------
 
  my $json = sprintf('{"observed_at":"%s", "latitude":%s,"longitude":%s,"l1_v":%s,"l2_v":%s,"l3_v":%s,"grid_frequency_hz":%s, "smartmeter_model":"%s", "integration_version":"%s"}',
    $observed_at, $lat, $lon, $l1_v, $l2_v, $l3_v, $grid_frequency_hz, $smartmeter_model, $integration_version);