Je cherche à communiquer avec un onduleur Solax via « modbus ».
Je mets des guillemets, parce que ça ressemble très fortement à du modbus, mais ça semble différent notamment au niveau des « packets format ».
Ce serait de ce type :
Il semble y avoir en plus un header, une source address et une data length.
Je n’ai pas bien compris ce qui était réellement figé dans la norme Modbus et si ce type d’implémentation pouvait être accepté (l’ordre des bits peut être modifié, démarrer à 0 ou 1, etc…)
Si quelqu’un pourrait m’aider à faire fonctionner un des plugins modbus (RTU)… sachant que je me suis payé le plugin officiel.
Merci par avance.
L’intérêt d’une communication directe RS485 serait de remonter plus d’informations et plus rapidement que par le cloud Solax (qui fonctionne, mais est assez limité).
je viens de faire l’acquisition d’un onduleur SOLAX X1 Boost et suis également preneur d’une solution pour collecter des données plus précises sur l’onduleur.
après avoir connecté l’onduleur au wifi, en faisant un scan de port, je constate que le port 502 est ouvert et ça semble correspondre au modbus.
@Jean-Baptiste : si tu as déja trouvé une solution non documenté sur ce post, je suis preneur !
dans le cas contraire, je me lance dans des recherches
Bonjour,
Je crois avoir lu sur un forum en allemand que le X1 mini ne supportait pas modbus.
Modbus doctor ne renvoit rien de probant sur l’interface RS485.
Si le port 502 est ouvert, il y a probablement une possibilité de communiquer en modbus.
Cette possibilité semble activable sur le menu avancé de l’onduleur (en échec sur le mien).
curl -d « optType=ReadRealTimeData&pwd=REQ_NO_SOLAX » -X POST http://192.168.1.xxx’
.
Cette commande renvoit :
{« sn »:« REQ_NO_SOLAX »,« ver »:« 3.003.02 »,« type »:4,« Data »:[0,0,0,0,0,0,0,0,0,0,0,637,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,0,0,0,0,0,0,65045,65535,1443,0,13003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],« Information »:[6.000,4,« XB3260I3469062 »,8,0.00,0.00,1.39,0.00,0.00,1]}
(Beaucoup de 0 car il fait nuit au moment de la commande …)
j’ai ensuite trié les datas avec un petit scénario qui s’execute toutes les minutes :
$solaxdata=[
'NetworkVoltage' => "", // Volt de la maison
'OutputCurrent' => "", // Ampères en sortie de l'onduleur
'ACPower' => "", // Watts en sortie de l'onduleur
'PV1Voltage' => "", // Voltage de la String 1
'PV2Voltage' => "", // Voltage de la String 2
'PV1Current' => "", // Ampères en sortie de la String 1
'PV2Current' => "", // Ampères en sortie de la String 2
'PV1InputPower' => "", // Watts en sortie de la String 1
'PV2InputPower' => "", // Watts en sortie de la String 2
'SolaxUnknown10' => "",
'RunMODE' => "", // Mode de fonctionnement de l'onduleur. 2 = Production ; 0 = En attente production
'TotalYield' => "", // Energie (kWh) totale produite par l'onduleur
'SolaxUnknown13' => "",
'RunMODE' => "", // Mode de fonctionnement de l'onduleur
'DailyYield' => "", // Energie (kWh) produite par jour par l'onduleur
'unknown16' => "", //batterie
'unknown17' => "", //batterie
'unknown18' => "", //batterie
'unknown19' => "", //batterie
'unknown20' => "", //batterie
'unknown21' => "", //batterie
'unknown22' => "", //batterie
'unknown23' => "", //batterie
'unknown24' => "", //batterie
'unknown25' => "", //batterie
'unknown26' => "", //batterie
'unknown27' => "", //batterie
'unknown28' => "", //batterie
'unknown29' => "", //batterie
'unknown30' => "", //batterie
'unknown31' => "", //batterie
'unknown32' => "", //batterie
'unknown33' => "", //batterie
'unknown34' => "", //batterie
'unknown35' => "", //batterie
'unknown36' => "", //batterie
'unknown37' => "", //batterie
'unknown38' => "", //batterie
'unknown39' => "", //batterie
'unknown40' => "", //batterie
'unknown41' => "", //batterie
'unknown42' => "", //batterie
'unknown43' => "", //batterie
'unknown44' => "", //batterie
'unknown45' => "", //batterie
'unknown46' => "", //batterie
'unknown47' => "", //batterie
'unknown48' => "", //batterie
'unknown51' => "",
'GridExported' => "",
'GridImported' => "",
'TotalFeedInEnergy' => "", // Energie totale renvoyée sur le réseau EDF
'unknown53' => "",
'TotalConsumption' => "", //Energie totale importée depuis le réseau EDF
'unknown55' => "",
'unknown56' => "",
'unknown57' => ""
];
$arr=[];
$output = shell_exec('curl -d "optType=ReadRealTimeData&pwd=SXFAWWMMQN" -X POST http://192.168.1.101');
$scenario->setLog($output);
$jsonData = json_decode($output, true);
foreach ($jsonData['Data'] as $value) {
$arr[]=$value;
}
$i=0;
foreach($solaxdata as $clef => $valeur){
$solaxdata[$clef]=$arr[$i];
$i += 1;
}
foreach($solaxdata as $clef => $valeur){
$scenario->setlog($clef.' : '.$valeur);
$scenario->setdata($clef, $valeur, false);
cmd::ByString("#[BETA][Data Solax][$clef]#")->event("$valeur");
}
j’envoi le tout dans un virtuel :
je tire une synthèse de ces infos dans un second virtuel
Cela semble supporté par la pocket wifi, pas l’Ethernet.
Personnellement, j’aime bien le câble, donc j’utilise l’Ethernet qui semble bien plus limitée.
L’application solax cloud pour smartphone permet aussi une connexion en direct, laquelle ne fonctionne sur mon installation.
Insérer le code fourni dans mon post précédent.
Le code récupère le retour de la commande curl et sépare les valeurs.
Chaque valeur est envoyée dans un virtuel nommé « Data Solax ».
le nom des clés doit correspondre exactement à ce qui existe dans le virtuel.
Créer le virtuel Data Solax
Ce virtuel sert de « base de données ». on pourra ensuite créer d’autres virtuels qui vont chercher les valeurs dans cette base pour faire des calculs et créer le 3e tableau.
Créer toutes les valeurs indiquées dans le code, même si elles ne servent à rien.
NB : A noter que mes valeurs d’autonomie sont fausses car j’ai récemment migré de ZHA vers Z2M et que ma clée LIXEE a des petits soucis que j’ai pas encore réglé.
mais d’habitude, ça marche
Voilà tout ça à titre d’information ; si tu veux refaire exactement ce que j’ai fait, ce doit être faisable avec les éléments que je t’ai donné.
Et si tu fais différemment, je suis intéréssé par la manière et le résultat que tu obtiens
Bon courage & Have fun
bonsoir,
merci @AlexDelm j’ai reussi a recuperer les infos avec la commande curl
mais comme j’ai un onduleur triphasé les valeurs recuperee ne correspondent pas j’ai donc essaye de d’adapter mon virtuel pour que ca match.
j’ai beaucoup plus de valeur mais je n’arrive pas a en recuperer plus de 50.
j’ai cree un post dans la rubrique programation peut etre pourras tu m aider ? requete curl
autrement ton affichage est top !!!
si je fais autrement je posterais ici
J’ai enfin réussi à lire les informations de mon onduleur solax via RS485, les onduleurs Solax sont effectivement compatible modbus RTU :
Prérequis : Version Firmware >= 1.37 ou 1.38. Concernant mon onduleur, il a fallu le mettre à jour (l’activation de Modbus sur l’onduleur n’était pas possible). Mise à jour réalisée à distance par le support solax mondial, via la pocket Ethernet. Il existe ce répertoire qui contient les fichiers de firmware Box, sans garantie.
Câblage RS485 : Connecteur RJ-45, 3 pour le GND, 4 pour A, 5 pour B :
On peut aussi brancher un tore de mesure de courant sur les lignes sur les lignes 1 et 8 du même connecteur, afin de mesurer le courant réseau.
Activation de Modbus sur l’onduleur, choisir l’adresse ;
Pour les requêtes, ce mode d’emploi qui semble le plus adapté (il y en d’autres qui semblent incohérents) : Solax.Power.X1-BOOST.Single.phase.inverter.Modbus-RTU.comms.protocolV1.0.-.Public.version.pdf (907,7 Ko)
Mon matériel répond à une requête Fonction code 4, requête 0x400 (1024 en décimal) sur 61 registres.
Il y a aussi des registres lisibles en Fonction code 3, à partir de 0x300 (768 en décimal) mais la documentation semble moins juste.
Au final, c’est beaucoup plus réactif que Solax Cloud, et remonte beaucoup plus d’informations.