Micro onduleur DEYE / Envoyer un commande (contrôle de ma puissance en sortie)

Bonjour,
Je souhaiterais avec Solarman envoyer une commande pour contrôler la puissance en sortie de mon micro onduleur .
Je ne sais pas trop par quel bout attaquer ça.

Merci


Informations Jeedom

Core : 4.4.8.1 (V4-stable)
DNS Jeedom : oui

Plugin : Solarman
Version : 2024-07-13 10:21:16 (stable)

Informations complémentaires
OS: raspbian 10 on RPI 3 B ; PHP: 7.3.31-1~deb10u3 ; Python: 3.7.3
Solarman: v unknown ; cmds: 16

Salut, as tu lu ce post?

Pour toi tu peux grandement simplifier si tu ne veux commander que ce registre

un bloc code dans un scénario à adapter à ta config (si $modbus = 16 renvoie une erreur alors tester avec 6 et adapter la commande à envoyer). Attention, le valeur que tu dois envoyer sera divisée par 10. Donc pour 40% envoie 400

//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 = 0x0028; //1er registre à écrire

// 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 
$infopourcent = 'la valeur que tu souhaites envoyer à ton onduleur ça peut être récupéré par un tag par exemple';

$scenario->setlog("% envoyé = " . $infopourcent);

// 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 ' . $infopourcent;

// 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 


Merci. pour le retour, Oui j’ai vu le post … mais je ne sais pas trop quoi en faire. Je vais regarder ton post en dessous et faire des essais.

Tu arrives bien à interroger ton onduleur ?

Excellent , ça fonctionne , la valeur a envoyer est bien 50 (pour 50%).
Merci …

50 pas 500?

Oui , par exemple 10 pour avec 10% de la puissance totale, je pense qu’il y a une erreur dans le scale factor car dans le fichier de conf du plugin il est bien à 1 (pour la lecture du paramètre )

Ok, super si ça fonctionne

Est ce que tu peux m’envoyer la doc des registres de ton onduleur pour que je la mette à disposition dans le plugin

Bonjour,

J’ai un onduleur Deye SUN6K et j’aimerais lire quelques infos afin d’adapter le courant de charge des batteries.
J’ai pu récupérer la doc modbus mais j’avoue que je ne suis pas super confortable avec tout ça.
Je voudrais dans un premier temps lire les données.
J’ai vu que le code est 0x03 pour la lecture mais pas de distinction entre lecture d’un registre simple ou multiple.

J’ai essayé d’adapter le script ci-dessus tant bien que mal, il semble s’exécuter mais pas de données en retour dans les logs.

Je suis preneur d’un coup de main.

ci-dessous les registres que j’aimerais lire : j’ai fait un test sur le 320 (pas sur que ce soit en Hexa)

ci-dessous la modif à apporter au script que j’ai effectuée :

//parametres pour écrire sur votre onduleur
$modbus = 3; // commande ecriture en modbus pour votre onduleur en decimal
// 16 (0x10 en héxa) correspond à l’écriture d’un unique ou plusieurs registres qui se suivent: « write multiple holding registers »
// 6 (0x06 en héxa) correspond à l’écriture d’un unique registre: « write holding register » non-used chez Deye
// 3 (0x03 en héxa) correspond à l’écriture d’un unique ou plusieurs registres qui se suivent : « write holding register »
$ipclewifi = ‹ x.x.x.x ›;
$portclewifi = ‹ yyyy ›;
$serialclewifi = ‹ 123456 ›;
$mbslaveid = ‹ 1 ›;
$registre = 0x00140; //1er registre à lire pour moi (le 320 de la doc)

d’avance merci pour votre aide.

ah oui voici ce que dit la doc pour la lecture :

Pour la lecture tu n’as pas besoin d’appliquer ce script, regarde dans les fichiers de configuration du plugin s’il n’y a pas déjà ton onduleur ou un qui y ressemble

Essaye d’utiliser le fichier deye_hybrid.yaml en créant ton équipement, apparemment pour un 5k ça fonctionne

bonjour,

désolé pour la réponse tardive.
Merci pour ce retour.
J’ai effectivement pas mal d’information avec le fichier deye_hybrid mais je n’ai pas le paramétrage du courant de charge max autorisé. (depuis l’appli : « Set Battery Max Charging Current »
J’ai l’information du courant actuel tiré par la batterie.

Si je ne peux pas le lire (je voulais commencer prudemment :slight_smile: ), je peux éventuellement m’inspirer de la puissance prélevée depuis le Grid et calculé le courant disponible.
Dans ce cas, pour effectuer une écriture du registre, il faut que je positionne le modbus=16 dans le script proposé et trouver le bon registre.

merci

Tu peux reposter le script que tu as modifié mais entre les balises « texte préformaté » sinon c’est illisible

bonjour,

En fait j’ai repris le script proposé et j’ai modifié le code modbus.


voici le log que je reçois ensuite :


[2024-08-12 09:01:11][SCENARIO] – Début : Scenario lance manuellement.
[2024-08-12 09:01:11][SCENARIO] - Exécution du sous-élément de type [action] : code
[2024-08-12 09:01:11][SCENARIO] Exécution d’un bloc code
[2024-08-12 09:01:11][SCENARIO] % envoyé = la valeur que tu souhaites envoyer à ton onduleur ça peut être récupéré par un tag par exemple
[2024-08-12 09:01:11][SCENARIO] solarman [commande envoyée] : nice -n 19 /usr/bin/python3 /var/www/html/plugins/solarman/ressources/commandes.py --ipclewifi x.x.x.x --portclewifi xxxx --serialclewifi xxxxx --mbslaveid 1 --registre 210 --modbus 3
[2024-08-12 09:01:11][SCENARIO] solarman info [commande] OK, retour:
[2024-08-12 09:01:19][SCENARIO] Fin correcte du scénario

La saisie du registre en hexa apparait en décimal dans les logs. Ca correspond bien.
La requête est bien reçu par l’onduleur.

Voila.

Mais en ligne 16 c’est une vraie valeur que tu dois lui mettre et ne pas laisser ce que j’avais écrit

En ligne 30 tu dois « decommenter » cette ligne => enlever les 2 / en bout de ligne

merci.
Mais comme je voulais essayer la lecture d’un registre, c’est pour ça que je n’ai rien mis. Dans ton exemple, c’était bien pour envoyer une valeur ?
Je vais essayer en mode écriture pour voir.

Merci beaucoup

Excuse moi mais je ne comprends rien à ce que tu veux. Tu veux lire ou écrire ? Pour lire et comme je te l’ai déjà écrit tu n’as pas à passer par le script, le plugin gère ça. Si tu veux écrire alors là oui le script peut te servir. Mais il ne faut pas tout mélanger, ne pas vouloir lire avec un script qui est prévu pour écrire, les commandes modbus ne sont pas les mêmes et il n’est pas prévu pour interpréter le retour de l’onduleur