Communication modbus sur onduleur Solax

Bonjour,

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é).

Bonjour,

Peux-tu envoyer le document complet pour voir s’il y a plus d’info?

Merci.

Bonjour,

Sur le site de tasmota :
https://tasmota.github.io/docs/_media/solax-x1/SolaxPower_Single_Phase_External_Communication_Protocol_X1_V1.7.pdf

Merci

Bonjour,

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 :slight_smile:

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).

Bonjour Jean-Baptiste,

J’ai finalement trouvé mon bonheur ici :

C’est la syntaxe de la commande :

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 :
image

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.

bonjour,
je souhaite egalement recuperer les infos dans mon onduleur solax.

@AlexDelm je viens de tester la commande curl dans l’invite de commande windows et ca marche !!

pouvez vous me guider etape par etapes poour lancer cette commande et la traiter dans jeedom ?
merci

Bonjour,

  1. Créer un scénario « Solax »

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.

  1. 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.



sinon mon code ne fonctionne pas.

  1. Programmé le virtuel ou le scénario pour qu’il s’execute toutes les minutes et le tour est joué.

  2. Créer le tableau de synthèse
    On repart sur un virtuel, voici ma configuration :


Pour être completement transparent, dans le scénario, sous le code, j’ai ces quelques lignes qui ont pour but de :

  • déterminer si je consomme de l’éléctricité EDF en ce moment ou uniquement l’élec des panneaux
  • Déterminer si l’onduleur est éteint (je le coupe parfois la nuit quand il y a des orages) ou si j’ai perdu la communication.

Ensuite j’ai fait une petite page de design pour synthétiser tout ça :

et les deux virtuels donnent ça :

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 :sweat_smile:

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 :slight_smile:
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

Pour collecter plus de données, il te suffit d’ajouter des lignes à la suite :

'unknown60' => "", 
'unknown61' => "", 
'unknown62' => "",

et de créer la commande dans le virtuel associé :wink:

Concernant la correspondance des valeurs dans le cas d’un triphasé, je pense que ça doit se retrouvé sur le net en farfouillant … mais pas évident

Merci
C’est ce que j’ai fait
J’ai rajouté.
´solaxunknow’ => ´´´´,

C’est pour cela que ça ne fonctionne pas ?

tu as bien de noms de variables différentes à chaque fois et qui correspondent à ce qui existe dans ton virtuel ?

Bonjour
Oui je vais revérifier au cas où un espace de soit glisse qque part

c’est bon j’ai reussi a recuperer mes infos .
maintenant il faut trier !!

Bonjour,

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 :
    image
    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 mesuré 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.