Zum Inhalt springen

Ortsnetz Auslastung: Unterschied zwischen den Versionen

Aus FHEMWiki
Erste Version der Seite
 
K Kategorie angepasst
 
Zeile 92: Zeile 92:
* Karte mit den visualisierten Daten [https://ortsnetz-auslastung.de]
* Karte mit den visualisierten Daten [https://ortsnetz-auslastung.de]


[[Kategorie:Energieerzeugungsmessung]]
[[Kategorie:Energieversorgung]]

Aktuelle Version vom 13. Oktober 2026, 17:40 Uhr

Todo: Die Diskussion im Forum läuft noch, neue Erkenntnisse und Informationen sollten nach Bedarf hierher übernommen werden.

Im September 2026 wurde das Projekt Ortsnetz-Auslastung gestartet, das Daten über die Auslastung der Stromnetze, insbesondere der Orts- und Niederspannungsnetze sammelt und visualisiert.

Eine Möglichkeit, auch aus FHEM heraus Daten für dieses Projekt zu liefern, wird im Forenthema Datenerfassung ortsnetz-auslastung.de beschrieben.

Eine konsolidierte Zusammenfassung dieser Informationen findet sich in den folgenden Abschnitten.

at zur Aktualisierung der Daten auf dem Projektserver

defmod at_OrtsnetzAuslastung at +*00:05:00 {\
  use HttpUtils;;\
  use JSON::PP ();;\
  my $deviceName = "at_OrtsnetzAuslastung";;\
  # --- Koordinaten --- \
  my $lat  = AttrNum("global", "latitude", -1);;\
  my $lon  = AttrNum("global", "longitude", -1);;\
  \
  # --- Zählerwerte --- \
  my $l1_v = ReadingsVal("Ortsnetz", "voltageL1", -1);;\ 
  my $l2_v = ReadingsVal("Ortsnetz", "voltageL2", -1);;\
  my $l3_v = ReadingsVal("Ortsnetz", "voltageL3", -1);;\
  my $freq = ReadingsVal("Ortsnetz", "frequency", -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);;\
}
attr at_OrtsnetzAuslastung room PV

Daten (Variablen) im obigen Beispiel beziehen sich teilweise auf das im Folgenden gezeigte ReadingsProxy Device Ortsnetz, teilweise wird auch gezeigt, wie die Daten "direkt" aus FHEM Devices (Readings oder Attributen) geholt werden können.

Zugehörige "Konfiguration"

Zur Anpassung an die jeweilige Installation können im folgenden ReadingsProxy die Zählerinformationen, Koordinaten und andere Informationen individualisiert werden:

defmod Ortsnetz readingsProxy \
meterDevice:voltageL1:l1_v  \
meterDevice:voltageL2:l2_v \
meterDevice:voltageL3:l3_v \
meterDevice:frequency:Frequenz

attr Ortsnetz userReadings latitude {AttrNum("global", "latitude", -1)}, longitude {AttrNum("global", "longitude", -1)}

setstate Ortsnetz 2026-10-10 21:19:28 plant_capacity_kwp 5.5
setstate Ortsnetz 2026-10-10 21:19:28 integration_version FHEM-v0.1
setstate Ortsnetz 2026-10-10 21:19:28 smartmeter_model Holley EHZ541-ZE

Hierbei sind verschiedene Wege genutzt, um die Daten zu sammeln:

Readings von existierenden Devices
<meterDevice>:<voltageL1>:l1_v
Daten aus Device-Attributen (hier dem global Device)
userReadings für die Geo-Koordinaten
Eintragung von Fixwerten, wenn keine "dynamischen" Datenquellen zur Verfügung stehen
setstate Ortsnetz <timestamp> <Request-Feldname> Wert

Links