Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Hey, super, vielen Dank!
Ich habe einfach nur die __init__.py getauscht und es funktioniert mit der Angabe von mehreren Units einwandfrei.
Wo es noch hängt:
beim parsen der Items wird ja quasi der Index der Abfrage anhand der ModBus-Adressen erzeugt.
Da es zwei gleiche (aber mit unterschiedlichen Units) versehene Registernummern gibt, fragt er immer nur eine von beiden (mit der vielleicht höheren BusUnit?) ab.
Oder "gewinnt" das letzte hierarchisch angeordnete Item in der Item-Konfiguration?
Der erste Eintrag unten vom Strom L1 (das ist der Wechselrichter) wird gar nicht abgefragt und auch nicht getriggert. Da steht immer nur
Update durch
Init:Initial_Value
beim Starten von SmarthomeNG.
Versehe ich die Zeilen vom Smartmeter mit der "#" (I_SM_L1), gibt es nur den einen Eintrag mit (I_L1) vom Wechselrichter. Dieser wird dann auch korrekt gelesen.
Nehme ich die "#" wieder weg und werden zwei Einträge generiert, "gewinnt" wieder das Smartmeter und liefert Daten.
Da es zwei gleiche (aber mit unterschiedlichen Units) versehene Registernummern gibt, fragt er immer nur eine von beiden (mit der vielleicht höheren BusUnit?) ab.
Oder "gewinnt" das letzte hierarchisch angeordnete Item in der Item-Konfiguration?
das letzte gewinnt.. zur Problem-Behebung muss ich im plugin die Auflistung anpassen/umgestalten, da die Registeradresse als Dictionary-Key verwendet wird und nur 1x enthalten sein kann.. ich melde mich wenn es wieder ein update zum testen gibt.
das letzte gewinnt.. zur Problem-Behebung muss ich im plugin die Auflistung anpassen/umgestalten, da die Registeradresse als Dictionary-Key verwendet wird und nur 1x enthalten sein kann.. ich melde mich wenn es wieder ein update zum testen gibt.
Danke für Deine Rückmeldung
Nee, FALSCH! Vielen Dank für diese gute Arbeit und deine Mühen!
Aber ich ich mir schon gedacht. Ich versuche grade, den Code zu verstehen. Leider sind meine Python-Kenntnisse sehr rudimentär, sonst würde ich gerne mehr helfen.
Ich habe die Unit mal mit ins Webinterface gebracht und da sieht man das Ergebnis ganz gut: Unbenannt.png
Einfach mal eine Idee: Was ist denn, wenn du im Dictionary die Unit dem Register vorne anstellst, sodass sich eine beispielsweise Zahl mit 8 Stellen ergibt
Aus dem Register des Wechselrichters mit der Unit "1 " und dem Strom L1 der Adresse "40072" würde "00140072"
Aus dem Register des Smartmeters mit der Unit "200" und dem Strom L1 der Adresse "40072" würde "20040072"
Ein weiterer Zähler mit der Unit 201 würde auf die "20140072" den Strom L1 zuordnen.
Der Vorteil wäre; egal wie viele Units vorkommen würden, der Index wäre eindeutig, da die Nummer der Unit nur einmal vorkommt.
Beispiel Fronius: es lassen sich noch mehr Zähler via ModBus RTU anschliessen. Somit könnte auf der Modbus-TCP-Seite auch ein gleicher Zähler mit der Unit 201, 202, usw. entstehen.
Durch das Voranstellen der Unit wäre somit eine eindeutige Indizierung möglich.
hab es inzwischen schon so gelöst, allerdings mit dem unit dahinter,.. muss nur noch ein paar Tests machen, voraussichtlich am abend kann ich es dann ins git pushen
Mal als Info für mich: Mit welchen Methoden entwickelst du das? Hast du irgendwie eine IDE, mit der du online die Daten mitverfolgen kannst?
angefangen habe ich mit eclipse und Remote Debug, damit kann man den python-Code debuggen und die verschiedensten Variablen von SH verfolgen. Da das Händling damit aber recht umständlich ist, benutze ich eigentlich nur mehr einen Editor (notepad++) und sehe mir die Variabel über Log-Ausgaben an
bitte auch die anderen Dateien austauschen, nicht nur die __init__.py
zumindest die plugin.yaml und die Datei webif/templades/index.html
Noch eben schnell ausgetauscht. Funktioniert bis hierhin ohne Probleme!
Alle Register mit gleicher Registernummer vom Smartmeter und Wechselrichter werden mit dem jeweiligen Trennpunkt mit der Unit benannt und kommen jetzt auch richtigerweise doppelt an.
In den Items werden die Werte auch offensichtlich alle gelesen, jedoch sind die Werte des Wechselrichters bei der momentanen Sonneneinstrahlung um 00:49 Uhr leider alle auf "0" 😄
Ich gebe morgen dazu Rückmeldung!
Hi, doch, das war es.
Die Adresse wurde nach folgendem Format ausgegeben: 40072.200
Vor der Änderung: Vorher.png
Irgendwie hat die sich in dem Item versteckt. Ich habe jetzt nicht explizit geguckt, wo die herkommt, habe mich aber an der Zusammensetzung des "regToRead" orientiert und die Zeile im Webinterface:
Code:
<td class="py-1">{{ item }}</td>
umgeändert und die Adresse aus dem regToRead herausgelöst mit:
super dass es soweit läuft, die index.html hat es aus versehen nicht auf git geschaft. Aber dort war nur die Änderung enthalten welche Du selber herausgefunden hast.
So, kurze Statusrückmeldung:
Das Plugin läuft nun seit 4 Tagen ohne jegliche Einschränkung oder Fehler.
Leider ist mir jetzt eines aufgefallen:
Mein Wechselrichter (und nicht nur Fronius, sondern auch SMA, Kostal, Solaregde usw.) tauscht Daten auf dem Modbus nach dem Sunspec-Format aus. Dies ist ein freier Zusammenschluss ganz vieler Hersteller, um einen herstellerübergreifenden Standart zum Datenaustausch über Modbus einzuführen. Hier kann man mal gucken, wer da alles mitmacht: https://sunspec.org/members/
Dummerweise kochen die ihr eigenes Süppchen und übertragen die Daten nach einem interessanten Muster:
in einem Register wird der Wert übertragen, und dann gibt es ein weiteres Register, in dem der ScaleFactor übertragen wird. Es werden folglich nur ganze Zahlen übertragen und die Nachkommastellen werden durch das ausgelesene Register mit dem ScaleFactor in der Stelle „verschoben“.
Ich habe mich gewundert, warum die Strom- und Leistungswerte nur manchmal zueinander passten. Bis ich gemerkt habe, dass die Stromwerte variabel skaliert werden.
Jetzt könnte man einfach das Register des jeweiligen ScaleFactor mit auslesen und mit dem übertragenen Wert multiplizieren.
Leider einfacher als gedacht: Das Datenformat lautet sunssf und besteht aus folgendem Aufbau:
As an alternative to floating point format, values are represented by integer values with a signed scale factor applied. The scale factor explicitly shifts the decimal point to the left (negative value) or the right (positive value). Scale factors may be fixed and specified in the documentation of a value, or may have a variable scale factor associated with it. For example, a value “Value” may have an associated value “Value_SF” of type “sunssf” that is a 16 bit two’s compliment integer.
sunssf signed range: -10 ... 10 Not Implemented: 0x8000
If a value is implemented and has an associated scale factor, the scale factor must also be implemented.
beim solaredge-Wechselrichter welcher auch nach dem sunspec-Format tickt, hab ich ein eigenes Skale-Faktor-Item (AC_Leistung_sf) angelegt und dann mit dem eval im eigentlichen Leistung-Item (AC_Leistung) die Berechnung gemacht:
eval: value*10**sh.Photovoltaik.AC_Leistung_sf()
der Scale-Faktor ändert sich auch laufend, (z.B. 0, -1 -2, -3, -4)
Code:
solaredge_SE6000:
AC_Leistung_sf: # hier landet der Scale-Faktor z.B. -1
type: num
name: I_AC_Power_SF
enforce_updates: True
modBusAddress: 40084
modBusDataType: int16
AC_Leistung: # hier wird die Leistung ausgelesen und mit dem Scale-Faktor-Item verrechnet:
#z.B. 35.362*10**-1 = 3.536,2 W * 0.001(modBusFactor) = 3,5362 kW
type: num
name: I_AC_Power
enforce_updates: True
eval: value*10**sh.Photovoltaik.AC_Leistung_sf()
modBusAddress: 40083
modBusFactor: 0.001
wichtig dabei, dass das Item mit dem Skale-Faktor zuerst angelegt wird, damit auch beim Lesen der Modbus-Register zuerst der Scale-Faktor gelesen wird und dann erst das Item mit dem eigentlichen Wert gelesen wird, welches dann das eval auslöst.
mit modBusFactor: 0.001 skaliere ich das ganze dann noch von Watt auf kW
Ja, das ist mir komplett klar.
Aber das Problem bei Fronius ist halt, dass sie den Wert zur Verschiebung des Dezimalpunktes einen Wert von -10 bis +10 als 16-Bit 2-er-Komplement liefert.
Wenn ich den Inhalt des Registers mit dem Datentypen „int16“ lese, kommen da Zahlen von 6123 oder irgendetwas in dieser Größenordnung raus; aber nichts, was sich zum Skalieren eignet.
Der modBusDataType ist eben beim Fronuis der nicht der „int16“ sondern der spezielle „sunssf“ nach dem in den Sunspec-beschriebenem Format.
Wenn ich es richtig deute, kommen diese Zahlen vor:
Naja, das is ja nur ne darstellungsart, d.h. das is schon soweit richtig...
Bin( Int16) wandelt in ne binärdarstellung, taugt aber auch nicht zum berechnen , höchstens zum anguckn
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar