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