Comment arrêter le rafraîchissement mymodbus

Lien vers la doc à laquelle je fais référence : Documentation Jeedom

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.

Pas d’événement la dessus… On ne sait pas ce qui a été changé. Inutile dans ce cas.

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();
		}
		if (method_exists($object, 'setChanged')) {
			$object->setChanged(false);
		}
		return (null !== $res && false !== $res);
	}

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.

J’ai regardé en détail et dans MyModbus, l’envoi de la configuration est faite dans postAjax(), en déplaçant ça dans postSave() ça fonctionne.

Merci d’avoir insisté, ça m’a permis que je me pose la question.

@Marcp30 : correctif disponible dans la prochaine bêta.

2 « J'aime »

Bonjour

Donc pour l’instant je ne touche à rien et j’attends la beta.

Est ce que je passe en solution?

Merci à vous deux @Noyax37.
:+1: :clap:

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.

Ok je la testerai à partir de demain, et je te ferai un retex. Merci cette amélioration.
Bonne soirée

Bonjour

A priori cela fonction chez moi, plus d’erreur sur équipement désactivé.
Merci pour boulot. :clap:

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
1 « J'aime »

Super, bravo @Michel_F :+1:

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

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;
  }

Oui, absolument

1 « J'aime »

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.