reserve85 / HoymilesZeroExport

Zero Export Script for Hoymiles Inverters using AhoyDTU / OpenDTU and Tasmota Smart Meter inferface / Shelly 3EM / SHRDZM / Emlog / ioBroker
GNU General Public License v3.0
135 stars 31 forks source link

Hichi IR Lesekopf über USB an Raspberry Pi #42

Closed raffy1234 closed 1 year ago

raffy1234 commented 1 year ago

Ich habe den Lesekopf über USB direkt am Raspberry Pi stecken und über ioBroker sehe ich auch die Werte des Zählers. Wie muss ich denn die Config.ini anpassen, um die Nulleinspeisung zu realisieren?

reserve85 commented 1 year ago

Hi, ist so out of the Box nicht vorgesehen direkt auf USB zuzugreifen. Kommst du über eine REST-API an die aktuellen Zählerwerte von ioBroker? Sollte laut kurzer Recherche irgendwie funktionieren, schau dir mal https://github.com/ioBroker/ioBroker.simple-api an.

Wenn das funktioniert dann kann ich die Abfrage-URL in den Code übernehmen. Du müsstest mich da allerdings unterstützen und mir den JSON-String geben sowie die URL die aufgerufen werden muss. Ich würde das dann irgendwie variabel einbinden falls möglich.

raffy1234 commented 1 year ago

Hi, habe es grad probiert. Auf diesem Weg komme ich leider nicht an die aktuellen Werte. Scheint also nicht zu funktionieren, schade.

reserve85 commented 1 year ago

Doch, das muss mit dem Plugin funktionieren. Wahrscheinlich musst du das erst installieren. Dann kommst du an alle Werte.

Gibt das hier eine Rückgabe im Browser?: http://ipaddress:8087/help

raffy1234 commented 1 year ago

Gibt leider keine Rückgabe.

D3R-ST3FAN commented 1 year ago

Danke für den Hinweis mit dem Adapter. Nach Hinzufügen des SimpleAPI Adapters (auf Deutsch: Einfache RESTful API) läuft es mit den Standardeinstellungen.

simple-api-Screenshot 2023-04-13 095738

Ein CURL gibt auch direkt den Wert aus.

z.B.

curl http://10.xxx.xxx.71:8087/getPlainValue/alias.0.Zaehler.Zaehler_Netzbezug 435

Kannst Du das nicht für alle Zähler einbauen? Also Quasi eine URL die den jeweiligen Wert zurückgibt. Das sollte doch ziemlich flexibel sein.

reserve85 commented 1 year ago

Ja geht halt nicht immer, aber das würde ich dann als Lösung für ioBroker einbauen. Bei TASMOTA funktioniert das z.B. nicht, der gibt nur JSON zurück welches is dann auflösen muss.

Hast du es schon laufen?

D3R-ST3FAN commented 1 year ago

Ich wollte mir das am WE mal genauer ansehen.

Script läuft im Moment nicht so gut, da ich zu Testzwecken mehrere WR habe, die aber nicht komplett mit Modulen bestückt sind (1x1500er mit 2x Modul, 1x1500er mit 1x Modul, 1x400er). Außerdem ist die Sonne nicht sehr beständig im Moment.

Mein Setup: Ich einen IR Leser am Zähler des VNB via Tasmota und mehrere Zwischenzähler, die ich per RS485/Modbus anbinden möchte. (Ich hab im Moment aus historischen Gründen einen ziemlichen Zoo, Volkszähler, FHEM, Cerbo....)

Da der Tasmota ja schon direkt bei Werteänderung per MQTT an den IoBRoker Daten schiebt, wollte ich das arme Kerlchen nicht unnötig abfragen. Der Modbus Zähler vor den WR wird auch an IoBroker liefern. (Tut er aber im Moment noch nicht.) Den "Energiebedarf" Rechne ich trotzdem im IoBroker aus (Netzbezug + Summe PV Erzeugung aus OpenDTU).

Übrigens gibt es "getPlainValue" - ohne parsen- scheinbar nur für Einzelwerte.

Man kann auch via "getBulk" mehrere Werte in einer Abfrage auslesen. Dann muss man wieder parsen.

curl http://10.xxx.xxx.71:8087/getBulk/alias.0.Zaehler.Zaehler_Netzbezug,alias.0.Zaehler.Zaehler_Energiebedarf

[{"id":"alias.0.Zaehler.Zaehler_Netzbezug","val":340,"ts":1681379835195,"ack":true},{"id":"alias.0.Zaehler.Zaehler_Energiebedarf","val":1258,"ts":1681379835195,"ack":true}]

Macht ja vielleicht auch Sinn, um die Anzahl der Abfragen zu reduzieren.

D3R-ST3FAN commented 1 year ago

Da hab ich wohl quatsch geschrieben.

"getPlainValue" kann sehr wohl mehrere Werte

curl http://10.xxx.xxx.71:8087/getPlainValue/alias.0.Zaehler.Zaehler_Netzbezug,alias.0.Zaehler.Zaehler_Energiebedarf

ergibt 450 729

Es würde also eine Basis URL reichen und dann die jeweiligen Objektkbezeichner.

D3R-ST3FAN commented 1 year ago

Gibt leider keine Rückgabe.

Wie hast Du den den simple API Adapter installiert und konfiguriert?

reserve85 commented 1 year ago

Moin, ich brauche ja nur einen Wert und das ist die aktuelle Leistung vom Hauptzähler und optional noch die aktuelle Gesamtleistung der Inverter (intermediate meter).

Bei dem Zwischenzähler wird vom Script aktuell nur ein Zähler unterstützt (das könnte ich in Zukunft noch ausbauen, aber da wirds für ein Script ganz schnell kompliziert), von daher ist das ja ganz gut wenn du alles über den Broker zusammenführst.

Am Ende müsste ich also jeweils einen Wert abfragen für GridUsage(W) und optional SolarPower(W). Ich mache das in Python ohne CURL Aufruf, sondern über Requests. Daher würde ich dann über den GetBulk Aufruf gehen.

reserve85 commented 1 year ago

Habe es mal in den Code übernommen, kannst du das testen? https://github.com/reserve85/HoymilesZeroExport/tree/dev_iobroker

D3R-ST3FAN commented 1 year ago

Hey. danke,

scheint aber nicht 100Pro zu klappen.

"intermediate meter" wird erkannt, mit dem "Haupzähler" schein was krumm zu sein.

zeroexport.log

reserve85 commented 1 year ago

ok, kannst du mal noch die sektion [IOBROKER] aus der Ini posten? Wie ich das sehe hast du IOBROKER_POWER_CALCULATE auf true stehen? Wahrscheinlich findet der Parser im Result das IOBROKER_POWER_INPUT_ALIAS nicht.

D3R-ST3FAN commented 1 year ago

` [IOBROKER]

--- defines for IOBROKER (needs installed https://github.com/ioBroker/ioBroker.simple-api) ---

IOBROKER_IP = 10.xxx.xxx.71 IOBROKER_PORT = 8087 IOBROKER_CURRENT_POWER_ALIAS = alias.0.Zaehler.Zaehler_Netzbezug

if your powermeter does NOT output the current power: you need to calculate it -> Power(W) = OBIS(1.7.0) - OBIS(2.7.0)

IOBROKER_POWER_CALCULATE = FALSE

Power-MQTT Input label (positive active instantaneous power, e.g. OBIS Code 1.7.0)

IOBROKER_POWER_INPUT_ALIAS = alias.0.Zaehler.Zaehler_CurrentInputWatt

Power-MQTT output label (negative active instantaneous power, e.g. OBIS Code 2.7.0)

IOBROKER_POWER_OUTPUT_ALIAS = alias.0.Zaehler.Zaehler_CurrentOutputWatt

`

D3R-ST3FAN commented 1 year ago

irgendwie komme ich mit dem github markup nicht klar

Alias, Port und IP stimmen aber.

mit curl bekomme ich auch den Wert.

curl http://10.1.120.71:8087/getPlainValue/alias.0.Zaehler.Zaehler_Netzbezug

602

reserve85 commented 1 year ago

in [SELECT_POWERMETER] steht USE_IOBROKER auf true und alle anderen auf false?

D3R-ST3FAN commented 1 year ago

in [SELECT_POWERMETER] steht USE_IOBROKER auf true und alle anderen auf false?

ja

reserve85 commented 1 year ago

ah ja, fehler gefunden kannst du diese zeile ändern:

IOBROKER_POWER_CALCULATE = config.get('IOBROKER', 'IOBROKER_POWER_CALCULATE') in IOBROKER_POWER_CALCULATE = config.getboolean('IOBROKER', 'IOBROKER_POWER_CALCULATE')

D3R-ST3FAN commented 1 year ago

ja, das hat es gebracht!

Der PowerMeter Wert wird jetzt ausgelesen.

powermeter IOBROKER: 526 Watt

Die eigentliche Regelung kann ich Wetterbedingt leider nicht testen.

Zwischenzähler und Hauptzähler können also aus IoBroker gelesen werden TOP!

Apropos Zwischenzähler, da bei mir nicht alle WR an einer "Leitung" hängen gibt es mehrere. Nur falls du dich fragst warum macht man sowas. Die müssten man dann im Zweifel addieren oder als virtuellen Zähler im IoBroker anlegen und dort addieren.

reserve85 commented 1 year ago

ja genau, die musst du dann im ioBroker addieren und als einen Gesamtwert bereitstellen.

Dann nehm ich das so nachher mit in die MAIN.

edit: erledigt

raffy1234 commented 1 year ago

Gibt leider keine Rückgabe.

Wie hast Du den den simple API Adapter installiert und konfiguriert?

Gibt leider keine Rückgabe.

Wie hast Du den den simple API Adapter installiert und konfiguriert?

Das wird bei mir angezeigt, leider kann ich damit überhaupt nichts anfangen.

{ "getPlainValue": "http://192.168.178.45:8087/getPlainValue/stateID", "get": "http://192.168.178.45:8087/get/stateID/?prettyPrint", "getBulk": "http://192.168.178.45:8087/getBulk/stateID1,stateID2/?prettyPrint", "set": "http://192.168.178.45:8087/set/stateID?value=1&prettyPrint", "toggle": "http://192.168.178.45:8087/toggle/stateID&prettyPrint", "setBulk": "http://192.168.178.45:8087/setBulk?stateID1=0.7&stateID2=0&prettyPrint", "setValueFromBody": "http://192.168.178.45:8087/setValueFromBody?stateID1", "objects": "http://192.168.178.45:8087/objects?pattern=system.adapter.admin.0*&prettyPrint", "states": "http://192.168.178.45:8087/states?pattern=system.adapter.admin.0*&prettyPrint", "search": "http://192.168.178.45:8087/search?pattern=system.adapter.admin.0*&prettyPrint", "query": "http://192.168.178.45:8087/query/stateID1,stateID2/?dateFrom=2019-06-06T12:00:00.000Z&dateTo=2019-06-06T12:00:00.000Z&noHistory=false&aggregate=minmax&count=3000&prettyPrint" }

D3R-ST3FAN commented 1 year ago

Na dann läuft es doch offenbar schon.

Du musst dir aus der Objektliste die stateid der Leistung in W raussuchen.

Bei mir wäre das z.B.

sonoff.0.tasmopwr.PWR_power-live

wird bei Dir anders sein, vielleicht ja ein Alias.

In die URL

http://192.168.178.45:8087/getPlainValue/stateID

Setzt Du zum testen mal dein StateID ein.

Sieht dann so aus:

http://192.168.178.45:8087/getPlainValue/hier.deine.stateid.power

hier.deine.stateid.power musst du natürlich anpassen.

Die URL testest Du (rufst sie einfach im Browser auf). Wenn der Wert Leistungswert kommt hast Du alle Infos für die Konfigurationsdatei.

HoymilesZeroExport_Config.ini

in der [IOBROKER] Sektion

IOBROKER_IP = 192.168.178.45 IOBROKER_PORT = 8087 IOBROKER_CURRENT_POWER_ALIAS = hier.deine.stateid.power

raffy1234 commented 1 year ago

Super, es läuft. Jetzt muss nur noch besseres Wetter werden ;-) Vielen Dank für Eure Hilfe und diese tolle Lösung.