Datenerfassung ortsnetz-auslastung.de

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

Vorheriges Thema - Nächstes Thema

Nobbynews

Zitat von: passibe am 10 Oktober 2026, 21:09:14Ich 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.
Da steht bei mir aktuell
fhem.pl:31730/2026-10-04Beim nächsten Update von fhem.pl steht da was neues und führt in der Statistik der Betreiber bei unterschiedlichen Ständen zu unsinnigen Einträgen in der Auswertung..
Finde ich jetzt nicht unbedingt eine gute Idee.
Eigentlich sollte fhem reichen.
Meine Meinung.

KölnSolar

#16
Wie gesagt, ich diskutiere das. Es sollte in deren Statistik helfen, aber auch verdeutlichen, dass es aus unserer community kommt. Und dann bei uns auch einheitlich sein.

Ich überlege die ganze Zeit, wie wir es für alle FHEMler, einfacher machen könnten. Halt ohne im Code zu fummeln.
Mir fiel nur readingsproxy ein. Übersichtliches define mit den Übersetzungen der devices:readings und setstates für die Fixwerte. Das ursprüngliche at von Handl müsste nicht mehr angepasst werden. Ggfs. auch in die myUtils ausgelagert werden können.
define Ortsnetz readingsProxy \
zaehler:Spannung_U1:l1_v \
zaehler:Spannung_U2:l2_v \
zaehler:Spannung_U3:l3_v \
zaehler:Frequenz:grid_frequency_hz \
Fronius:Wert_WR1_24:pv_forecast_kwh

setstate Ortsnetz 2026-10-10 21:18:25 latitude 50
setstate Ortsnetz 2026-10-10 21:18:41 longitude 12
setstate Ortsnetz 2026-10-10 21:19:28 plant_capacity_kwp 8.6
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

Was meint Ihr ?

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

Gisbert

Hallo Markus,

ich kann leider nicht beurteilen, ob dein Code für den gemeinen Fhem-User einfacher als der Code im Eingangspost ist.
In der Zwischenzeit hab ich bei integration_version FHEM (in Großbuchstaben) reingeschrieben. Ich fände es auch besser, wenn alle Fhem-User den gleichen Begriff in identischer Schreibweise benutzen könnten.

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

So, wir machen es also so
"integration_version": "FHEM-v0.1" und

"smartmeter_model": "Holley EHZ541-ZE"

für mein Beispiel mit Holley-Smartmeter-Lesekopf-OBIS oder sonstwie Lesekopf oder Messwandler-System....
 
Für Daten aus Wechselrichtermodul den Hersteller z.B. "smartmeter_model": "Fronius"

Gebt bitte Eure Meinung oder Alternativvorschlag zu meinem (noch angepassten) Vorschlag 2 Posts vorher ab.
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 Markus,

den Text sieht man als Normal-User nicht, oder?

Ich hänge mich an die Mehrheit. 8)

Wird im Git des Projektes das Vorgehen für FHEM noch beschrieben?

Gruss Gerd

ph1959de

Zitat von: KölnSolar am 10 Oktober 2026, 21:38:23Ich überlege die ganze Zeit, wie wir es für alle FHEMler, einfacher machen könnten. Halt ohne im Code zu fummeln.
Mir fiel nur readingsproxy ein. Übersichtliches define mit den Übersetzungen der devices:readings und setstates für die Fixwerte. Das ursprüngliche at von Handl müsste nicht mehr angepasst werden. Ggfs. auch in die myUtils ausgelagert werden können.
define Ortsnetz readingsProxy \
zaehler:Spannung_U1:l1_v \
zaehler:Spannung_U2:l2_v \
zaehler:Spannung_U3:l3_v \
zaehler:Frequenz:grid_frequency_hz \
Fronius:Wert_WR1_24:pv_forecast_kwh

setstate Ortsnetz 2026-10-10 21:18:25 latitude 50
setstate Ortsnetz 2026-10-10 21:18:41 longitude 12
setstate Ortsnetz 2026-10-10 21:19:28 plant_capacity_kwp 8.6
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

Was meint Ihr ?

Grüße Markus
Erscheint mir sinnvoll ... spricht etwas dagegen, dann auch gleich

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

zu benutzen?
Aktives Mitglied des FHEM e.V. | Moderator im Forenbereich "Wiki"

ph1959de

Ich habe mal versucht, den aktuellen Stand auf der Seite Ortsnetz Auslastung im Wiki zu beschreiben (und werde auch "neue Erkenntnisse" von hier einarbeiten).
Aktives Mitglied des FHEM e.V. | Moderator im Forenbereich "Wiki"

Wzut

auf gehts , es sind neue Messwerte in Planung :
https://github.com/thomaslehmann1234/datenerfassung-ortsnetz-auslastung/blob/master/API.md -> Geplante optionale Messfelder
Feld     Typ     Einheit / Bereich     Beschreibung
l1_v_min, l1_v_max, l1_v_avg     Zahl     V     Minimum, Maximum und arithmetischer Mittelwert der Spannung an L1
l2_v_min, l2_v_max, l2_v_avg     Zahl     V     Minimum, Maximum und arithmetischer Mittelwert der Spannung an L2
l3_v_min, l3_v_max, l3_v_avg     Zahl     V     Minimum, Maximum und arithmetischer Mittelwert der Spannung an L3
grid_frequency_hz_min, grid_frequency_hz_max, grid_frequency_hz_avg     Zahl     Hz     Minimum, Maximum und arithmetischer Mittelwert der Netzfrequenz
battery_capacity     Zahl     kWh     Nutzbare Batteriespeicherkapazität; kein Ladezustand und kein aktueller Energieinhalt
power_factor     Zahl     Dimensionslos, 0 bis 1 einschließlich     Leistungsfaktor: Verhältnis von Wirkleistung zu Scheinleistung (P / S)
apparent_power_va     Zahl     VA     Scheinleistung in Voltampere; keine Wirkleistung
power_w     Zahl     W     Wirkleistung in Watt; keine Scheinleistung
l1_a, l2_a, l3_a     Zahl     A     Aktuelle Stromstärke an L1, L2 beziehungsweise L3; keine Leistung
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

KölnSolar

Dann lass uns mal über den Sinn bzw. die verfügbaren Daten in FHEM diskutieren.

Ich denke die min/max/avg Werte machen wenig Sinn, da Sie kaum bei jemandem ermittelt werden dürften.

Blind- bzw. Scheinleistung dürfte auch nur wenige haben.

Wirkleistung dürfte bei jedermann vorliegen, die Ströme je Phase vermutlich weniger. Die Werte kämen aus meiner Sicht in Frage für mein "Proxy-Modell" und die zugehörige Sub für die myUtils. Gut, dass ich es bisher noch nicht veröffentlicht habe,  ;)

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 19 Oktober 2026, 11:19:03Dann lass uns mal über den Sinn bzw. die verfügbaren Daten in FHEM diskutieren.
Sieht mir mehr nach Sammelwut aus, als nach sinnvollen Werten.
Ich finde z.B. die arithmetischen Mittelwerte mehr als fraglich. Hat doch überhaupt keine Aussagekraft über den zeitlichen Verlauf der Spannungen innerhalb des Messintervalls.
Ein gewichteter Mittelwert wäre sinnvoller, also Summe 1/N × Messwert mit N = Anzahl der Messwerte pro Messintervall.
Ziemlicher Aufwand bei der Ermittlung.
Da bleibe ich bei den Basisdaten.

Meine Meinung....

CQuadrat

Ich bin da wegen der Qualität auch etwas skeptisch. Ich glaube nicht, dass da überall einheitlich gemessen wird.
Ich könnte z.B. von meiner Wallbox Spannungsdaten zur Verfügung stellen. An der Wallbox fällt allerdings beim Laden mit 11kW/16A die dort gemessene Spannung sprunghaft um 6V ab. Am Hausanschluss oder ein paar Häuser weiter wird das anders aussehen. Ich bezweifle daher, dass das für das lokale Ortsnetz aussagekräftig genug ist.

 
FHEM auf Mini-ITX-Server mit Intel Quad-Core J1900:
+ HM: HM-LAN, HM-USB, HM-MOD-UART mit div. HM-Komponenten
+ RFXtrx: Funkwetterstation Bresser mit ext. Thermometer, Regenmesser und Windmesser
+ TUL (KNX-Anbindung), MQTT, SONOS (div. Gimmicks), OneWire, Hue

KölnSolar

#26
So, habe die Stromstärken und Gesamtleistung eingebaut. Funktioniert, aber auf der Website sieht man....nichts.

Also, ich habe es auf Basis eines readingsProxy und einer sub für die myUtils umgesetzt.

Zuerst die sub für die myUtils. Ihr kennt das ja: einbauen, reload 99_myUtils in FHEM.

Wichtig: die sub heißt Ortsnetz. Genau wie mein readingsProxy. Wenn Änderung des Namens der sub müsst Ihr auch den Aufruf im Ausführungsteils des at(kommt später) ändern. Ändert Ihr das readingsProxy, müsst Ihr das in der sub ändern !!!!!

##########################################################################################
# Ortsenetzauslastung - support project https://ortsnetz-auslastung.de/
# Subroutine to submit grid value
# prereqisitions:
# proxy-device to collect data from meter device. have a look at the wiki for setup
##########################################################################################
sub Ortsnetz {
#  use HttpUtils;
  use JSON::PP ();

  my $Proxydevice = "Ortsnetz"; 
#  my $lat  = AttrNum("global", "latitude", -1);
#  my $lon  = AttrNum("global", "longitude", -1);
  my $forecast = ReadingsVal($Proxydevice, "pv_forecast_kwh",-1);
  # --------------------------------------------------

  my %data = (
    observed_at         => strftime("%Y-%m-%dT%H:%M:%SZ", gmtime()),
    latitude            => ReadingsVal($Proxydevice, "latitude", -1),
    longitude           => ReadingsVal($Proxydevice, "longitude", -1),
    l1_v                => ReadingsVal($Proxydevice, "l1_v", -1),
    l2_v                => ReadingsVal($Proxydevice, "l2_v", -1),
    l3_v                => ReadingsVal($Proxydevice, "l3_v", -1),
    l1_a                => ReadingsVal($Proxydevice, "l1_a", -1),
    l2_a                => ReadingsVal($Proxydevice, "l2_a", -1),
    l3_a                => ReadingsVal($Proxydevice, "l3_a", -1),
    power_w             => ReadingsVal($Proxydevice, "power_w", -1),
    grid_frequency_hz   => ReadingsVal($Proxydevice, "grid_frequency_hz", -1),
    smartmeter_model    => ReadingsVal($Proxydevice, "smartmeter_model",""),
    integration_version => ReadingsVal($Proxydevice, "integration_version","FHEM-v0.1"),
    plant_capacity_kwp  => ReadingsVal($Proxydevice, "plant_capacity_kwp",-1),
  );
 
  $data{pv_forecast_kwh} = $forecast  if ($forecast > 0);

  my $json = encode_json(\%data);

  my $param = {
    url      => "https://www.ortsnetz-auslastung.de/v1/measurements",
    timeout  => 10,
    method   => "POST",
    header   => "Content-Type: application/json",
    data     => $json,
    hash     => $defs{$Proxydevice},
    callback => sub($$$) {
      my ($param, $err, $data) = @_;
      my $hash = $param->{hash};

      if ($err)                     { Log3 $Proxydevice, 2, "ortsnetz-auslastung.de API Fehler: $err"; return;}
      my $response = eval {JSON::PP->new->utf8(0)->decode($data) };
      if ($@)                       { Log3 $Proxydevice, 2, "ortsnetz-auslastung.de API JSON-Decode-Fehler: $@"; return; }
      if (ref($response) ne "HASH") { Log3 $Proxydevice, 2, "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 $Proxydevice, 4, "ortsnetz-auslastung.de API Antwort: $data";
    }
  };
  Log3 $Proxydevice, 4, "ortsnetz-auslastung.de API Anfrage: POST $param->{url} | Body: $json";
  HttpUtils_NonblockingGet($param);

}

Nun das readingsProxy. Meins sieht so aus:
define Ortsnetz readingsProxy zaehler:Spannung_U1:l1_v \
zaehler:Spannung_U2:l2_v \
zaehler:Spannung_U3:l3_v\
zaehler:Strom_I1:l1_a\
zaehler:Strom_I2:l2_a\
zaehler:Strom_I3:l3_a\
zaehler:power:power_w\
zaehler:Frequenz:grid_frequency_hz
attr Ortsnetz room Energie

setstate Ortsnetz 2026-10-19 19:00:38 accepted 1
setstate Ortsnetz 2026-10-19 19:00:38 created 1
setstate Ortsnetz 2026-10-19 19:04:02 grid_frequency_hz 50
setstate Ortsnetz 2026-10-10 21:49:13 integration_version FHEM-v0.1
setstate Ortsnetz 2026-10-19 19:04:02 l1_a 2.26
setstate Ortsnetz 2026-10-19 19:04:02 l1_v 231.4
setstate Ortsnetz 2026-10-19 19:02:02 l2_a 0.39
setstate Ortsnetz 2026-10-19 19:04:02 l2_v 231.7
setstate Ortsnetz 2026-10-19 19:00:02 l3_a 0.61
setstate Ortsnetz 2026-10-19 19:04:02 l3_v 232.7
setstate Ortsnetz 2026-10-10 21:49:13 latitude 55
setstate Ortsnetz 2026-10-10 21:49:13 longitude 10
setstate Ortsnetz 2026-10-10 21:49:13 plant_capacity_kwp 8.6
setstate Ortsnetz 2026-10-19 19:04:02 power_w 326
setstate Ortsnetz 2026-10-10 21:49:13 smartmeter_model Holley EHZ541-ZE
setstate Ortsnetz 2026-10-19 19:00:38 status_l1 green
setstate Ortsnetz 2026-10-19 19:00:38 status_l2 green
setstate Ortsnetz 2026-10-19 19:00:38 status_l3 green
setstate Ortsnetz 2026-10-19 19:00:38 status_overall green
setstate Ortsnetz 2026-10-19 19:00:38 storage_recommendation none

Anlegen könnt Ihr das Eure ganz leicht durch Ersetzen mit Euren Datendefine EuerProxydevice readingsProxy \
EuerZaehlerdevice:EuerSpannungswertreadingPhase1:l1_v \
EuerZaehlerdevice:EuerSpannungswertreadingPhase2:l2_v \
EuerZaehlerdevice:EuerSpannungswertreadingPhase3:l3_v \
EuerZaehlerdevice:EuerStromstaerkereadingPhase1:l1_v \
EuerZaehlerdevice:EuerStromstaerkereadingPhase2:l2_v \
EuerZaehlerdevice:EuerStromstaerkereadingPhase3:l3_v \
EuerZaehlerdevice:EuerLeistungsreading:power_w \
EuerZaehlerdevice:EuerFrequenzwertreading:grid_frequency_hz \
EuerForecastdevice:EuerForecastreading:pv_forecast_kwh
attr EuerProxydevice room Euerroom
setstate EuerProxydevice 2026-10-10 21:49:13 latitude Eurelatitude
setstate EuerProxydevice 2026-10-10 21:49:13 longitude Eurelongitude
setstate EuerProxydevice 2026-10-10 21:49:13 plant_capacity_kwp EurePVAnlagenleistung
setstate EuerProxydevice 2026-10-10 21:49:13 smartmeter_model EuerSmartmetermodell

Selbsterklärend, oder ? Wenn Ihr readings nicht habt oder nicht übertragen wollt, lasst sie im readingsProxy  einfach weg.

Last but not least das at zur Übertragung der Daten im 5min-Zyklus.
define at_OrtsnetzAuslastung at +*00:05:00 {Ortsnetz()}
Für Tests habe ich es so gebaut, dass Ihr mit verbose=4 die übertragenen Daten und die Response seht.

Basis war das schöne Skript von Hadl !
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