Kleinrotti / py-senertec

Senertec energy system gen2 interface.
MIT License
2 stars 1 forks source link

Innogen #2

Closed emse1981 closed 1 year ago

emse1981 commented 1 year ago

Hallo, Ich besitze den Vorgänger von Senertec Dachs 0.8 das ist der Dachs InnoGen. Kann die Daten aber genauso übers Dachsportal 2 auslesen. Bekomm hier aber das Python-Script nur teilweise zum laufen. Es gibt mir keine Werte aus. Kann das angepasst werden? Vielen Dank

Kleinrotti commented 1 year ago

Das sollte kein Problem sein. Dazu muss die productGroups.json entsprechend erweitert werden. Die nötigen Werte bekommt man mithilfe der Entwicklertools im Browser (F12). Hier kurz die Schritte erklärt:

Produktgruppe auslesen

  1. Die Dachsportal2 Seite aufrufen und die Entwicklertools öffnen und den Reiter Netzwerk öffnen.
  2. Im Dachsportal einloggen
  3. In den Entwicklertools nach "units" filtern um die Produktgruppe der Heizung auszulesen (ganz unten "productGroup") image

    Datenpunkte auslesen

    Jeder Heizungstyp hat seine eigenen Datenpunkte diese bekommt durch auslesen der Seitenelemente.

  4. Nach dem Einloggen auf dem Dachsportal wieder die Entwicklertools öffen und den Reiter Elemente öffen.
  5. Dort den jeweiligen Punkt suchen von welchem man den Wert haben möchte, dieser steht in der Property "title" vom Element. image
  6. Datenpunktnamen notieren (hier z.B. MM000) und mit den anderen Werten die im Dachsportal stehen wiederholen. Wichtig: Werte die aus Berechnungen auf dem Portal sind können nicht abgefragt werden, da diese intern berechnet werden und kein richtiger Wert der Heizung sind wie z.B. der Wert "Produzierter Strom heute".

Die Daten kannst du dann in die productGroups.json eintragen so wie die bereits vorhandenen beiden Produkttypen dachsII und dachs08.

PS: Falls du dich mit den Entwicklertools nicht so gut auskennst, ich bin auch gerade dabei eine Funktion im py-senertec Packet zu implementieren, was das hinzufügen bzw. das einmalige auslesen der Werte bei neuen Heizungstypen etwas erleichtert. Ich denke ein neues Release dazu kommt in den nächsten 3-5 Tagen.

emse1981 commented 1 year ago

Vielen Dank für die Hilfe, soweit klar, kann den Dachs Inngogen auch unter productGroup: "innogen" finden. Kann die label auch finden die aber nahezu identisch zum "dachs 0.8" sind. Somit habe ich in meiner productGroup.json nur den Namen von "dachs 0.8" auf "innogen" geändert. Bekomme aber trotzdem folgenden Fehler und keine Werte: IMG_0474

Kleinrotti commented 1 year ago

Sieht so aus als wenn deiner callback function output() ein übergabe Parameter fehlt.

Hier mal ein komplettes Beispiel Script, vielleicht hilft das:

from senertec.lang import lang
from senertec.client import senertec
from senertec.canipValue import canipValue
import json
from time import sleep
import os

def start():
    #make sure the file is in the current directory!
    file = open(os.getcwd() + "\\productGroups.json")
    supportedItems = json.load(file)
    file.close()
    global senertec
    # replace your username and password here
    senertec = senertec(supportedItems,
                        os.environ['SENERTECUSER'], os.environ['SENERTECPW'], lang.German)
    senertec.messagecallback = output
    if senertec.login() is False:
        return
    if senertec.init() is False:
        return
    serial = senertec.getUnits()
    #connect to first unit
    if senertec.connectUnit(serial[0].serial) is False:
        return
    errors = senertec.getErrors()
    for points in senertec.boards:
        ids = points.getFullDataPointIds()
        senertec.request(ids)
    sleep(3)
    senertec.logout()
    print("\n-----Device errors-----")
    for e in errors:
        if(e.code != ""):
            print(
                f"\nError: {e.code} in Board: {e.boardName} \nCategorie: {e.errorCategory} \nMessage: {e.errorTranslation}")

def output(value: canipValue):
    print("Source: " + value.sourceDatapoint + "\nName: " + value.friendlyDataName + "\nValue: " +
              value.dataValue.__str__() + value.dataUnit + "\n")

start()
emse1981 commented 1 year ago

Bekomm einfach immer einen Error:

root@debian:~# python3 Innogen.py Traceback (most recent call last): File "/root/Innogen.py", line 89, in <module> start() File "/root/Innogen.py", line 33, in start os.environ['xxxxxxx'], os.environ['xxxxxxx'], lang.German) File "/usr/lib/python3.9/os.py", line 679, in __getitem__ raise KeyError(key) from None KeyError: 'xxxxxxx' root@debian:~#

Kleinrotti commented 1 year ago

Der Error kommt durch eine nicht vorhandene Umgebungsvariable. Du kannst auch direkt Username und Passwort nutzen, statt diese in eine Umgebungsvariable zu speichern und dann im Script auszulesen.

Alt:

senertec = senertec(supportedItems,
                        os.environ['SENERTECUSER'], os.environ['SENERTECPW'], lang.German)

Neu

senertec = senertec(supportedItems,"username", "password", lang.German)
Kleinrotti commented 1 year ago

Ich habe jetzt auch ein neues Release gemacht (Version 0.3.0) wo der json string im Konstruktor optional ist. Gibt man dort "None" an, werden alle Datenpunkte einbezogen. Aber sei gewarnt, das können über 400 sein.

senertec = senertec(None,"username", "password", lang.German)
emse1981 commented 1 year ago

Werte kommen jetzt an. Dankeschön Wo genau muss das "None" eingetragen werden?

Kleinrotti commented 1 year ago

Wenn du alle Werte ohne Filter haben willst, kannst du None als ersten Parameter im Konstruktor setzen, vor dem Username und Passwort wie oben bereits geschrieben.

Als Folge muss dann auch die sleep() Dauer ggf. erhöht werden, da die Rückgabe von so vielen Werten deutlich länger dauert und länger gewartet werden muss bis alle Daten zurückgekommen sind.

emse1981 commented 1 year ago

Alle Werte kommen jetzt sauber an. Ein großes Dankeschön für alles. Eine Frage hab ich noch: Ist es möglich auf bestimmte Werte auch Schreibzugriff zu haben? Möchte den Pufferspeicher manuell schalten können (smart-Home) Momentan ja nur über App oder Internet möglich. Das wär Spitze?

Kleinrotti commented 1 year ago

Freut mich, das ich helfen konnte :) Werte zu schreiben wird wahrscheinlich auch möglich sein. Damit habe ich mich bis jetzt aber noch nicht beschäftigt. Ich schaue mir das mal an und eventuell wird in Zukunft auch Schreibzugriff möglich sein.