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

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
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

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 ist aber ein Attribut des device global.
Also:
my $lat  = AttrNum("global", "latitude", -1);;\
my $lon  = AttrNum("global", "longitude", -1);;\