[Tuto] Gestion automatique de sonde en cas de defaillance

Bonjour,

Il commence a refaire froid, et mon chauffage s’est remis en route, globalement je suis satisfait du plugin thermostat, mais à chaque hiver mon soucis récurent est une sonde qui de temps autre n’est pas fiable.

Cette sonde est dans une pièce éloignée de ma clé Bluetooth et la configuration des murs fait que de temps en temps (perte pendant 5-8h tous les 1-2 mois) la sonde ne communique plus avec mon Jeedom.

Mis à part le fait que de recevoir des SMS d’alerte régulier (de 20 minutes a 1h30 toute la nuit) de Jeedom pour me dire que ma sonde ne fonctionne plus qui ne me fait pas rêver, le souci est que cette pièce est celle de ma fille de 5 ans, et savoir qu’elle n’as pas de chauffage pendant une nuit (dans une extension qui refroidi assez vite) est pour moi inconservable.

Donc il y a peu et j’ai voulu solutionner ce soucis et l’optimisé pour que tout soit automatique.

1. Créer un virtuel :

C’est un simple interrupteur virtuel classique, mais indispensable. Et oui c’est bête mais il n’est pas possible d’exécuter un scenario dans les actions des défaillances du plugin thermostat, alors le scenario sera déclenché par cet interrupteur.

Veillez a bien configurer également les valeur de répétions de la commande info

image

Cela permettra de pouvoir relancer le scénario quand que la défaillance est présente.

2. Changer l’action de le plugin :

Hophophop on vite ces annonces SMS qui empêche de dormir !!!

3. Le scénario :

  • Paramètres :

image
Le multi-lancement est obligatoire, il permettra au scénario de se relancer lui-même à la fin, pour pouvoir boucler tant que la défaillance est présente.

  • le scénario :

Pour faire au plus simple, toutes les 5 minutes je vais vérifier si j’ai retrouvé ma sonde, et tant que ce n’est pas le cas, j’utilise une sonde de secours (dans mon cas le capteur de la clim). Si ma sonde est de nouveau opérationnelle alors je rétabli la sonde initiale et je bascule mon interrupteur virtuel sur off.

J’ai commenté au maximum le scénario ce qui devrait limiter les explication :





Si vous souhaiter importer le scenario via un template :

defaillance sonde.txt (80,8 Ko)
(renommez le .txt en .json)

Finalement c’est plutôt simple, j’espère que cela vous servira :wink:

Ps : la partie en bloc code n’est pas de moi je l’ai trouvé sur le Community, mais impossible de retrouver l’auteur pour le citer, si vous reconnaissez nommer son auteur pour le remercier :stuck_out_tongue:

4 « J'aime »

Genial cet idée.
Il faudrait l’implémenter dans le plugin thermostat directement ?

C’est très bien ça merci encore !
Je vais faire ça aussi merci ·
J’aurai aimé un scénario avec une sonde virtuelle qui par exemple copierai les valeurs de la veille par exemple si nous n’avons pas de sonde de secours jusqu’au retour de la liaison . Qu’en penses-tu ?

1 « J'aime »

hello, merci.

Pour ta question je ne vois pas trop l’interet, autant mettre le thermostat en forcé, non ?

Apres avec une PAC, sur erreur, tu peux couper le thermostat et lancer une consigne sur la PAC, elle gèrera toute seul temporairement.

Moi je vais utiliser le capteur du moniteur de qualité d’air, ou recuperer la remperature des capteur d’ouverture des fenetres.

Bonsoir,
Beau tuto :wink:

En faite le plugin n’affiche pas l’icone de sélection, mais il est bien possible de lancer un scénario…

bien vu, je n’avais pas tenté de le taper manuellement !

mais du coup sans l’inter virtuel, mon scenario ne peut pas boucler, mais doit y avoir un autre moyen pour ca :slight_smile:

1 « J'aime »

Autre solution est de créer une info numérique virtuel, dans celui-ci :


calcul du mini entre les 2 sondes.

puis faire pointer le plugin thermostat sur ce virtuel.
pas de scénario …

oui c’est possible, mais ce n’est pas ce que je cherchais, mon capteur se « secours n’etant » pas forcement fiable

Sinon une fonction perso qui se charge de vérifier le collectDate et renvoie la valeur du 2ème équipement si le 1er est >300.

d’ailleurs ta suggestion avec min n’est pas fiable car si au final c’est celui qui a la température la plus basse qui bug, alors tu restera bloquer sur cette valeur

Bonsoir,
Je propose ce code a mettre dans user.function.class.php :


Code
public static function replaceEqIfTimeout($_cmdPrimary, $_cmdSecondary, $_timeout = 300) {
    $cmdPrimary = cmd::byId(trim(str_replace('#', '', cmd::humanReadableToCmd('#' . str_replace('#', '', $_cmdPrimary) . '#'))));
    $cmdSecondary = cmd::byId(trim(str_replace('#', '', cmd::humanReadableToCmd('#' . str_replace('#', '', $_cmdSecondary) . '#'))));
    $value = -100;
    if (is_object($cmdPrimary)) {
      if ($cmdPrimary->getType() == 'info' && $cmdPrimary->getSubType() == 'numeric') {
        $value = $cmdPrimary->execCmd();
        $timeoutPrimary = time() - strtotime($cmdPrimary->getCollectDate());
        if ($timeoutPrimary <= $_timeout) return $value;
        if (is_object($cmdSecondary)) {
          if ($cmdSecondary->getType() == 'info' && $cmdSecondary->getSubType() == 'numeric') {
            $timeoutSecondary = time() - strtotime($cmdSecondary->getCollectDate());
            if ($timeoutSecondary <= $_timeout || $timeoutPrimary > $timeoutSecondary) {
              $value = $cmdSecondary->execCmd();
            }
          }
        }
      }
    }
    return $value;
  }

Utilisation :

Création d’un virtuel avec une commande Info Numérique :

Ajouter cette fonction dans « Valeur » :
replaceEqIfTimeout(#[Objet][Température_Eq1][Température]#,#[Objet][Température_Eq2][Température]#,300)

Explication de la fonction :

  • dans cette fonction :
    #[Objet][Température_Eq1][Température]# a remplacer par votre équipement principal.
    #[Objet][Température_Eq2][Température]# à remplacer par votre équipement secondaire (secours).
    300 Valeur du timeout a partir de laquelle l’équipement principal est considéré comme HS.

Détail de fonctionnement :

Si l’équipement principale n’a pas communiqué depuis xxx secondes (300 pour l’exemple) c’est la valeur de l’équipement secondaire qui sera renvoyé, a condition que celle-ci ne soit pas aussi en timeout, auquel cas se sera la valeur de l’équipement qui a communiqué le dernier qui sera renvoyé.


Pour info :

  • si l’équipement principale existe pas ou n’est pas de type Info ni de sous type numérique, la valeur renvoyé sera -100.
  • si l’équipement secondaire existe pas ou n’est pas de type Info ni de sous type numérique, la valeur renvoyé sera celle de l’équipement principal.
1 « J'aime »

Bon c’est super frustrant quand quelqu’un viens te dire que ce que tu t’es fais chier a faire sert a a rien…

Mais vu la qualité de la réponse, obliger de s’incliner :sweat_smile:

je ferais malgré tout un petit scenario pour comparer la valeur de la function avec la valeur de la sonde pour ere informer que le backup a pris le relais.

Question : cette fonction survivra a une maj de Jeedom ? (edit : oui je viens de tester)

Tu devrais faire un PR et la proposer a l’ajout des fonction de Jeedom

Cc,
Je ne dis en aucun cas que ce que tu as fait ne sert a rien, la preuve tu l’utilise et je ne me permettrai pas.
Ce tuto m’a fait réfléchir, c’est une très bonne idée de pouvoir basculer sur un autre équipement automatiquement en cas de défaillance. Seul la méthode me convenait pas, car je trouve quelle n’est pas si simple a mettre en place, et qu’il faut adapter le scénario en conséquence, et en plus le scénario agit directement sur la config du plugin …
C’est pourquoi je me suis plutôt orienté sur une façon plus générique, qui peut être utilisé par d’autre plugin en même temps, et qui ne modifie pas la config du plugin.

Comme tu l’as constaté, cette fonction étant dans le fichier user.function.class.php, n’est donc pas altérées par les mise a jour du core.

C’est a mon sens, pas au core de gérer cette information, mais c’est bien a lui d’en informer l’user en cas de timeout, ce qu’il fait très bien. Par contre sa peut certainement être le rôle d’un plugin …

	2022-12-03 01:56:04	DaikinOnlineCtrl	
`Erreur sur DaikinOnlineCtrl::cron() : Exception Object ( [message:protected] => [MySQL] Error code : 40001 (1213). Deadlock found when trying to get lock; try restarting transaction : REPLACE INTO history SET cmd_id=:cmd_id, `datetime`=:datetime, value=:value [string:Exception:private] => [code:protected] => 0 [file:protected] => /var/www/html/core/class/DB.class.php [line:protected] => 102 [trace:Exception:private] => Array ( [0] => Array ( [file] => /var/www/html/core/class/history.class.php [line] => 990 [function] => Prepare [class] => DB [type] => :: [args] => Array ( [0] => REPLACE INTO history SET cmd_id=:cmd_id, `datetime`=:datetime, value=:value [1] => Array ( [cmd_id] => 23963 [datetime] => 2022-12-03 01:55:00 [value] => 20.59375 ) [2] => 0 ) ) [1] => Array ( [file] => /var/www/html/core/class/cmd.class.php [line] => 2296 [function] => save [class] => history [type] => -> [args] => Array ( [0] => virtualCmd Object ( [id:protected] => 23963 [logicalId:protected] => [generic_type:protected] => [eqType:protected] => virtual [name:protected] => Océane [order:protected] => 0 [type:protected] => info [subType:protected] => numeric [eqLogic_id:protected] => 1397 [isHistorized:protected] => 1 [unite:protected] => [configuration:protected] => Array ( [calcul] => replaceEqIfTimeout(#7267#,#1637#,500) [returnStateValue] => [returnStateTime] => [updateCmdId] => [minValue] => [maxValue] => ) [template:protected] => {"dashboard":"core::default","mobile":"core::default"} [display:protected] => {"icon":"","invertBinary":"0"} [value:protected] => #7267##1637# [isVisible:protected] => 1 [alert:protected] => [] [_collectDate:protected] => 2022-12-03 01:56:04 [_valueDate:protected] => 2022-12-03 01:55:21 [_eqLogic:protected] => virtual Object ( [id:protected] => 1397 [name:protected] => températures [logicalId:protected] => [generic_type:protected] => [object_id:protected] => 1 [eqType_name:protected] => virtual [isVisible:protected] => 0 [isEnable:protected] => 1 [configuration:protected] => {"createtime":"2022-11-09 11:03:43","autorefresh":"","updatetime":"2022-11-11 17:04:45"} [timeout:protected] => [category:protected] => {"heating":"0","security":"0","energy":"0","light":"0","opening":"0","automatism":"0","multimedia":"0","default":"0"} [display:protected] => {"backGraph::info":0} [order:protected] => 9999 [comment:protected] => [tags:protected] => [_debug:protected] => [_object:protected] => jeeObject Object ( [id:protected] => 1 [name:protected] => Maison [father_id:protected] => [isVisible:protected] => 1 [position:protected] => [configuration:protected] => {"parentNumber":0,"tagColor":"#000000","tagTextColor":"#FFFFFF","mobile::summaryTextColor":"","icon":"","summary":""} [display:protected] => {"icon":"","sendToApp":"1"} [image:protected] => {"type":"jpg","sha512":"b046d42faf919b0b98ddec6c1ff242887fba0c733db4cc5a5bdcc16b53cae19cb0d9007959abd385c98ee6db9025bc988d648c24bff1ebd7a3813bd397a27502"} [_child:protected] => Array ( ) [_changed:protected] => [_summaryChanged:protected] => ) [_needRefreshWidget:protected] => [_timeoutUpdated:protected] => [_batteryUpdated:protected] => [_changed:protected] => ) [_needRefreshWidget:protected] => [_needRefreshAlert:protected] => [_changed:protected] => ) ) ) [2] => Array ( [file] => /var/www/html/core/class/cmd.class.php [line] => 1734 [function] => addHistoryValue [class] => cmd [type] => -> [args] => Array ( [0] => 20.6 [1] => 2022-12-03 01:56:04 ) ) [3] => Array ( [file] => /var/www/html/core/class/cmd.class.php [line] => 1762 [function] => event [class] => cmd [type] => -> [args] => Array ( [0] => 20.6 [1] => [2] => 2 ) ) [4] => Array ( [file] => /var/www/html/plugins/DaikinOnlineCtrl/core/class/DaikinOnlineCtrl.class.php [line] => 890 [function] => event [class] => cmd [type] => -> [args] => Array ( [0] => 24 ) ) [5] => Array ( [file] => /var/www/html/plugins/DaikinOnlineCtrl/core/class/DaikinOnlineCtrl.class.php [line] => 821 [function] => DOCUpdateCmd [class] => DaikinOnlineCtrl [type] => -> [args] => Array ( [0] => gsi ) ) [6] => Array ( [file] => /var/www/html/plugins/DaikinOnlineCtrl/core/class/DaikinOnlineCtrl.class.php [line] => 197 [function] => synchronize [class] => DaikinOnlineCtrl [type] => -> [args] => Array ( [0] => Array ( [0] => gsi [1] => gci ) ) ) [7] => Array ( [file] => /var/www/html/core/php/jeeCron.php [line] => 78 [function] => cron [class] => DaikinOnlineCtrl [type] => :: [args] => Array ( ) ) ) [previous:Exception:private] => )`

J’ai un soucis assez étrange avec ta fonction, comment peut-elle générer une erreur dans le plugin de ma clim ?

Bonjour,
J’y vais aussi avec ma méthode (sans code).

  1. J’ai un virtuel qui me donne l’état de chaque sonde :

  2. Pour les endroits où je peux avoir une sonde de secours, je fais un virtuel (exemple avec la T° extérieure)


    Et c’est ce virtuel que j’utilise dans le plugin thermostat.

Dans cet exemple, si la sonde jardin est ko, je bascule sur la sonde de la terrasse et si elle aussi est ko, je bascule sur le plugin météo

1 « J'aime »

Salut, alors la j’en est aucune idée, l’info est historisé ?

oui elle est historisé, les commande en individuels et la commande virtuel avec ta fonction