Pour ceux qui ne connaissent pas bien les Shellies ou le plugin-jmqtt ou les deux, il est conseillé de commencer par le tuto de @bronche :
Avec les mises à jour du firmware des Shellies qui sont assez fréquentes en ce moment, il devient vite fastidieux de faire cette mise à jour via leur interface web.
Ce tuto permet donc d’automatiser ces mises à jour et par la même occasion de monitorer la mise à disposition d’un nouveau firmware.
Ceci sera réalisé à l’aide du plugin-jmqtt de @domotruc.
Le résultat permettra d’obtenir une commande action « MAJ Firmware » pour effectuer la mise à jour du firmware de chaque Shelly.
L’automatisation pourrait être poussée à l’extrême via un scénario, elle ne sera pas proposée dans ce tutoriel. Personnellement, je préfère choisir si je dois ou pas faire la mise à jour et le moment pour le faire.
La commande action « Annonce » permet d’envoyer une demande au Shelly qui va répondre en donnant son ID, sa MAC, son IP, sa version du firmware et si une mise à jour est disponible.
La difficulté, c’est que cette réponse est envoyée sur un topic unique, quel que soit le Shelly qui répond.
Il faut donc créer un équipement jMQTT avec une commande info de ce type :
Je l’ai nommé : #[Shellies Administration][Shellies Annonces][Annonce]#
Sur le même équipement, une commande action générale « CMD Annonce » permet d’interroger tous les Shellies du réseau en même temps :
Maintenant, sur chaque équipement Shelly existant, il va falloir ajouter 2 commandes Action (Annonce et MAJ Firmware) et 5 commandes Info (ID, MAC, IP, Firmware et MAJ Dispo).
Lors de la création des commandes Info, un message d’alerte apparaît :
C’est normal puisqu’aucun Topic n’est renseigné. La mise à jour des valeurs se fera par un scénario.
Afin de pouvoir relier, le retour des annonces au bon équipement, dans chaque équipement Shelly, dans Configuration de l’équipement, onglet Commentaire (comment), on indique l’adresse MAC du Shelly.
Enfin, le scénario qui va gérer l’affichage des widgets de nos Shellies et avertir d’un nouveau firmware dans le Centre de message. Il est à noter que les commandes Action « CMD Annonce » et « Annonce » n’ont pas besoin d’être lancées pour connaître la mise à disposition d’un nouveau firmware, chaque Shelly s’en charge automatiquement en temps réel.
C’est un scénario avec les options Multi-lancement, Synchrone et provoqué, et comme déclencheur #[Shellies Administration][Shellies Annonces][Annonce]#.
Le scénario ne contient qu’un bloc code :
$trigger = cmd::cmdToHumanReadable($scenario->getRealTrigger());
$scenario->setLog('Trigger : ' . $trigger);
$cmd = cmd::byString($trigger);
$value = $cmd->execCmd();
$scenario->setLog('Valeur : ' . $value);
$jsonShelly = json_decode($value,true);
$id = $jsonShelly[id];
$scenario->setLog('ID : ' . $id);
$mac = $jsonShelly[mac];
$scenario->setLog('MAC : ' . $mac);
$ip = $jsonShelly[ip];
$scenario->setLog('IP : ' . $ip);
$fw_ver = $jsonShelly[fw_ver];
$fw_ver = substr($fw_ver,0,strpos($fw_ver,'-')) . substr($fw_ver,strpos($fw_ver,'/'),strpos($fw_ver,'@')-strpos($fw_ver,'/'));
$scenario->setLog('FW_VER : ' . $fw_ver);
$new_fw = $jsonShelly[new_fw];
$source = 'Scénario ' . $scenario->getHumanName() . ' ' . $id;
if ($new_fw) {
$new_fw_txt = 'Oui';
// Ajout d'un message dans le Centre de Message
message::add($source,$fw_ver,'Nouveau firmware disponible - Mettre à jour le firmware');
} else {
$new_fw_txt = 'Non';
// Retrait d'un message dans le Centre de Message
message::removeAll($source);
}
$scenario->setLog('NEW_FW : ' . $new_fw_txt);
$shellies = eqLogic::byType('jMQTT');
foreach ($shellies as $shelly) {
$eqLogicMac = $shelly->getComment();
if ($mac === $eqLogicMac) {
$scenario->setLog('Adresse MAC : ' . $eqLogicMac);
$eqLogicName = $shelly->getHumanName();
$scenario->setLog('Nom : ' . $eqLogicName);
cmd::byString('#' . $eqLogicName . '[ID]#')->event($id);
cmd::byString('#' . $eqLogicName . '[MAC]#')->event($mac);
cmd::byString('#' . $eqLogicName . '[IP]#')->event($ip);
cmd::byString('#' . $eqLogicName . '[Firmware]#')->event($fw_ver);
$cmdMajDispo = cmd::byString('#' . $eqLogicName . '[MAJ Dispo]#');
$cmdMajDispo->event($new_fw_txt);
$cmdMajFirmware = cmd::byString('#' . $eqLogicName . '[MAJ Firmware]#');
if ($new_fw) {
$scenario->setLog('Visible OUI');
$cmdMajDispo->setIsVisible(0)->save();
$cmdMajFirmware->setIsVisible(1)->save();
} else {
$scenario->setLog('Visible NON');
$cmdMajDispo->setIsVisible(1)->save();
$cmdMajFirmware->setIsVisible(0)->save();
}
}
}