Może komuś się przyda
Aby zintegrować dowolny falownik który współpracuje z chmurą globalapi.solarmanpv.com trzeba napisać na adres customerservice@solarmanpv.com prośbę o odblokowanie API
W odpowiedzi otrzymamy regulamin. Należy odpisać, że przeczytaliśmy i że się zgadzamy.
W kolejnej odpowiedzi otrzymamy :
API ID:xxxxxxxxxxxx
API Secret: xxxxxxxxxxxxxxxxxxx
Dane te będziemy potrzebować do naszego skryptu
W domoticzu tworzymy czujnik "Electric(Instant+Counter) i w skrypcie podajemy jego IDX
Oto skrypt xxx.py który umieszczamy w katalogu /domoticz/scripts/python
Nadajemy skryptowi prawa wykonywalności oraz dodajemy do Crontab wykonanie skryptu np. co 5 minut
#!/usr/bin/env python3
import http.client, urllib.request, json, hashlib
from datetime import datetime
#Trannergy account details
apiSite = "globalapi.solarmanpv.com"
appID = "xxxxxxxxxxx" #Change to your own appID, to be provided from Trannergy/Solarman
appSecret = "xxxxxxxxxx" #Change to your own appSecret, to be provided from Trannergy/Solarman
email = "xxxxxxxxxxx" #Change to your own account name/mail address
password = b"xxxxxxxxxxxxx" #Change password to your own, maintain the b in front of the password as password need to be binary
conn = http.client.HTTPSConnection(apiSite)
password = hashlib.sha256(password).hexdigest()
#domoticz settings
domoticz_host = "xxxxxxxxx" #ip adress of the domoticz host
domoticz_port = "xxxx"
domoticz_url = "json.htm"
domoticz_ActualPower = "xxx" #idx of new device
#Request access token, manaul chapter/routine 2.1
payload = json.dumps({
"appSecret": appSecret,
"email": email,
"password": password
})
headers = {
'Content-Type': 'application/json'
}
conn.request("POST", "/account/v1.0/token?appId="+appID+"&language=en", payload, headers)
res = conn.getresponse()
data = json.loads(res.read())
accesstoken = data['access_token']
print("Accesstoken :" +accesstoken)
#Request current power + lastupdate time + stationID, manual chapter/routine 4.4
payload = json.dumps({
"page": 1,
"size": 20
})
headers = {
'Content-Type': 'application/json',
'Authorization': 'bearer '+accesstoken
}
conn.request("POST", "/station/v1.0/list?language=en", payload, headers)
res = conn.getresponse()
data = json.loads(res.read())
stationID = str(data['stationList'][0]['id'])
currentpower = str(data['stationList'][0]['generationPower'])
lastupdatetime = int(data['stationList'][0]['lastUpdateTime'])
lastupdatetime = str(datetime.fromtimestamp(lastupdatetime))
print("Current Power :"+currentpower+"W")
print("Last update time :"+lastupdatetime)
print("StationID :"+stationID)
#Request deviceID + deviceSN, manual chapter/routine 4.2
payload = json.dumps({
"deviceType": "INVERTER",
"page": 1,
"size": 10,
"stationId": stationID
})
headers = {
'Content-Type': 'application/json',
'Authorization': 'bearer '+accesstoken
}
conn.request("POST", "/station/v1.0/device?language=en", payload, headers)
res = conn.getresponse()
data = json.loads(res.read())
deviceID = str(data['deviceListItems'][0]['deviceId'])
deviceSN = str(data['deviceListItems'][0]['deviceSn'])
print('Device serial : '+deviceSN)
print('Device ID : '+deviceID)
#Total generated power, manual chapter/routine 3.3
payload = json.dumps({
"deviceSn": deviceSN,
"deviceId": deviceID
})
headers = {
'Content-Type': 'application/json',
'Authorization': 'bearer '+accesstoken
}
conn.request("POST", "/device/v1.0/currentData?language=en", payload, headers)
res = conn.getresponse()
data = json.loads(res.read())
multiply='1000.0'
totalgenpower = float(data['dataList'][23]['value']) * float(multiply)
totalgenpower = str(totalgenpower)
print("Total generated power: " +totalgenpower+"W")
#uploading values to domoticz
url = ("http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url+ "?type=command¶m=udevice&idx=" + domoticz_ActualPower+ "&nvalue=0&svalue=" + currentpower+ ";" + totalgenpower)
urllib.request.urlopen(url)
print(url)

