ma petite contribution :
je dispose d'un Solax X1 Retro Fit 5.0 depuis début 2019.
Firmware en V3.12.
J'ai constaté et cela est confirmé dans un autre forum, que l'accès à l'API locale du solax n'est plus disponible (demande un login/paswword en boucle et via la clef wifi subnet isolé non accessible sans connexion P2P)
info sur https://community.home-assistant.io/t/s ... uide/48008
L'API semble être désactivée depuis 2018 et donc sur les dernières mises à jour des firmwares ou les derniers modèles livrés.
J'ai contacté Solax pour obtenir des infos sur l'API mais rien.
Donc place à du reverse engineering :
1ere piste : le json du portail web SolaxCloud accessible sur l'URL https://solaxcloud.com/export/getReportData.do
https://github.com/DiedB/Homey-SolarPanels/issues/18
problème : je n'ai pas réussi à scripter le passage du login/password avec le cookie de session.
ok manuellement mais ko par le script
2eme piste, celle qui fonctionne depuis plusieurs semaines :
La Webapi utilisée par l'application Android SolaxCloud
J'ai installé l'application Packet Capture pour obtenir les différentes requêtes Web et avoir un json exploitable et complet.
J'ai ensuite positionné les requêtes dans un script Python que jeedom exécute toutes les 5 minutes (pas plus car le solax remonte les infos que toutes les 5 minutes dans le cloud). Le script écrit localement le fichier json obtenu pour que jeedom l'exploite facilement avec le plugin script et des commandes json du type :
result>0>ratedPower
result>0>gridpower
result>0>temperature
(...)
Le script python pour obtenir le fichier json :
Code : Tout sélectionner
# Starting a session in which we will store a JSESSIONID Cookie
import requests
import json
import time
from datetime import datetime
s = requests.Session()
s.keep_alive = True
#hearder smartphone
headers = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 8.0.0; xxxxxxxx Build/R16NW; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.157 Mobile Safari/537.36',
'Origin': 'file://',
'Accept' : 'application/json, text/plain, */*',
'Content-Type': 'application/x-www-form-urlencoded',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7',
'X-Requested-With': 'com.solaxcloud.starter'
}
#-----------------------------------------------------------------------------
# Logging in to get the Cookie
r=s.post(
url='http://www.solaxcloud.com:6080/proxy//login/login',
data={
'password': 'xxxxxxxx',
'userName': 'xxxxxxx',
'userType': '5'
},
headers=headers,
verify=False
)
#print(r.content)
#print(s.cookies.get_dict())
#time.sleep(3)
dct=s.cookies.get_dict()
jid=dct["JSESSIONID"]
#print(jid)
headers = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 8.0.0; xxxxxx Build/R16NW; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.157 Mobile Safari/537.36',
'Origin': 'file://',
'Accept' : 'application/json, text/plain, */*',
'Content-Type': 'application/x-www-form-urlencoded',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7',
'X-Requested-With': 'com.solaxcloud.starter',
'JSESSIONID' : jid
}
#-----------------------------------------------------------------------------
r = s.post(
url='http://www.solaxcloud.com:6080/proxy//login/isArrears.do',
data={
'tokenId': 'xxxxxxxxx',
'today': datetime.today().strftime('%Y-%m-%d')
},
headers=headers,
cookies=s.cookies,
verify=False
)
#print(r.content)
#-----------------------------------------------------------------------------
r = s.post(
url='http://www.solaxcloud.com:6080/proxy//dictionary/getDictionary',
data={
'dictCode': 'APP_NEW_VERSION',
'lang': "'en_US"
},
headers=headers,
cookies=s.cookies,
verify=False
)
#print(r.content)
#-----------------------------------------------------------------------------
#Get info
r = s.post(
url='http://www.solaxcloud.com:6080/proxy//mysitenew/getBatteryData.do',
data={
'tokenId': 'xxxxxxxxx',
'siteId': 'xxxxxxxxxx'
},
headers=headers,
cookies=s.cookies,
verify=False
)
#print(r.content)
#print(s.cookies.get_dict())
f=open('/usr/share/nginx/www/jeedom/plugins/script/core/ressources/solax.json', 'w')
f.write(r.content)
f.close()
Inconvénients de ce script :
non supporté et usage du json non officiel
cloud dépendant
Il serait intéressant de pouvoir dialoguer localement avec le solax sans passer par le cloud mais bon je ne sais pas pourquoi ils ont fait le choix de ne plus exposer leur API