A ta place, je mettrais les déclarations des 2 fonctions dans le fichier user.function.class.php (le code que tu as proposé sauf les 2 premières lignes) et je les appellerais dans les scénarios de cette manière :
// Récupérer l'équipement
$equipement = eqLogic::byString('#[Photovoltaique][Onduleur Solaredge]#');
desactiverEquipement($equipement);
OU
activerEquipement($equipement);
Et le tour est joué.
Manque de détails
Je n’ai pas mis tous ces détails plus tôt parce que je répondais depuis mon téléphone et aussi un peu pour que tu cherches la solution par toi même.
ok, désolé je prenais le pb à l’envers, en fouillant un peu j’ai trouvé la fonction setChanged() qui est appelée à chaque modification sur un équipement que ce soit en direct ou par scénario.
Excuse moi mais si tu sais qu’il y a qq chose de changé alors c’est très simple de tester si tous tes équipement sont actifs et ensuite en fonction de ça informer le démon de ceux qui sont actifs ou non. C’est appelé à chaque appel de save en db.class.php
public static function save($object, $_direct = false, $_replace = false) {
if (!$_direct && method_exists($object, 'preSave')) {
$object->preSave();
}
if (!static::getField($object, 'id')) {
//New object to save.
$fields = static::getFields($object);
if (in_array('id', $fields)) {
static::setField($object, 'id', null);
}
if (!$_direct && method_exists($object, 'preInsert')) {
$object->preInsert();
}
if (method_exists($object, 'encrypt')) {
$object->encrypt();
}
list($sql, $parameters) = static::buildQuery($object);
if ($_replace) {
$sql = 'REPLACE INTO `' . static::getTableName($object) . '` SET ' . implode(', ', $sql);
} else {
$sql = 'INSERT INTO `' . static::getTableName($object) . '` SET ' . implode(', ', $sql);
}
$res = static::Prepare($sql, $parameters, DB::FETCH_TYPE_ROW);
$reflection = static::getReflectionClass($object);
if ($reflection->hasProperty('id')) {
try {
static::setField($object, 'id', static::getLastInsertId());
} catch (Exception $exc) {
trigger_error($exc->getMessage(), E_USER_NOTICE);
} catch (InvalidArgumentException $ex) {
trigger_error($ex->getMessage(), E_USER_NOTICE);
}
}
if (method_exists($object, 'decrypt')) {
$object->decrypt();
}
if (!$_direct && method_exists($object, 'postInsert')) {
$object->postInsert();
}
} else {
//Object to update.
if (!$_direct && method_exists($object, 'preUpdate')) {
$object->preUpdate();
}
$changed = true;
if (method_exists($object, 'getChanged')) {
$changed = $object->getChanged();
}
if ($changed) {
if (method_exists($object, 'encrypt')) {
$object->encrypt();
}
list($sql, $parameters) = static::buildQuery($object);
if (!$_direct && method_exists($object, 'getId')) {
$parameters['id'] = $object->getId(); //override if necessary
}
if ($_replace) {
$sql = 'REPLACE INTO `' . static::getTableName($object) . '` SET ' . implode(', ', $sql);
} else {
$sql = 'UPDATE `' . static::getTableName($object) . '` SET ' . implode(', ', $sql) . ' WHERE id = :id';
}
$res = static::Prepare($sql, $parameters, DB::FETCH_TYPE_ROW);
} else {
$res = true;
}
if (method_exists($object, 'decrypt')) {
$object->decrypt();
}
if (!$_direct && method_exists($object, 'postUpdate')) {
$object->postUpdate();
}
}
if (!$_direct && method_exists($object, 'postSave')) {
$object->postSave();
}
Et c’est là le problème : il n’y a pas d’événement qui avertisse qu’un équipement a été activé ou désactivé.
La config du démon est mise à jour par preSave, mais save n’est pas appelé par le scénario qui active ou désactive un équipement. C’est bien ça mon problème.
A moins que save ne soit appelé avec $_direct à true ? Ce qui fait que preSave n’est pas appelé.
edit: pourtant le save est appelé sans $_direct à true :
J’ai testé pour un de mes plugins et cette fonction est bien appelée lors de l’activation ou désactivation d’un équipement. Il suffit ensuite de tester chaque eqlogic.
Je ne comprends pas ce qui te bloque, je vais arrêter d’insister mais je vais me servir de ça pour mes plugins si besoin.
Il faudrait tester la bêta pour être sûr (je l’ai testée et c’est ok chez moi).
Vous pourrez repasser sur la stable ensuite quand cette version passera en stable sans changement de configuration.
A priori cela fonction chez moi, plus d’erreur sur équipement désactivé.
Merci pour boulot.
ici le log update
======================================================================
== 29/05/2025 06:12:49 == Dependencies installation for mymodbus
======================================================================
[ 5% ] : Clean apt...
[ 9% ] : Clean apt : [ OK ]
[ 10% ] : Update apt...
[ 19% ] : Update apt : [ OK ]
[ 20% ] : Init python3 & prerequisites...
[ 29% ] : Init python3 & prerequisites : [ OK ]
[ 30% ] : Init PyEnv...
** PyEnv not required: 3.11.2 >= 3.11 **
** python3 path: python3 **
[ 39% ] : Init PyEnv : [ OK ]
[ 40% ] : Setting up virtual environment...
** Version of python in VENV: Python 3.11.2
[ 69% ] : Setting up virtual environment : [ OK ]
[ 70% ] : Install the required python packages...
[ 79% ] : Install the required python packages : [ OK ]
[ 80% ] : Restoring folders and files rights...
[ 89% ] : Restoring folders and files rights : [ OK ]
[ 90% ] : Summary of installed packages...
aiohappyeyeballs==2.6.1
aiohttp==3.11.14
aiosignal==1.3.2
attrs==25.3.0
frozenlist==1.5.0
idna==3.10
jeedomdaemon==1.2.9
multidict==6.2.0
propcache==0.3.0
pymodbus==3.8.6
pyserial==3.5
yarl==1.18.3
[ 99% ] : Summary of installed packages : [ OK ]
[100% ] : Finished !
======================================================================
== OK == Installation Successful
======================================================================
ici le log daemon
[2025-05-29 16:00:11] INFO : MyModbusd: Command 'write' received from jeedom: sending the command to MyModbusClient 322: {'eqId': 322, 'cmdWriteValue': 1, 'cmdId': 4474}
[2025-05-29 16:00:22] INFO : MyModbusd: Command 'write' received from jeedom: sending the command to MyModbusClient 322: {'eqId': 322, 'cmdWriteValue': 0, 'cmdId': 4475}
[2025-05-29 16:20:11] INFO : MyModbusd: Command 'write' received from jeedom: sending the command to MyModbusClient 322: {'eqId': 322, 'cmdWriteValue': 0, 'cmdId': 4475}
[2025-05-29 21:28:02] INFO : MyModbusd: Command 'newDaemonConfig' received from jeedom: sending the new config to all MyModbusClients
[2025-05-29 21:28:02] INFO : MyModbusd: 'manage_new_config' Stopping equipment id 321
[2025-05-29 21:28:04] INFO : Onduleur Solaredge: Modbus communication closed
[2025-05-29 21:28:04] INFO : MyModbusd: 'manage_new_config' Actualising the configuration of equipment Piscine (id 322)
[2025-05-29 21:28:06] INFO : Piscine: Modbus communication closed
[2025-05-29 21:28:06] INFO : Piscine: 'async_connect' first call
[2025-05-30 04:00:03] INFO : MyModbusd: Command 'newDaemonConfig' received from jeedom: sending the new config to all MyModbusClients
[2025-05-30 04:00:03] INFO : MyModbusd: 'manage_new_config' Actualising the configuration of equipment Piscine (id 322)
[2025-05-30 04:00:03] INFO : MyModbusd: 'manage_new_config' Starting equipment Onduleur Solaredge (id 321)
[2025-05-30 04:00:03] INFO : MyModbusd: Starting the task for the equipement Onduleur Solaredge
[2025-05-30 04:00:03] INFO : Onduleur Solaredge: 'async_connect' first call
[2025-05-30 04:00:05] INFO : Piscine: Modbus communication closed
[2025-05-30 04:00:05] INFO : Piscine: 'async_connect' first call
[2025-05-30 04:01:03] INFO : MyModbusd: Command 'read' received from jeedom: sending the command to MyModbusClient
et ici log plugin
[2025-05-26 19:17:02] INFO : mymodbus::deamon_stop * Arrêt du démon...
[2025-05-26 19:17:05] INFO : mymodbus::deamon_stop * Démon arrêté
[2025-05-26 19:22:20] INFO : mymodbus::deamon_start * Lancement du démon MyModbus
[2025-05-29 06:10:02] INFO : Début d'activation du plugin
[2025-05-29 06:10:02] INFO : mymodbus::deamon_stop * Arrêt du démon...
[2025-05-29 06:10:05] INFO : mymodbus::deamon_stop * Démon arrêté
[2025-05-29 06:10:06] INFO : Info sur le démon : {"log":"mymodbus","state":"nok","launchable":"ok","launchable_message":"Gestion automatique d\u00e9sactiv\u00e9e","auto":"0","last_launch":"2025-05-26 19:22:20"}
[2025-05-29 06:10:07] INFO : mymodbus_update
[2025-05-29 06:13:39] INFO : mymodbus::deamon_start * Lancement du démon MyModbus
Jeedom est vraiment bien pensé, il y a presque toujours une solution. Pouvoir échanger en live avec les démons python ça permet plein de choses comme changer les niveaux de logs, modifier le traitement de certaines données, … sans avoir à le redémarrer
c’est bien traité et franchement je vais m’en inspirer
J’ai juste une petite question, dans ta fonction getCompleteConfiguration tu ne traites pas les équipements qui ne sont pas actifs, ok mais si justement la sauvegarde est pour passer un équipement de actif à inactif? C’est traité dans le démon?
// Retourne la configuration des équipements et de leurs commandes
public static function getCompleteConfiguration() {
log::add(__CLASS__, 'debug', __CLASS__ . '::' . __FUNCTION__);
$completeConfig = [];
foreach (self::byType(__CLASS__) as $eqMymodbus) { // boucle sur les équipements
// ne pas exporter la configuration si l'équipement n'est pas activé
if (!$eqMymodbus->getIsEnable()) {
continue;
}
$EqConfiguration = $eqMymodbus->getEqConfiguration();
if ($EqConfiguration != []) {
$completeConfig[] = $EqConfiguration;
}
}
//log::add(__CLASS__, 'debug', 'eqLogic mymodbus getCompleteConfiguration: ' . json_encode($completeConfig));
return $completeConfig;
}