Growatt <> Openhab

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

ThomyTP
Beiträge: 41
Registriert: 8. Jan 2018 19:13
Answers: 1

Growatt <> Openhab

Beitrag von ThomyTP »

Hallo zusammen,
hat jemand von euch schon mal mit diesem Script gearbeitet?
https://github.com/Sjord/growatt_api_client

Da ich mich mit Python nicht auskenne, ist es überhaupt möglich Rückgabe werte aus dem Script zu openhb zu bekommen? Wir müsste ich dies anstellen?

Das Script gibt folgende Werte aus:
{'data': [{'plantMoneyText': '2.5 (â¬)', 'plantName': 'xxx', 'plantId': '00000', 'isHaveStorage': 'false', 'todayEnergy': '2 kWh', 'totalEnergy': '9 kWh', 'currentPower': '0 W'}], 'totalData': {'currentPowerSum': '0 W', 'CO2Sum': '0 T', 'isHaveStorage': 'false', 'eTotalMoneyText': '2.5 (â¬)', 'todayEnergySum': '2 kWh', 'totalEnergySum': '9 kWh'}, 'success': True}
{'plantData': {'plantMoneyText': '0.5 (â¬)', 'plantName': 'xxxx', 'plantId': '000000000', 'currentEnergy': '2 kWh'}, 'data': {'15:00': '268.68', '05:00': '0', '18:30': '0', '11:30': '330.97', '12:00': '322.7', '20:30': '0', '07:30': '9.46', '08:30': '40.18', '17:30': '18', '10:30': '194.2', '09:00': '81.92', '03:00': '0', '14:00': '349.5', '16:00': '160.62', '13:30': '381.83', '02:00': '0', '01:00': '0', '12:30': '259.98', '19:30': '0', '04:00': '0', '15:30': '206.3', '06:30': '0', '07:00': '0', '19:00': '0', '05:30': '0', '10:00': '199.28', '17:00': '54.52', '09:30': '125.62', '21:00': '0', '08:00': '33.02', '03:30': '0', '11:00': '244.18', '18:00': '0.23', '14:30': '314.65', '20:00': '0', '01:30': '0', '04:30': '0', '06:00': '0', '13:00': '382.27', '00:30': '0', '16:30': '102.9', '02:30': '0'}, 'success': True}

Im Netz habe ich hier nichts direktes gefunden und habe ich unterschiedliche Aussage über Python gefunden..

Ideal wäre ja eigentlich wenn das Script die Werte als MQTT publishen würde....

Dank Euch und Gruß..
Thomas

Benutzeravatar
udo1toni
Beiträge: 15252
Registriert: 11. Apr 2018 18:05
Answers: 244
Wohnort: Darmstadt

Re: Growatt <> Openhab

Beitrag von udo1toni »

Also, wenn man das Ganze durch einen Prettifyer laufen lässt, wird die Struktur etwas klarer. Was dann auch schnell klar wird, ist, dass es sich um zwei(!) JSON Objekte handelt. Das erste Objekt

Code: Alles auswählen

{
	'data': [{
		'plantMoneyText': '2.5(â¬)',
		'plantName': 'xxx',
		'plantId': '00000',
		'isHaveStorage': 'false',
		'todayEnergy': '2kWh',
		'totalEnergy': '9kWh',
		'currentPower': '0W'
	}],
	'totalData': {
		'currentPowerSum': '0W',
		'CO2Sum': '0T',
		'isHaveStorage': 'false',
		'eTotalMoneyText': '2.5(â¬)',
		'todayEnergySum': '2kWh',
		'totalEnergySum': '9kWh'
	},
	'success': True
}
Das zweite Objekt:

Code: Alles auswählen

{
	'plantData': {
		'plantMoneyText': '0.5(â¬)',
		'plantName': 'xxxx',
		'plantId': '000000000',
		'currentEnergy': '2kWh'
	},
	'data': {
		'15: 00': '268.68',
		'05: 00': '0',
		'18: 30': '0',
		'11: 30': '330.97',
		'12: 00': '322.7',
		'20: 30': '0',
		'07: 30': '9.46',
		'08: 30': '40.18',
		'17: 30': '18',
		'10: 30': '194.2',
		'09: 00': '81.92',
		'03: 00': '0',
		'14: 00': '349.5',
		'16: 00': '160.62',
		'13: 30': '381.83',
		'02: 00': '0',
		'01: 00': '0',
		'12: 30': '259.98',
		'19: 30': '0',
		'04: 00': '0',
		'15: 30': '206.3',
		'06: 30': '0',
		'07: 00': '0',
		'19: 00': '0',
		'05: 30': '0',
		'10: 00': '199.28',
		'17: 00': '54.52',
		'09: 30': '125.62',
		'21: 00': '0',
		'08: 00': '33.02',
		'03: 30': '0',
		'11: 00': '244.18',
		'18: 00': '0.23',
		'14: 30': '314.65',
		'20: 00': '0',
		'01: 30': '0',
		'04: 30': '0',
		'06: 00': '0',
		'13: 00': '382.27',
		'00: 30': '0',
		'16: 30': '102.9',
		'02: 30': '0'
	},
	'success': True
}
Jetzt ist halt die Frage, warum da 2 Objekte ausgegeben werden (damit wird das als Ganzes betrachtet ungültig) Auf die einzelnen werte kann man Bequem zugreifen, wenn gültiges JSON geliefert wird. Beispiel für den Zugriff:
JSONPATH:$.data[0].todayEnergy liefert für das erste Objekt "2kWh".

EDIT: Ich hab grade mal einen Blick auf das Script geworfen... das "Problem" mit dem 2. (eigentlich dem 1.) JSON Objekt ist die 1. Print Zeile (print(plant_info)).
Das Script ist vermutlich vor allem als Anregung für Entwickler gedacht. Du kannst das aber einfach so verwenden, Du musst lediglich die Zeile auskommentieren (mit einer vorangestellten Raute #)
Die Ausgabe leitest Du dann an JSONPATH weiter und lässt den entsprechenden Wert ausgeben.

Was den Weg über mqtt betrifft: ja, das wäre sehr geschickt. Das Hauptproblem ist hier, wann sollen die Daten gezogen werden? Es gibt eine Bibliothek (paho) für Python, die musst Du importieren und dann ein paar Zeilen Code hinzufügen, dann kann das Script beide JSON Objekte in zwei Topics publishen. Dann müsste noch eine Schleife mit rein, die die Seite zyklisch abfragt (wie oft darf das passieren? wie oft ist das sinnvoll?)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

baipai
Beiträge: 60
Registriert: 17. Dez 2019 09:03
Answers: 0
Wohnort: Sisaket Thailand

Re: Growatt <> Openhab

Beitrag von baipai »

Hallo, ich sende meine Inverter Daten an den Mqtt Broker, sehr einfach mit Python

hier der Code fuer Python
=======================================
import paho.mqtt.client as mqtt
client = mqtt.Client()
client.connect("xxx.xxx.x.xxx", 1883, 60)
client.publish("inverter/topic1", wert1)
client.publish("inverter/topic2", wert2)
client.publish("inverter/topic3", wert3)
======================================

Dann landen die Daten beim Brooker (z.B. Mosquitto)

ich hatte vergessen
client.loop_start()

ThomyTP
Beiträge: 41
Registriert: 8. Jan 2018 19:13
Answers: 1

Re: Growatt <> Openhab

Beitrag von ThomyTP »

Hallo Udo,
Danke für deine schnell und gute Analyse.
So wie es aussieht kommen 2 antworten vom Script, die erste ist recht allgemein, die 2 wohl der genaue Verlauf.
Ist es möglich direkt aus einer rule über Json direkt auf die letzten Werte zuzugreifen?

Um regelmäßig Daten zu bekommen dachte ich an ein crontab alle paar Minuten, das müsste doch eigentlich gegen.

Gruß

ThomyTP
Beiträge: 41
Registriert: 8. Jan 2018 19:13
Answers: 1

Re: Growatt <> Openhab

Beitrag von ThomyTP »

Hi,
Wo würde ich diese Zeilen einbinden? Wie machst du es?
Direkt im ursprünglichen Script?

Gruß

baipai hat geschrieben: 4. Mär 2021 11:13 Hallo, ich sende meine Inverter Daten an den Mqtt Broker, sehr einfach mit Python

hier der Code fuer Python
=======================================
import paho.mqtt.client as mqtt
client = mqtt.Client()
client.connect("xxx.xxx.x.xxx", 1883, 60)
client.publish("inverter/topic1", wert1)
client.publish("inverter/topic2", wert2)
client.publish("inverter/topic3", wert3)
======================================

Dann landen die Daten beim Brooker (z.B. Mosquitto)

ich hatte vergessen
client.loop_start()

Benutzeravatar
udo1toni
Beiträge: 15252
Registriert: 11. Apr 2018 18:05
Answers: 244
Wohnort: Darmstadt

Re: Growatt <> Openhab

Beitrag von udo1toni »

Wir reden ja von diesem Script:

Code: Alles auswählen

import sys
import datetime
from growatt import hash_password, GrowattApi, Timespan

username = sys.argv[1]
password = sys.argv[2]

with GrowattApi() as api:
    api.login(username, password)
    plant_info = api.plant_list()
# die nächste Zeile liefert das erste JSON Objekt
    print(plant_info)

    plant_id = plant_info["data"][0]["plantId"]
    plant_detail = api.plant_detail(plant_id, Timespan.day, datetime.date.today())
# die nächste Zeile liefert das zweite JSON Objekt
    print(plant_detail)
Ich habe hier mal eingefügt, was da passiert.
Eine ganz einfache Variante wäre diese hier:

Code: Alles auswählen

import datetime
import paho.mqtt.client as mqtt
from growatt import hash_password, GrowattApi, Timespan

client = mqtt.Client()
client.connect("xxx.xxx.x.xxx", 1883, 60)

username = Dein Growatt Username
password = Dein Growatt Passwort

with GrowattApi() as api:
    api.login(username, password)
    plant_info = api.plant_list()
    client.publish("inverter/plant_info", plant_info)

    plant_id = plant_info["data"][0]["plantId"]
    plant_detail = api.plant_detail(plant_id, Timespan.day, datetime.date.today())
    client.publish("inverter/plant_detail", plant_detail)

client.loop_start()
Wobei ich mir nicht sicher bin, ob das so korrekt ist. Python mache ich nur ganz selten, und dann läuft es meist auf copy&paste&trial&error heraus.
Es gäbe anschließend zwei Topics inverter/plant_info und inverter/plant_detail, die jeweils ein JSON Objekt beinhalten, was dann auf openHAB-Seite bequem mit JSONPATH ausgewertet werden kann.

Für das schnelle Ergebnis stehen die Daten wie Username, Passwort und IP des mqtt Brokers direkt im Programmcode, besser wäre es natürlich, diese z.B. in eine Konfigurationsdatei auszulagern. Logging ist auch immer eine gute Idee.

Mutmaßlich wird das Script einmalig abfragen und schreiben, sinnvoll wäre aber, das Script einmalig zu starten und dann zyklisch die Daten abfragen zu lassen. Da Du nachts vermutlich keinen Strom erzeugst (ich gehe von einer PV Anlage aus), wäre es eine nette Variante, über mqtt einen befehl zu senden, um die Abfrage zu starten / zu stoppen. Das hieße, das Programm läuft als Dienst dauerhaft im Hintergrund, holt die Daten aber nur in der Zeit ein, wo dies auch sinnvoll ist.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

baipai
Beiträge: 60
Registriert: 17. Dez 2019 09:03
Answers: 0
Wohnort: Sisaket Thailand

Re: Growatt <> Openhab

Beitrag von baipai »

Genau so,

Du musst natuerlich noch Paho Downloaden und Installieren.
https://pypi.org/project/paho-mqtt/

Die Datenabfrage wuerde ich in eine Schleife packen und alle 10 sec. oder 60 sec. durchlaufen lassen.So wie du die Daten benoetigst.
So ein Python-Script frisst ja wenig Resourcen.

Du kannst auch ein Cron laufen lassen oder das Script von Openhab aus aufrufen.

Bei mir lauft das Script in einer While Schleife (ca. alle 7 sec) bis ich den Prozess Beende. Ich brauche die Daten auch Nachts, da ich die Batteriebank mit Ueberwache.
Ich habe eine OffGrid und OnGrid Anlage.

ThomyTP
Beiträge: 41
Registriert: 8. Jan 2018 19:13
Answers: 1

Re: Growatt <> Openhab

Beitrag von ThomyTP »

Super idee, genau so hatte ich es mir vorgestellt. Ich muss mich echt mehr mit Python beschäftigen...
Aber:
Leider lässt sich ein Json nicht per mqtt über pao versenden. Nun wird es wohl kniffelig..
Wie kann man dies denn nun umwandeln?

Traceback (most recent call last):
File "growatt/mygrowatt.py", line 16, in <module>
client.publish("inverter/plant_info", plant_info)
File "/home/openhabian/growatt_api_client/venv/lib/python3.7/site-packages/paho/mqtt/client.py", line 1264, in publish
'payload must be a string, bytearray, int, float or None.')
TypeError: payload must be a string, bytearray, int, float or None.



quote=udo1toni post_id=31667 time=1614885128 user_id=1014]
Wir reden ja von diesem Script:

Code: Alles auswählen

import sys
import datetime
from growatt import hash_password, GrowattApi, Timespan

username = sys.argv[1]
password = sys.argv[2]

with GrowattApi() as api:
    api.login(username, password)
    plant_info = api.plant_list()
# die nächste Zeile liefert das erste JSON Objekt
    print(plant_info)

    plant_id = plant_info["data"][0]["plantId"]
    plant_detail = api.plant_detail(plant_id, Timespan.day, datetime.date.today())
# die nächste Zeile liefert das zweite JSON Objekt
    print(plant_detail)
Ich habe hier mal eingefügt, was da passiert.
Eine ganz einfache Variante wäre diese hier:

Code: Alles auswählen

import datetime
import paho.mqtt.client as mqtt
from growatt import hash_password, GrowattApi, Timespan

client = mqtt.Client()
client.connect("xxx.xxx.x.xxx", 1883, 60)

username = Dein Growatt Username
password = Dein Growatt Passwort

with GrowattApi() as api:
    api.login(username, password)
    plant_info = api.plant_list()
    client.publish("inverter/plant_info", plant_info)

    plant_id = plant_info["data"][0]["plantId"]
    plant_detail = api.plant_detail(plant_id, Timespan.day, datetime.date.today())
    client.publish("inverter/plant_detail", plant_detail)

client.loop_start()
Wobei ich mir nicht sicher bin, ob das so korrekt ist. Python mache ich nur ganz selten, und dann läuft es meist auf copy&paste&trial&error heraus.
Es gäbe anschließend zwei Topics inverter/plant_info und inverter/plant_detail, die jeweils ein JSON Objekt beinhalten, was dann auf openHAB-Seite bequem mit JSONPATH ausgewertet werden kann.

Für das schnelle Ergebnis stehen die Daten wie Username, Passwort und IP des mqtt Brokers direkt im Programmcode, besser wäre es natürlich, diese z.B. in eine Konfigurationsdatei auszulagern. Logging ist auch immer eine gute Idee.

Mutmaßlich wird das Script einmalig abfragen und schreiben, sinnvoll wäre aber, das Script einmalig zu starten und dann zyklisch die Daten abfragen zu lassen. Da Du nachts vermutlich keinen Strom erzeugst (ich gehe von einer PV Anlage aus), wäre es eine nette Variante, über mqtt einen befehl zu senden, um die Abfrage zu starten / zu stoppen. Das hieße, das Programm läuft als Dienst dauerhaft im Hintergrund, holt die Daten aber nur in der Zeit ein, wo dies auch sinnvoll ist.
[/quote]

Benutzeravatar
udo1toni
Beiträge: 15252
Registriert: 11. Apr 2018 18:05
Answers: 244
Wohnort: Darmstadt

Re: Growatt <> Openhab

Beitrag von udo1toni »

Doch, das sollte schon gehen. Es kann halt sein, dass da Steuerzeichen drin sind, die fälschlich ausgewertet werden (Anführungszeichen...)
erster Versuch: auf die Variable verzichten:

Code: Alles auswählen

client.publish("inverter/plant_info", api.plant_list())
client.publish("inverter/plant_detail", api.plant_detail(plant_id, Timespan.day, datetime.date.today()))
Achtung! Du musst die Indentation bachten!
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

baipai
Beiträge: 60
Registriert: 17. Dez 2019 09:03
Answers: 0
Wohnort: Sisaket Thailand

Re: Growatt <> Openhab

Beitrag von baipai »

Veruche mal die plant_info und plant_detail in einen String zu wandeln

Code: Alles auswählen

var1 = str((plant_info))
var2 = str((plant_detail))

client.publish("inverter/plant_info", plant_info)
client.publish("inverter/plant_detail", plant_detail)
 ##  Kontrolliere immer auf dem Bildschirm was da rauskommt
print(plant_info)
print(plant_detail)

Antworten