[TUTO] envoyer des données à votre onduleur via Solarman

Il faut tout d’abord identifier les données à envoyer et sur quels registres. Par exemple la doc de mon onduleur:

Il y a maintenant depuis la version 1.0.6 du plugin solarman un fichier commandes.py qui se situe dans le répertoire « ressources » du plugin.

Pour les paramètres à envoyer j’ai créé un virtuel

Ensuite il faut appeler ce fichier avec les paramètres suivants:

--ipclewifi : adresse ip de la clè wifi de votre onduleur
--portclewifi : port de cette clé wifi
--serialclewifi  : numéro de série de cette clé
--mbslaveid  : adresse modbus de votre onduleur
--registre : 1 er ou seul registre à écrire. A écrire en héxa, par exemple 0x1205
--modbus : code modbus en décimal servant à écrire (6 ou 16)
puis si vous êtes en write multiple register alors ci dessous la liste des valeurs à écrire dans des registres qui se suivent. Attention à bien respecter l'ordre
--liste : toutes les valeurs à écrire dans des registres qui se suivent en commençant par l'adresse "--registre" ci dessus
ou si vous êtes en write holding register, il n'y a qu'une valeur à envoyer par l'option:
--unique : valeur unique à envoyer au registre

Voici pour exemple ci dessous le bloc code inscrit dans un scénario pour envoyer à mon onduleur Sofar Solar Hyd 6000 es:

//parametres  pour écrire sur votre onduleur
$modbus = 16; 	// commande ecriture en modbus pour votre onduleur en decimal
					// 16 (0x10 en héxa) correspond à l'écriture de plusieurs registres qui se suivent: "write multiple holding registers"
					// 6 (0x06 en héxa) correspond à l'écriture d'un unique registre: "write holding register"
$ipclewifi = 'l adresse ip de votre clé';
$portclewifi = 'port de votre clé';
$serialclewifi = 'votre numéro de série';
$mbslaveid = '1';
$registre = 0x1207; //1er registre à écrire
$modbusmodetravail = 6;
$regmodetravail = 0x1200; // registre pour mode de travail onduleur sofar solar hyd

// endroit où est stocké le fichier python que vous allez utiliser, ci dessous celui que je vous fourni mais vous pouvez en écrire un autre mieux adapté à votre besoin
$solarmanpath = '/var/www/html/plugins/solarman/ressources/commandes.py';

// détermination des différentes valeurs à envoyer à votre onduleur 
$info = cmd::byString("#[Onduleur][Paramétrage données horaire charge forcée batterie][mode de travail]#")->execCmd();
$infopuissbat = cmd::byString("#[Onduleur][Paramétrage données horaire charge forcée batterie][puissance charge batterie]#")->execCmd();
$infohdeb = cmd::byString("#[Onduleur][Paramétrage données horaire charge forcée batterie][début heure]#")->execCmd();
$infomindeb = cmd::byString("#[Onduleur][Paramétrage données horaire charge forcée batterie][début minute]#")->execCmd();
$infodebh = 256 * $infohdeb + $infomindeb;
$infohfin = cmd::byString("#[Onduleur][Paramétrage données horaire charge forcée batterie][fin heure]#")->execCmd();
$infominfin = cmd::byString("#[Onduleur][Paramétrage données horaire charge forcée batterie][fin minute]#")->execCmd();
$infofinh = 256 * $infohfin + $infominfin;
$infosoc = cmd::byString("#[Onduleur][Paramétrage données horaire charge forcée batterie][SOC fin de charge forcée]#")->execCmd();
$infodebmois = cmd::byString("#[Onduleur][Paramétrage données horaire charge forcée batterie][début période mois]#")->execCmd();
$infodebjour = cmd::byString("#[Onduleur][Paramétrage données horaire charge forcée batterie][début période jour]#")->execCmd();
$infodebm = 256 * $infodebmois + $infodebjour;
$infofinmois = cmd::byString("#[Onduleur][Paramétrage données horaire charge forcée batterie][fin période mois]#")->execCmd();
$infofinjour = cmd::byString("#[Onduleur][Paramétrage données horaire charge forcée batterie][fin période jour]#")->execCmd();
$infofinm = 256 * $infofinmois + $infofinjour;
$infojoursem = cmd::byString("#[Onduleur][Paramétrage données horaire charge forcée batterie][jour de la semaine de fonctionnement]#")->execCmd();
$infoactiv = cmd::byString("#[Onduleur][Paramétrage données horaire charge forcée batterie][règle activée (1 = oui)]#")->execCmd();

$rule = cmd::byString("#[Onduleur][Paramétrage données horaire charge forcée batterie][règle n°]#")->execCmd();

$scenario->setlog("mode de travail = " . $info);
$scenario->setlog("régle = " . $rule);
$scenario->setlog("batterie = " . $infopuissbat);
$scenario->setlog("heure début = ". $infohdeb . 'h ' . $infomindeb . 'mn');
$scenario->setlog("heure fin  = ". $infohfin . 'h ' . $infominfin . 'mn');
$scenario->setlog("SOC fin = " . $infosoc);
$scenario->setlog("puissance de charge = " . $infopuissbat);
$scenario->setlog("entre le = ". $infodebjour . '/' . $infodebmois);
$scenario->setlog("et le  = ". $infofinjour . '/' . $infofinmois);
$scenario->setlog("régle active (1 = oui) = " . $infoactiv);

// saisie de la ligne de commande qui sera envoyée pour lancer le prog en python
$cmda	 = 'nice -n 19 /usr/bin/python3 ' . $solarmanpath;
$cmda	.= ' --ipclewifi ' . $ipclewifi;
$cmda	.= ' --portclewifi ' . $portclewifi;
$cmda	.= ' --serialclewifi ' . $serialclewifi;
$cmda	.= ' --mbslaveid ' . $mbslaveid;

$cmd	 = $cmda . ' --registre ' . $registre;
$cmd	.= ' --modbus ' . $modbus;
// Si vous êtes en write multiple register alors ci dessous la liste des valeurs à écrire dans des registres qui se suivent. Attention à bien respecter l'ordre
$cmd	.= ' --liste ' . $rule . ' ' . $infodebh . ' ' . $infofinh . ' ' . $infosoc . ' ' . $infopuissbat . ' ' . $infodebm . ' ' . $infofinm . ' '. $infojoursem . ' ' . $infoactiv;

// Si vous êtes en write holding register commentez la ligne ci dessus et décommentez celle ci dessous
//$cmd	.= '--unique ' . "valeur unique à envoyer";

$scenario->setlog('solarman [commande envoyée] : ' . $cmd);

$result = exec('nohup ' . $cmd . ' >> ' . log::getPathToLog('solarman_commandes') . ' 2>&1 &');
if (strpos(strtolower($result), 'error') !== false || strpos(strtolower($result), 'traceback') !== false) {
  $scenario->setlog('solarman error [commande]-----' . $result);
  return;
}
$scenario->setlog('solarman info [commande] OK, retour: ' . $result);

sleep(8); // pause de qq secondes avant d'envoyer la suite 

// Commandes ci dessous propre au sofar solar hyd 6000
$cmd	 = $cmda . ' --registre ' . $regmodetravail;
$cmd	.= ' --modbus ' . $modbus;
$cmd	.= ' --liste ' . $info;

$scenario->setlog('solarman [commande envoyée] : ' . $cmd);
  
$result = exec('nohup ' . $cmd . ' >> ' . log::getPathToLog('solarman_commandes') . ' 2>&1 &');
if (strpos(strtolower($result), 'error') !== false || strpos(strtolower($result), 'traceback') !== false) {
  $scenario->setlog('solarman error [commande]-----' . $result);
  return;
}
$scenario->setlog('solarman info [commande] OK, retour: ' . $result);


A vous de jouer :wink:

1 « J'aime »

Merci pour le Tuto.

Il va falloir que je potasse un bout de temps, pour comprendre :wink:

N’hésite pas à poser des questions :wink:

Pour ton onduleur les registres à piloter commencent à 1110 si j’ai bien vu dans le fichier que tu avais envoyé

Je viens de réaliser ce tuto.

je me heurte à 2 problèmes dont 1 que j’ai contourné :slight_smile:

1er cas:
En faisant un changement de registre UNIQUE, le fichier comandes.py renvoie une erreur "Namespace object has no attribuate ‹ list › ".
J’ai contourné le problème en faisant une liste de 1 élément et cela fonctionne :slight_smile:

2ieme cas.
Es tu arrivé a changer un registre protégé par le mdp installateur du sofar « 0001 » ?
j’obtient l’erreur « CRCError: CRC validation failed »

Merci

Pour ton 1er pb en effet il faut une lise. Pour le 2eme non je n’ai pas essayé mais je le ferai dès que possible.

Sinon tu y arrives bien pour le reste?

Bonjour @Noyax37
Super intéressant c’est exactement ce que je cherche mais je dois avouez que la je suis un peut perdu, il me faudrait vraiment un Tuto du stil commander votre Sofar Pour les Nuls. avec un pas à pas beaucoup plus détailler.
Déjà merci pour votre travaille.

je ne vois pas trop comment mais d’abord dis moi où tu bloques et je pourrai t’aider.

Tout d’abord merci d’essayez de m’aider, bien que cela fait maintenant plusieurs années que j’utilise Jeedom, la je sèche un peu, d’abord avec le virtuel d’habitude je le complète avec les donnés d’un plugin déjà installé ou avec les donnés d’une sonde par exp. la j’avoue que je ne vois pas comment faire et le scénario non plus, donc comme tu peux voir ya du boulot :crazy_face:
Merci.

ok alors pour le virtuel il faut d’abord que tu listes les commandes dont tu auras besoin pour envoyer à ton onduleur, si un commande ne va pas te servir car tu ne vois pas pourquoi elle devrait être modifiable tu ne la mets pas et tu la saisiras en « dur » dans le script. Voici les commandes que j’ai voulues modifiables dans mon virtuel:

Là pour avoir ça dans ton virtuel tu paramètres comme ça:

Regarde l’exemple que j’ai identifié en rouge, tu crées d’abord la commande « info » qui portera la valeur: « puissance charge batterie ». Ensuite tu crées une commande « action » de type curseur (à toi de voir quelle type de commande est le plus adaptée à ce que tu souhaites) que tu associes à ta commande « info ». Attention à donner un nom différent aux deux commandes, regardes bien dans ce que je t’ai envoyé il y a toujours parfois un détail de différence par exemple les 2 points « : » à la fin d’une des deux. Je ne l’ai pas mis dans ma copie d’écran mais tu peux limiter les valeurs possibles de ta commande action, pour cette exemple j’ai mis entre 0 et 2500 w mon onduleur pouvant fournir max 3000w aux batteries via le réseau je ne voulais pas aller au max.

Tu peux aussi limiter à une liste comme par exemple:

pour créer ta liste tu mets en premier la valeur que tu souhaites récupérer puis la valeur que tu veux afficher dans ta liste les deux séparées par le signe | (combinaison de altgr + 6 en général). Toutes les entrées de ta liste sont elles séparées par un point virgule.

Quand tu auras fait ça on verra pour le scénario :wink:

Ok merci beaucoup c’est exactement ce qu’il me manquer cette capture d’écran, je fait tout ça et je revient vers toi pour le scénarion, encore merci.

j’ai déjà un problème quant je crée le virtuel ça me crée automatiquement une commande info en plus
et dans les liste déroulante on ne voit pas les choix bien qu’ils sont présent voir capture.


dans une liste il faut que tu mettes les 2 valeurs dont je t’ai parlées. Celle qui est affichée et celle que tu vas enregistrer même si ce sont les mêmes. Par exemple tu devras écrire 0|0;15|15;30|30 si tu veux que 0, 15 et 30 s’affiche comme choix.

Pour les liste c’est bon merci.
mais j’ai toujours les commande info en plus.

Encore une chose je voudrais seulement passer d’un mode à l’autre et choisir le N° de règle, pas changer les valeurs, dans ce cas les deux commandes suffisent ou je dois faire toutes les commandes ?
Merci.

C’est ce que je te disais, si tu ne veux que changer de mode sans rien modifier d’autre alors pas la peine de faire tout tu peux te contenter de seulement cette commande

du coup le fichier qui va servir au scénario je suppose qu’il ressemble à ça


et pour le registre je trouve ça ou ? Sofar Hyd 6000 EP ?
Merci.

non ça c’est le texte que tu vas coller dans un bloc code d’un scénario après l’avoir adapté à ton besoin

dans la doc du modbus de ton onduleur. Tu retrouves dans le fichier suivant (enleve le « .txt » à la fin pour avoir un fichier excel):

Modbus HYDXXXXEP by servicesofarsolar.xlsx.txt (276,5 Ko)

Et tu vois que le registre 1110 change le mode par exemple:

voila ce que j’ai fait


par contre aucun résultat quand je lance le code.

Bon ça fonctionne, j’ai trouvé l’erreur, merci beaucoup @Noyax37 de ton aide j’espère que ce poste pourra aider d’autre personne qui comme moi ont un peu de mal avec tout ce charabia :upside_down_face: