borft schreef op maandag 7 juni 2021 @ 22:40:
[...]
nja, met de python lib van mij is het zo simpel als:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
| from goodwe import Goodwe,GoodweStatus
ip = your_ip_here
gw = Goodwe(ip=ip)
try:
data = gw.getData()
except Exception as e:
print(f"failed: {e}")
exit(0)
print(data) |
je moet dan nog wel wat met de data doen natuurlijk, maar mogelijk dat je dat in de bestaande plugin kunt hangen.
nogmaals bedankt voor je script! erg goed begin!
ik heb je scriptje wat aangepast.
Bij status deed je een call naar de functie: class GoodweStatus(Enum):
Dit heb ik aangepast naar een variabele te maken:
code:
1
| status = { -1 : 'Offline', 0 : 'Waiting', 1 : 'Online' , 2:'Error', 3:'Checking'} |
en deze dan zo uit te lezen:
code:
1
| 'status': status.get(int(to_16_bit(data[63:65], 0))), |
rede is dat er anders in de status het volgende kwam en dat zag er raar uit in de logging:
status: GoodweStatus.NORMAL
Nu krijg ik status: Online of status: Normal, wat je dan ook in vult.
Op een paar plekken round toegevoegd: gw[f'power_dc_1'] = round(gw[f'power_dc_1'],2)
Dit omdat er wel eens lange getallen uit kwamen bijvoorbeeld: 20.330000000000002
Heb verder een MQTT publish scriptje gemaakt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| import paho.mqtt.client as mqtt
#### script needs 4 parameters,
#### MQTT server
#### MQTT port
#### Topic to publish
#### Data to pubish
#### example call function:
#### mqttIp = "IPadressServer"
#### mqttPort = 1883
#### topic = "Sensor/Test/"
#### data_send = {"text1":1234, "text2": 5678}
####
#### sendMqttPayload = MQTTSend(mqttIp, mqttPort, topic, data_send)
#### callMqttSend = sendMqttPayload.sendData()
class MQTTSend:
def __init__(self,ip, port, topic, data):
self.ip = ip
self.port = port
self.topic = topic
self.data = data
def sendData(self):
client = mqtt.Client()
try:
client.connect(self.ip, self.port,60)
except Exception as e:
print("could not connect to Mqtt")
print(e)
try:
for key,value in self.data.items():
if(key is not None and value is not None):
parameter = key
payload = str(parameter)
client.publish(self.topic+payload, value)
print("publisch ok")
except Exception as e:
print("could not publisch")
print(e) |
en zo het run script aangepast dat de uitkomst meteen op MQTT gegooid word en uitgebreid naar tweede omvormer, in mijn geval oost / west
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| from goodwe import Goodwe,GoodweStatus
from mqtt_send import MQTTSend
ip_Oost = "Ip adress omvormer"
ip_West = "Ip adress omvormer"
gw_Oost = Goodwe(ip=ip_Oost)
gw_West = Goodwe(ip=ip_West)
mqttIp = "MQTT Server IP"
mqttPort = 1883
try:
data_send = gw_Oost.getData()
topic = "Sensor/PV/Oost/"
sendMqttPayload = MQTTSend(mqttIp, mqttPort, topic, data_send)
callMqttSend = sendMqttPayload.sendData()
#print(data)
except Exception as e:
print(f"failed: {e}")
exit(0)
#print("#### Data Oost ####")
#for key, value in data_send.items():
# print(key,":", value)
# print(key,":", type(value))
#get data from PV West
try:
data_send = gw_West.getData()
topic = "Sensor/PV/West/"
sendMqttPayload = MQTTSend(mqttIp, mqttPort, topic, data_send)
callMqttSend = sendMqttPayload.sendData()
#print(data)
except Exception as e:
print(f"failed: {e}")
exit(0) |
resultaat:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| Sensor
PV
Oost
voltage_dc_1 = 243.2
current_dc_1 = 0.1
voltage_ac_1 = 233.4
current_ac_1 = 0.5
frequency_ac_1 = 50.02
power_ac = 85
status = Online
temperature = 28.9
yield_today = 15.2
yield_total = 3130.8
working_hours = 5716
power_dc_1 = 24.32 |
edit:
enige waar ik nog mee zit en weinig kaas van gegeten heb
Als bv 1 omvormer niet te bereiken is, dan tel je af van 3 naar 0 en raise je een exeption (raise Exception('Could not get proper data after retrying')) welke volgens mij het script stopt:
code:
1
2
3
4
5
6
7
8
9
| def getData(self, retries=3):
while retries > 0:
retries -= 1
try:
return self._getData(self._ip, self._port)
except Exception as e:
print(f'Retrying {retries}')
pass
raise Exception('Could not get proper data after retrying') |
maar stel dat de volgende omvormer wel te bereiken is, hoe kan ik dat afhandelen.
Hij mag daar best stoppen en de error goed afhandelen, maar daarna niet het gehele script stoppen met een error. Of zit ik nu verkeerd te denken?
[
Voor 9% gewijzigd door
The Fatal op 08-06-2021 21:45
]