BenediktSeidl / prpd_usb

Read data from NEDAP PowerRouter via USB
GNU General Public License v3.0
2 stars 3 forks source link

mqtt_openwb Probleme. #1

Closed thomasleitner closed 8 months ago

thomasleitner commented 3 years ago

Servus Benedikt, Ich wollte per prpd_usb die Daten per MQTT an OpenWB schicken. Leider gibts mit den Mappings einige Probleme. Hier ist was mein Powerrouter (PR35SB, sollte identisch mit PR50SB sein) ausgibt:

root@openwb:~#` /root/prpd_usb/v/bin/prpd_usb --model PR50SB stdout
2021-09-14 11:15:51,443 WARNING :: root :: starting prpd_usb version 0.1.dev13+gbad942e
{
    "grid": {
        "total_phase_1": 26526600,
        "total_phase_2": 29950500,
        "total_phase_3": 40211300,
        "current_phase_1": 11.700000000000001,
        "current_phase_2": 11.8,
        "current_phase_3": 48.7,
        "voltage_phase_1": 227.20000000000002,
        "voltage_phase_2": 227.5,
        "voltage_phase_3": 225.9,
        "power_w_phase_1": 236,
        "power_w_phase_2": 179,
        "power_w_phase_3": 1061,
        "power_va_phase_1": 267,
        "power_va_phase_2": 269,
        "power_va_phase_3": 1101
    },
    "platform": {
        "consumed": 57465942,
        "produced": 1651189,
        "frequency": 49.99,
        "voltage": 228.20000000000002,
        "temp": 31.0,
        "status": 18707,
        "power": 1476
    },
    "battery": {
        "voltage": 23.82,
        "current": 0.07,
        "power": 0,
        "soc": 59,
        "temp1": 23.5,
        "temp2": 46.7,
        "consumed": 5742284,
        "produced": 4453760
    },
    "solar": {
        "voltage_string_1": 192.19,
        "current_string_1": 4.6000000000000005,
        "voltage_string_2": 190.88,
        "current_string_2": 4.58,
        "status": 61507,
        "total_string_1": 10087730,
        "total_string_2": 10471577,
        "total": 20559307
    }
}

Damit folgende Probleme: grid: current_phase1,2,3 = sind offenbar mit 10 Multipliziert und müssten vor der Übergabe an OpenWB wieder dividiert werden. solar: Hier klappt das Mapping überhaupt nicht. Im Prinzip will ich bei Solar nur zwei Werte: Die Leistung (W) und die Energie (WhProduced) ... für ersteres ist kein direkter Meßwert da und man müsste voltage_string_1current_string_1 + voltage_string_2 current_string_2 rechnen und das dann übergeben per MQTT. Die Energie wäre einfach solar->total.

Ich habe mir deinen Code anschaut und bin leider nicht Python fähig. Einzelne Mappings kann ich zwar ändern basierend auf Deinem Code, aber die einfache Berechnung der PV Leistung bring ich nicht so leicht hin.

Kannst Du eventuell die notwendigen Änderungen vorschlagen? Ich frage mich ob der Code überhaupt jemals funktioniert hat, weil die aktuellen Mappings nehmen sowas wie solar->total_phase_3 für die Solarleistung ... was nicht ganz einleuchtend ist ...

Danke und schöne Grüße // Tom

BenediktSeidl commented 3 years ago

Ich frage mich ob der Code überhaupt jemals funktioniert hat, weil die aktuellen Mappings nehmen sowas wie solar->total_phase_3 für die Solarleistung ... was nicht ganz einleuchtend ist ...

ja, das ist derzeit etwas unflexibel und passt nur auf das setup das ich betrieben habe.

grid: current_phase1,2,3 = sind offenbar mit 10 Multipliziert und müssten vor der Übergabe an OpenWB wieder dividiert werden.

das lässt sich relativ leicht lösen, allerdings brauch ich dafür die modellnummer, damit ich das mapping hier updaten kann: https://github.com/BenediktSeidl/prpd_usb/blob/bad942e534d3c5c1f6648c6924f2d926c7ef4cd6/prpd_usb/schema.py#L95-L98

solar: Hier klappt das Mapping überhaupt nicht. Im Prinzip will ich bei Solar nur zwei Werte: Die Leistung (W) und die Energie (WhProduced) ...

hier wird es ein bisschen komplizierter, aber nicht unmöglich:

  1. install the official powerrouter software from https://powerrouter.zendesk.com/hc/en-us/articles/212029037-Direct-download-link-to-the-latest-installtool
  2. install usb sniffer from https://desowin.org/usbpcap/
  3. make sure you can read the values from your powerrouter with the official software, then close the software
  4. start the usb sniffer, choose the correct usb device
  5. start the powerrouter software (best during the day, so some useful values can be read) write down the values and names of the values you want to see (or make a screenshot). you don't have to wait long.
  6. close the software
  7. send me the captured data and the values

dann kann ich überprüfen ob bzw. wie die daten ausgelesen werden und es entsprechend anpassen.

thomasleitner commented 3 years ago

Danke für Deine Antwort. Mein Powerrouter ist ein PR37SB-BS/S240, Seriennummer 9561773H426B8716

Frage: Warum willst Du da extra die USB Daten sniffen für die PV Leistung? Es sollte ja reichen Spannung1Strom1 + Spannung2Strom2 zu rechnen für die Leistung?

Oder meinst Du das die Leistung schon übertragen wird, aber nur nicht korrekt decodiert?

Danke Dir!

BenediktSeidl commented 3 years ago

ich könnte mir vorstellen, dass der powerrouter bereits die passenden daten vorhält, und man nur die richtigen befehle absenden muss um die daten zu erhalten. wenn du die benötigten daten in der offiziellen software sehen kannst, ist die wahrscheinlichkeit sehr hoch, dass man diese (ohne weitere berechnungen) direkt auslesen kann. ich denke das wäre dann der beste weg das problem zu lösen. bei wechselstrom muss man afaik noch nach wirk- schein- und blind-leistung unterscheiden, ich denke da wäre es das beste auf die "offiziellen" werte zu vertrauen.

wenn du direkt ./prpd_usb -vvvv (evtl. mit dem korrekten seriellen port) ausführst, solltest du eine fehlermeldung sehen in der form: Exception: Model 'XXXXX' is not know yet. You can try to specify another model via --model, or open an issue was steht da an der stelle von 'XXXXX'?

thomasleitner commented 3 years ago

Der Output ergibt:

2021-09-16 10:08:54,503 INFO :: prpd_usb.prpd :: Found model 9561773 with serialnumber b'H426B8716' ..... Exception: Model '9561773' is not know yet. You can try to specify another model via --model, or open an issue

Hilft das was?

BenediktSeidl commented 2 years ago

ja, allerdings nur in kombination mit den mitgelesenen usb daten der offiziellen software. wenn du diese zur verfügung stellst, könnte ich das programm entsprechend erweitern, dass auch dein modell unterstützt wird.

thomasleitner commented 2 years ago

Super ... danke .... ich schau das ich die USB Daten bald mitlesen kann und Dir schicken kann ...

thomasleitner commented 2 years ago

Habe nun einen Datenmitschnitt mit USBPCAP gemacht und ein Wireshark kompatibles Recording File erzeugt. Es läßt sich mit Wireshark ansehen. Leider sind auch Mausbewegungen aufgezeichnet ... Mit USBPCAP war es nicht möglich nur ein USB Interface aufzuzeichnen ... aber im Wireshark kann man das filtern. Ich hoffe das hilft Dir das Protokoll und die notwendigen Daten zu entschlüsseln. Das File ist unter diesem Link verfügbar: https://www.dropbox.com/s/hw3ex5dqryg2wyf/pr?dl=0

BenediktSeidl commented 2 years ago

schaut soweit ganz gut aus, allerdings werde ich ein ein paar tage brauchen bis ich zeit finde mich darum zu kümmern.

thomasleitner commented 2 years ago

Ok Danke!

BenediktSeidl commented 2 years ago

jetzt ging es doch schneller als gedacht. ich habe jetzt PR37SB als neues modell hinzugefügt. nachdem ich keinen funktionierenden powerrouter mehr habe bin ich auf deine tests angewiesen. neue befehle musste ich keine implementieren, ich habe nur die bereits vorhandenen neu kombiniert.

thomasleitner commented 2 years ago

Wow … super. Ich probier es und melde mich … danke.

thomasleitner commented 2 years ago

Schaut schon mal sehr gut aus ... mein Powerrouter Model wird ohne Änderung erkannt:

(v) root@openwb:~/prpd_usb# prpd_usb -vv stdout 2021-10-04 11:24:23,637 WARNING :: root :: starting prpd_usb version 0.1.dev19+gd5fcb1a 2021-10-04 11:24:23,637 INFO :: prpd_usb.prpd :: opening serial port '/dev/ttyUSB0' 2021-10-04 11:24:23,643 DEBUG :: prpd_usb.prpd :: successfully opened serial port '/dev/ttyUSB0' 2021-10-04 11:24:23,644 DEBUG :: prpd_usb.prpd :: sent request 5a0052500000481ca5, waiting for 25 bytes response 2021-10-04 11:24:23,653 DEBUG :: prpd_usb.prpd :: got response with 25 bytes 2021-10-04 11:24:23,654 INFO :: prpd_usb.prpd :: Found model 9561773 with serialnumber b'H426B8716' 2021-10-04 11:24:23,654 INFO :: prpd_usb.prpd :: Identified model PR37SB 2021-10-04 11:24:23,655 DEBUG :: prpd_usb.prpd :: sent request 5a0070010000e147a5, waiting for 30 bytes response 2021-10-04 11:24:23,669 DEBUG :: prpd_usb.prpd :: got response with 30 bytes 2021-10-04 11:24:23,670 DEBUG :: prpd_usb.prpd :: sent request 5a0070020000e1b7a5, waiting for 31 bytes response 2021-10-04 11:24:23,685 DEBUG :: prpd_usb.prpd :: got response with 31 bytes 2021-10-04 11:24:23,686 DEBUG :: prpd_usb.prpd :: sent request 5a007003000021e6a5, waiting for 19 bytes response 2021-10-04 11:24:23,701 DEBUG :: prpd_usb.prpd :: got response with 19 bytes 2021-10-04 11:24:23,702 DEBUG :: prpd_usb.prpd :: sent request 5a0070040000e057a5, waiting for 35 bytes response 2021-10-04 11:24:23,717 DEBUG :: prpd_usb.prpd :: got response with 35 bytes 2021-10-04 11:24:23,717 DEBUG :: prpd_usb.prpd :: sent request 5a00700500002006a5, waiting for 23 bytes response 2021-10-04 11:24:23,733 DEBUG :: prpd_usb.prpd :: got response with 23 bytes 2021-10-04 11:24:23,733 DEBUG :: prpd_usb.prpd :: sent request 5a00710100001d46a5, waiting for 17 bytes response 2021-10-04 11:24:23,749 DEBUG :: prpd_usb.prpd :: got response with 17 bytes 2021-10-04 11:24:23,749 DEBUG :: prpd_usb.prpd :: sent request 5a00710200001db6a5, waiting for 21 bytes response 2021-10-04 11:24:23,765 DEBUG :: prpd_usb.prpd :: got response with 21 bytes 2021-10-04 11:24:23,765 DEBUG :: prpd_usb.prpd :: sent request 5a0071030000dde7a5, waiting for 17 bytes response 2021-10-04 11:24:23,781 DEBUG :: prpd_usb.prpd :: got response with 17 bytes 2021-10-04 11:24:23,781 DEBUG :: prpd_usb.prpd :: sent request 5a00710400001c56a5, waiting for 21 bytes response 2021-10-04 11:24:23,797 DEBUG :: prpd_usb.prpd :: got response with 21 bytes 2021-10-04 11:24:23,797 DEBUG :: prpd_usb.prpd :: sent request 5a0071050000dc07a5, waiting for 21 bytes response 2021-10-04 11:24:23,813 DEBUG :: prpd_usb.prpd :: got response with 21 bytes { "battery": { "voltage": 24.240000000000002, "current": -2.88, "power": -59, "soc": 61, "temp1": 24.0, "temp2": 47.7, "consumed": 5833463, "produced": 4517226 }, "solar": { "voltage_string_1": 187.92000000000002, "current_string_1": 5.64, "voltage_string_2": 186.58, "current_string_2": 5.6000000000000005, "status": 16, "w_phase_1": 0, "w_phase_2": 0, "w_phase_3": 0, "va_phase_1": 0, "va_phase_2": 0, "va_phase_3": 0, "total_string_1": 10201492, "total_string_2": 10589212, "total": 20790703, "total_phase_1": 0, "total_phase_2": 0, "total_phase_3": 0 }, "platform": { "frequency": 49.99, "voltage": 227.70000000000002, "temp": 31.0, "status": 18707, "power": -246, "consumed": 58061899, "produced": 1659361 }, "grid": { "current_phase_1": 1.03, "current_phase_2": 1.17, "current_phase_3": 2.7800000000000002, "voltage_phase_1": 226.60000000000002, "voltage_phase_2": 226.10000000000002, "voltage_phase_3": 226.10000000000002, "power_w_phase_1": 203, "power_w_phase_2": 176, "power_w_phase_3": -625, "power_va_phase_1": 233, "power_va_phase_2": 280, "power_va_phase_3": 688, "total_phase_1": 26699300, "total_phase_2": 30154300, "total_phase_3": 40487400 } }

Als nächstes teste ich das MQTT auf OpenWB ...

thomasleitner commented 2 years ago

Hier passt was nicht ganz:

"solar": {
    "voltage_string_1": 188.70000000000002,
    "current_string_1": 5.8,
    "voltage_string_2": 183.65,
    "current_string_2": 5.89,
    "status": 16,
    "w_phase_1": 0,
    "w_phase_2": 0,
    "w_phase_3": 0,
    "va_phase_1": 0,
    "va_phase_2": 0,
    "va_phase_3": 0,
    "total_string_1": 10202015,
    "total_string_2": 10589728,
    "total": 20791743,
    "total_phase_1": 0,
    "total_phase_2": 0,
    "total_phase_3": 0
},

Bei Solar sollte die Leistung wohl w_string_1 und w_string_2 heißen. w_phase_1,2,3 sowie va_phase_1,2,3 sind dort überflüssig. Ebenso wie total_phase_1,2,3 ....

thomasleitner commented 2 years ago

Die EVU Leistungen werden nun per MQTT richtig an OpenWB übergeben ... nur die PV/Solar Daten nicht. Hier kommt immer 0...

BenediktSeidl commented 2 years ago

hast du die noch fehlenden werte in der offiziellen software gesehen? falls ja wäre evtl. noch mal ein mitschnitt mit einem screenshot hilfreich, der die werte in der offiziellen gui zeigen. dann kann ich nach genau den zahlen suchen. ich habe gerade noch mal geschaut: es gibt zwei befehle in deinem mitschnitt die ich bisher nicht verwende, aber die daten schauen nicht besonders hilfreich aus. von der offiziellen software wurden auf jeden fall die solar werte die alle 0 ausgeben genauso oft wie die anderen werte abgefragt...

thomasleitner commented 2 years ago

Hier noch ein Recording mit Screenshots der einzelnen Daten ... https://www.dropbox.com/sh/rf2otmnkfdbxn2e/AACYOeTydg_ImM_8_p6B489oa?dl=0

BenediktSeidl commented 2 years ago

hab es mir heute noch mal genauer angeschaut: mir scheint wirklich als ob auch die offizielle gui hier die watt-anzeige aus dem strom und der spannung berechnet. bei gleichstrom (was es da ja scheinbar noch ist?!) sollte das ja auch wirklich so einfach funktionieren. ich habe es entsprechend eingebaut. ich denke mit dem aktuellen stand könnte das jetzt bei dir funktionieren.

allerdings ist mir noch etwas andere aufgefallen: für openWB/set/evu/WhExported wird einfach der Wh-zähler des produzierten solar stroms verwendet. hier sollte ja eigentlich noch die energie abgezogen werden die von der batterie aufgenommen wurde? allerdings kommt mir das auch nicht ganz richtig vor: wenn wir annehmen es kommt ein starker winter, und wie bekommen über längere zeit gar keinen solarstrom, verbraucht ja trotzdem die batterie etwas energie für den standby modus. d.h. der zähler für openWB/set/evu/WhExported würde sich dann rückwärts drehen. das kann ja auch nicht stimmen...

sollte es jetzt funktionieren beobachte bitte dein system ob alles wie gewünscht funktioniert, ansonsten können wir noch weitere änderungen vornehmen.

thomasleitner commented 2 years ago

Hallo, Danke Dir ... schaut schon gut aus ... ein Problem noch:

    "grid": {
        "current_phase_1": 1.21,
        "current_phase_2": 1.17,
        "current_phase_3": 2.11,
        "voltage_phase_1": 228.8,
        "voltage_phase_2": 229.10000000000002,
        "voltage_phase_3": 227.4,
        "power_w_phase_1": 247,
        "power_w_phase_2": 175,
        "power_w_phase_3": -437,
        "power_va_phase_1": 278,
        "power_va_phase_2": 268,
        "power_va_phase_3": 480,
        "total_phase_1": 26833800,
        "total_phase_2": 30296000,
        "total_phase_3": 40704600
    }

Auf Phase 3 wird bei mir eingespeist. Die Leistung ist negativ ... daher sollte der Strom auch negativ sein. Also current_phase_3 sollte -2.11 sein in diesem Beispiel.

BenediktSeidl commented 2 years ago

ich kann nachvollziehen warum dich das wurmt, allerdings würde ich da nur sehr ungern etwas daran ändern, weil ich diese zahlen 1:1 genau so vom gerät bekomme und sie einfach nur so durch reiche. interessant dabei: das datenfeld könnte theoretisch auch negative zahlen darstellen (das geht z.b. bei voltage_phase_X nicht, da sind nur positive zahlen vorgesehen) aber es werden scheinbar nur positive zahlen übertragen. technisch würde sich das schon irgendwie machen lassen, aber das würde dann schon auf wackeligen beinen stehen.

gibt es einen technischen grund, wofür du es brauchst? vielleicht finden wir dafür eine andere lösung?

thomasleitner commented 2 years ago

Hallo, Mittlerweile hab ich das anders gelöst. Ich nehme den Json output, parse die Daten heraus mit jq die ich brauche, stelle noch die Berechnungen an die ich brauche und poste das Ganzen per mosquito_pub selber an die OpenWB …