Ankündigung

Einklappen
Keine Ankündigung bisher.

Neuer Logikbaustein: Han-Schnittstelle auslesen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    HS/FS Neuer Logikbaustein: Han-Schnittstelle auslesen

    Hallo zusammen,

    hier ist ein Baustein zum Auslesen der HAN-Schnittstelle. Das Protokoll sollte standardisiert sein, im Baustein ist derzeit aber nur der Zugang per Nutzername/Passwort implementiert.

    Release: 14586_Han Parser.hsl.zip

    Source: https://github.com/hypnotoad/hsl2-han

    Parameter:
    - User/Passwort bekommt ihr vom Anbieter
    - Url: Ist bei PPC in der Form https://<ip>/cgi-bin/hanservice.cgi sein. Die IP wurde entweder vom Anbeiter verändert, oder sie ist noch auf dem Standardwert bzw. DHCP.

    lg
    Ralf
    Angehängte Dateien
    Zuletzt geändert von hypnotoad; 09.06.2025, 16:52.

    #2
    Welches SMGW liest du damit aus?
    In der firma habe ich das von PPC, werde ich mal testen (HS steht aber zuhause, dazwischen aber ein VPN).

    Kommentar


      #3
      Ich habe den von PPC. Bei mir list der SMGW _keine_ DHCP-Einstellungen und hat anscheinend keinen Default-Gateway gesetzt, so dass man noch ein NAT einrichten muss. Wenn Du von zu Hause die PPC-Seite abrufen kannst (und der HS auch), dann sollte es funktionieren.

      Kommentar


        #4
        Dann werde ich das mal testen. Habe hier auch die TRUDI-Software. Muss erstmal Username und Password für den PPC organisieren.

        Kommentar


          #5
          Vielen Dank für die Initiative bzw. das Teilen des Bausteins! Ich werde ihn auch demnächst testen. Habe ebenfalls einen PPC und bin bei EON/Bayernwerk.

          Kommentar


            #6
            Habe den Baustein getestet und er funktioniert wunderbar. HERZLICHEN DANK dafür! Ich musste für den Test allerdings die IP-Adresse meines Gira-Homeservers ändern.
            Gibt es eine Möglichkeit, die IP-Adresse des PPC-Smartmeter zu ändern? Die Adresse 192.168.1.200 liegt in einem anderen Netz als mein Heimnetz (192.168.178.x). Einen Layer 3-Switch habe ich leider nicht.

            Kommentar


              #7
              Habe erst jetzt Deine Nachricht gesehen. Ggf. kannst Du mit der Fritzbox ein Gästenetzwerk einrichten?

              Ich habe derzeit das Problem, dass nach einem Stromanbieterwechsel der neue Anbieter noch nicht im Smartmeter registriert ist. Dann bleibt der Verbrauch stehen - das PPC gibt anscheinend nicht den aktuellen Zählerstand zurück, sondern den abgerechneten Zählerstand.

              Kommentar


                #8
                Zitat von hypnotoad Beitrag anzeigen
                Hallo zusammen,

                hier ist ein Baustein zum Auslesen der HAN-Schnittstelle. Das Protokoll sollte standardisiert sein, im Baustein ist derzeit aber nur der Zugang per Nutzername/Passwort implementiert.

                Release: 14586_Han Parser.hsl.zip

                Source: https://github.com/hypnotoad/hsl2-han

                Parameter:
                - User/Passwort bekommt ihr vom Anbieter
                - Url: Ist bei PPC in der Form https://<ip>/cgi-bin/hanservice.cgi sein. Die IP wurde entweder vom Anbeiter verändert, oder sie ist noch auf dem Standardwert bzw. DHCP.

                lg
                Ralf
                Hallo Ralf, (@hypnotoad)

                werden die Daten zyklisch abgefragt? Wenn ja, in welchem Zyklus? Gibt es dort ggf. noch mehr Daten, außer Verbrauch und Leistung? Ich spiele vor allem auf die Signale des Netzbetreibers an, also LPC und LPP, sprich Limited Power Consumption (§14a) und Limited Power Production (§9 EnWG).

                Dazu auch den Verbrauch von 2.8.0 (Verbrauch) und die Einspeiseleistung.

                Viele Grüße!
                Nico
                Zuletzt geändert von skynet74; 15.04.2026, 18:10.

                Kommentar


                  #9
                  Es wird alle 15 Minuten abgefragt. Soweit ich das verstehe, ist das gängige Abrechnungsraster. Im Smartmeter sind Anfang und Ende jedes Zeitsegments genau aufgeführt.

                  Schau Dir mal die Daten mit Trudi direkt an, dann kannst Du genauer sehen, was im Smartmeter vorhanden ist.

                  Ggf. könnte man das mit dem Baustein noch zurückgeben, aber aktuell habe ich leider keine Zugriffsmöglichkeit, da ich den Stromanbieter gewechselt habe und dieser sich nicht verantwortlich für die Messstelle fühlt.

                  Kommentar


                    #10
                    @hypnotoad

                    Alles klar, mache ich und melde mich.

                    Viele Grüße!
                    Nico

                    Kommentar


                      #11

                      Update: Ich habe es hinbekommen, mit Masquerading im UniFi VLAN. => Ich bin am Update des Logikmodul interessiert. Die durchschnittlichen Leistungswerte der letzten Zeitperiode sind sicherkich nicht wichtig, aber neben dem Zählerstand des Bezuges wäre Einspeisung noch interessant.

                      Ich würde das Skipt anpassen, aber ich weiß nicht, wie man aus dem Code dann ein hsl baut. Da Du derzeit keinen Zähler zu testen hast, biete ich gern an, das zu überehmen.
                      Zuletzt geändert von skynet74; 18.04.2026, 08:23.

                      Kommentar


                        #12
                        @hypnotoad

                        Kannst Du den Code dahingehend anpassen, ich würde get_profile so erweitern:


                        Code:
                        ​def get_profile(self):
                            post_data = "tkn=" + self.token + "&action=showMeterProfile&mid=" + self.meter_id
                            request = urllib2.Request(self.urlstring, data=post_data)
                            
                            try:
                                response = self.opener.open(request)
                                if response.getcode() != 200:
                                    return None
                                html_content = response.read()
                            except Exception:
                                return None
                        
                            soup = bs4.BeautifulSoup(html_content, 'html.parser')
                            table_data = soup.find('table', id="metervalue")
                            
                            if not table_data:
                                return None
                        
                            target_rows = ["table_metervalues_line1", "table_metervalues_line2"]
                            result_data = []
                            
                            # Variable zum Zwischenspeichern des Zeitstempels
                            last_valid_timestamp = None
                        
                            for row_id in target_rows:
                                row = table_data.find('tr', id=row_id)
                                if row:
                                    # Zeitstempel extrahieren (nur in Zeile 1 vorhanden)
                                    ts_element = row.find(id="table_metervalues_col_timestamp")
                                    
                                    # Prüfen ob Element existiert und nicht leer ist
                                    if ts_element:
                                        ts_text = ts_element.get_text(strip=True)
                                        if ts_text:
                                            last_valid_timestamp = ts_text
                                    
                                    # Daten extrahieren
                                    # .find() sucht hier nur innerhalb der aktuellen 'row'
                                    try:
                                        raw_value = row.find(id="table_metervalues_col_wert").get_text(strip=True)
                                        
                                        data = {
                                            'line_id': row_id,
                                            'value': float(raw_value.replace(',', '.')),
                                            'unit': row.find(id="table_metervalues_col_einheit").get_text(strip=True),
                                            'timestamp': last_valid_timestamp,
                                            'isvalid': row.find(id="table_metervalues_col_istvalide").get_text(strip=True),
                                            'name': row.find(id="table_metervalues_col_name").get_text(strip=True),
                                            'obis': row.find(id="table_metervalues_col_obis").get_text(strip=True)
                                        }
                                        result_data.append(data)
                                    except AttributeError:
                                        # Falls ein Feld mal gar nicht existiert, um Absturz zu vermeiden
                                        continue
                        
                            return result_data​
                        Die HMTL Tabelle sieht so aus

                        Bildschirmfoto 2026-04-18 um 13.39.40.png
                        Zuletzt geändert von skynet74; 19.04.2026, 18:30.

                        Kommentar

                        Lädt...
                        X