Perte de données avec plugin Jeelink

Ayant plusieurs jeedoms en exploitation, j’ai réalisé un superviseur également avec jeedom me permettant de visualiser rapidement leur état de santé et en particulier si leur liaison avec l’internet était opérationnelle. Pour cela, j’ai réalisé le dispositif « ping – pong » suivant :

  • Le superviseur contient un virtuel binaire « Test Link xx » (état + commandes ON et OFF) par jeedom à surveiller.
  • Ce virtuel « Test Link xx » est « copié » du superviseur (jeedom source) vers chaque jeedom cible grâce à Jeelink.
  • 4 fois par heure à heure fixe mais à raison d’une seule jeedom à la fois, un scénario du superviseur exécute la commande ON sur ce virtuel. C’est le ping !
  • La jeedom cible dispose d’un scénario qui est réveillé par tout changement de l’état du virtuel « Test Link xx ». Si le nouvel état est un 1, le scénario effectue une remise à zéro de celui-ci une minute plus tard (instruction « dans 1 minute… ») par une commande OFF de ce même virtuel. C’est le pong !
  • 15 minutes après la commande ON, le scénario du superviseur s’assure que l’état du virtuel est bien à 0 avant de le remettre à 1 pour repartir dans un nouveau cycle. Si la jeedom cible n’a pas remis « Test Link xx » à 0 suite à un dysfonctionnement de celle-ci ou de la liaison internet, un compteur d’erreur est incrémenté par le superviseur et après plusieurs occurrences consécutives, une alarme « Liaison Jeedom xx interrompue » m’est envoyée grâce au plugin Telegram.

Globalement, ce dispositif fonctionne bien et ainsi 15 jeedoms cibles sont surveillées en permanence à distance. Le dispositif est certes lent mais bien suffisant pour mes besoins. J’ai toutefois constaté que de temps en temps, un « ping-pong » n’aboutit pas (voir chronogrammes). J’ai analysé ce petit problème en détail en pensant que celui-ci était dû à la qualité de certaines de ces liaisons internet, en particulier celles utilisant le réseau mobile. Or, il n’en est rien puisque le problème affecte toutes les jeedoms cibles de manière aléatoire mais plusieurs fois par jour. Parfois la commande ON n’est pas reçue par la cible et, parfois, c’est la commande OFF qui n’est pas reçue par la source. Côté superviseur, le réseau intranet/internet auquel est raccordé le superviseur ne peut pas être mis en cause car, en raccordant le superviseur directement sur un routeur 4G, le problème perdure. Le matériel du superviseur est un RPi 3B+ avec SSD construit avec la dernière image officielle Jeedom et un minimum de plugins (Virtuel, Telegram, Monitoring, Jeelink, OpenVPN) et sans Z-Wave. Santé Jeedom OK, rien dans les logfiles, Jeedom en V4.2.14, plugins à jour, charge système 0.2…0.3.

Les logfiles ci-dessous fournis par les scénarios Ping xx (jeedom source) et Pong (jeedom cible) montrent que les commandes ON, respectivement OFF sont émises mais que, par exemple, celle de 4h55’ n’arrive pas à destination. Aussi, j’en arrive à mes questions : est-il possible que Jeelink soit la cause de ce problème ? Est-ce une hérésie d’effectuer une commande OFF d’un virtuel placé dans la jeedom source, ceci depuis la jeedom cible ? Le cron de ce plugin peut-il être en cause et comment ces crons fonctionnent-ils dans le cadre des plugins (on en parle peu hormis pour un réveil préprogrammé d’un scénario) ?

D’avance merci de votre aide !


Le log du scénario Ping (Jeedom Source), mes commentaires après la ligne ---------------

------------------------------------  A 4h40’, la commande OFF précédente est arrivée (Etat à 0), r.a.z. compteur d’erreur puis génération d’une nouvelle commande ON
[2022-04-25 04:40:03][SCENARIO] Start : Scenario execute automatiquement sur programmation.
[2022-04-25 04:40:03][SCENARIO] Exécution du sous-élément de type [condition] : if #[Superviseur][Box sous contrôle][Surv_SurLesRues]# == 1
[2022-04-25 04:40:03][SCENARIO] Evaluation de la condition : [1 == 1] = Vrai
[2022-04-25 04:40:03][SCENARIO] Exécution du sous-élément de type [action] : then
[2022-04-25 04:40:03][SCENARIO] Exécution d'un bloc élément : 76
[2022-04-25 04:40:03][SCENARIO] Exécution du sous-élément de type [condition] : if #[Superviseur][Test Link Sur les Rues][Etat]# == 1  
[2022-04-25 04:40:03][SCENARIO] Evaluation de la condition : [0 == 1  ] = Faux
[2022-04-25 04:40:03][SCENARIO] Exécution du sous-élément de type [action] : else
[2022-04-25 04:40:03][SCENARIO] Exécution d'un bloc élément : 79
[2022-04-25 04:40:03][SCENARIO] Exécution du sous-élément de type [condition] : if #[Superviseur][Test Link Sur les Rues][EC]# > variable(Nb_Ping)
[2022-04-25 04:40:03][SCENARIO] Evaluation de la condition : [1 > 12] = Faux
[2022-04-25 04:40:03][SCENARIO] Exécution du sous-élément de type [action] : else
[2022-04-25 04:40:03][SCENARIO] Exécution de la commande [Superviseur][Test Link Sur les Rues][Reset EC]
[2022-04-25 04:40:04][SCENARIO] Exécution de la commande [Superviseur][Test Link Sur les Rues][ON]
[2022-04-25 04:40:04][SCENARIO] Fin correcte du scénario
------------------------------------ A 4h55’, la commande OFF de 4h41’ est arrivée (Etat à 0), r.a.z. compteur d’erreur puis génération d’une nouvelle commande ON
[2022-04-25 04:55:03][SCENARIO] Start : Scenario execute automatiquement sur programmation.
[2022-04-25 04:55:03][SCENARIO] Exécution du sous-élément de type [condition] : if #[Superviseur][Box sous contrôle][Surv_SurLesRues]# == 1
[2022-04-25 04:55:03][SCENARIO] Evaluation de la condition : [1 == 1] = Vrai
[2022-04-25 04:55:03][SCENARIO] Exécution du sous-élément de type [action] : then
[2022-04-25 04:55:03][SCENARIO] Exécution d'un bloc élément : 76
[2022-04-25 04:55:03][SCENARIO] Exécution du sous-élément de type [condition] : if #[Superviseur][Test Link Sur les Rues][Etat]# == 1  
[2022-04-25 04:55:03][SCENARIO] Evaluation de la condition : [0 == 1  ] = Faux
[2022-04-25 04:55:03][SCENARIO] Exécution du sous-élément de type [action] : else
[2022-04-25 04:55:03][SCENARIO] Exécution d'un bloc élément : 79
[2022-04-25 04:55:03][SCENARIO] Exécution du sous-élément de type [condition] : if #[Superviseur][Test Link Sur les Rues][EC]# > variable(Nb_Ping)
[2022-04-25 04:55:03][SCENARIO] Evaluation de la condition : [0 > 12] = Faux
[2022-04-25 04:55:03][SCENARIO] Exécution du sous-élément de type [action] : else
[2022-04-25 04:55:03][SCENARIO] Exécution de la commande [Superviseur][Test Link Sur les Rues][Reset EC]
[2022-04-25 04:55:04][SCENARIO] Exécution de la commande [Superviseur][Test Link Sur les Rues][ON]
[2022-04-25 04:55:04][SCENARIO] Fin correcte du scénario
------------------------------------ A 5h10’, pas reçu de commande OFF (Etat toujours à 1), increment compteur d’erreur puis génération d’une nouvelle commande ON
[2022-04-25 05:10:03][SCENARIO] Start : Scenario execute automatiquement sur programmation.
[2022-04-25 05:10:03][SCENARIO] Exécution du sous-élément de type [condition] : if #[Superviseur][Box sous contrôle][Surv_SurLesRues]# == 1
[2022-04-25 05:10:04][SCENARIO] Evaluation de la condition : [1 == 1] = Vrai
[2022-04-25 05:10:04][SCENARIO] Exécution du sous-élément de type [action] : then
[2022-04-25 05:10:04][SCENARIO] Exécution d'un bloc élément : 76
[2022-04-25 05:10:04][SCENARIO] Exécution du sous-élément de type [condition] : if #[Superviseur][Test Link Sur les Rues][Etat]# == 1  
[2022-04-25 05:10:04][SCENARIO] Evaluation de la condition : [1 == 1  ] = Vrai
[2022-04-25 05:10:04][SCENARIO] Exécution du sous-élément de type [action] : then
[2022-04-25 05:10:04][SCENARIO] Exécution de la commande [Superviseur][Test Link Sur les Rues][Incr EC]
[2022-04-25 05:10:04][SCENARIO] Exécution de la commande [Superviseur][Test Link Sur les Rues][OFF]
[2022-04-25 05:10:04][SCENARIO] Pause de 15 seconde(s)
[2022-04-25 05:10:19][SCENARIO] Exécution de la commande [Superviseur][Test Link Sur les Rues][ON]
[2022-04-25 05:10:20][SCENARIO] Exécution d'un bloc élément : 77
[2022-04-25 05:10:20][SCENARIO] Exécution du sous-élément de type [condition] : if #[Superviseur][Test Link Sur les Rues][EC]# > variable(Nb_Ping)
[2022-04-25 05:10:20][SCENARIO] Evaluation de la condition : [1 > 12] = Faux
[2022-04-25 05:10:20][SCENARIO] Exécution du sous-élément de type [action] : else
[2022-04-25 05:10:20][SCENARIO] Exécution d'un bloc élément : 117
[2022-04-25 05:10:20][SCENARIO] Exécution du sous-élément de type [condition] : if #[Superviseur][Test Link Sur les Rues][EC]# > #[Superviseur][Test Link Sur les Rues][MaxEC]#  
[2022-04-25 05:10:20][SCENARIO] Evaluation de la condition : [1 > 1  ] = Faux
[2022-04-25 05:10:20][SCENARIO] Exécution du sous-élément de type [action] : else
[2022-04-25 05:10:20][SCENARIO] Fin correcte du scénario
------------------------------------ A 5h25’, la commande OFF de 5h11’ est arrivée (Etat à 0), r.a.z. compteur d’erreur puis génération d’une nouvelle commande ON
[2022-04-25 05:25:03][SCENARIO] Start : Scenario execute automatiquement sur programmation.
[2022-04-25 05:25:03][SCENARIO] Exécution du sous-élément de type [condition] : if #[Superviseur][Box sous contrôle][Surv_SurLesRues]# == 1
[2022-04-25 05:25:03][SCENARIO] Evaluation de la condition : [1 == 1] = Vrai
[2022-04-25 05:25:03][SCENARIO] Exécution du sous-élément de type [action] : then
[2022-04-25 05:25:03][SCENARIO] Exécution d'un bloc élément : 76
[2022-04-25 05:25:03][SCENARIO] Exécution du sous-élément de type [condition] : if #[Superviseur][Test Link Sur les Rues][Etat]# == 1  
[2022-04-25 05:25:03][SCENARIO] Evaluation de la condition : [0 == 1  ] = Faux
[2022-04-25 05:25:03][SCENARIO] Exécution du sous-élément de type [action] : else
[2022-04-25 05:25:03][SCENARIO] Exécution d'un bloc élément : 79
[2022-04-25 05:25:03][SCENARIO] Exécution du sous-élément de type [condition] : if #[Superviseur][Test Link Sur les Rues][EC]# > variable(Nb_Ping)
[2022-04-25 05:25:03][SCENARIO] Evaluation de la condition : [1 > 12] = Faux
[2022-04-25 05:25:03][SCENARIO] Exécution du sous-élément de type [action] : else
[2022-04-25 05:25:03][SCENARIO] Exécution de la commande [Superviseur][Test Link Sur les Rues][Reset EC]
[2022-04-25 05:25:03][SCENARIO] Exécution de la commande [Superviseur][Test Link Sur les Rues][ON]
[2022-04-25 05:25:04][SCENARIO] Fin correcte du scénario

Et le log du scénario Pong (Jeedom Cible), mes commentaires après la ligne ---------------


------------------------------------ Réception correcte à 4h40’ (Etat=1)
[2022-04-25 04:40:05][SCENARIO] Start : Scenario execute automatiquement sur evenement venant de : [Sur les Rues][Test Link Sur les Rues][Etat] (1).
[2022-04-25 04:40:05][SCENARIO] Exécution du sous-élément de type [condition] : if #[Sur les Rues][Test Link Sur les Rues][Etat]# == 1  
[2022-04-25 04:40:05][SCENARIO] Evaluation de la condition : [1 == 1  ] = Vrai
[2022-04-25 04:40:05][SCENARIO] Exécution du sous-élément de type [action] : then
[2022-04-25 04:40:05][SCENARIO] Exécution d'un bloc élément : 77
[2022-04-25 04:40:05][SCENARIO] Exécution du sous-élément de type [condition] : in 1
[2022-04-25 04:40:05][SCENARIO] Evaluation de la condition : [1] = 1
[2022-04-25 04:40:05][SCENARIO] Tâche : 77 programmée à : 2022-04-25 04:41:05 (+ 1 min)
[2022-04-25 04:40:05][SCENARIO] Fin correcte du scénario
------------------------------------ Commande OFF une minute plus tard
[2022-04-25 04:41:03][SCENARIO] ************Lancement sous tâche**************
[2022-04-25 04:41:05][SCENARIO] Exécution du sous-élément de type [action] : do
[2022-04-25 04:41:05][SCENARIO] Exécution de la commande [Sur les Rues][Test Link Sur les Rues][OFF]
[2022-04-25 04:41:05][SCENARIO] ************FIN sous tâche**************
------------------------------------ Réception de la rétro-signalisation de la commande OFF, il ne se passera rien car Etat = 0
[2022-04-25 04:41:06][SCENARIO] Start : Scenario execute automatiquement sur evenement venant de : [Sur les Rues][Test Link Sur les Rues][Etat] (0).
[2022-04-25 04:41:06][SCENARIO] Exécution du sous-élément de type [condition] : if #[Sur les Rues][Test Link Sur les Rues][Etat]# == 1  
[2022-04-25 04:41:06][SCENARIO] Evaluation de la condition : [0 == 1  ] = Faux
[2022-04-25 04:41:06][SCENARIO] Exécution du sous-élément de type [action] : else
[2022-04-25 04:41:06][SCENARIO] Fin correcte du scénario
------------------------------------ Rien reçu à 4h55’   !!! ……. Réception correcte à 5h10’ (Etat=1)
[2022-04-25 05:10:20][SCENARIO] Start : Scenario execute automatiquement sur evenement venant de : [Sur les Rues][Test Link Sur les Rues][Etat] (1).
[2022-04-25 05:10:20][SCENARIO] Exécution du sous-élément de type [condition] : if #[Sur les Rues][Test Link Sur les Rues][Etat]# == 1  
[2022-04-25 05:10:20][SCENARIO] Evaluation de la condition : [1 == 1  ] = Vrai
[2022-04-25 05:10:20][SCENARIO] Exécution du sous-élément de type [action] : then
[2022-04-25 05:10:20][SCENARIO] Exécution d'un bloc élément : 77
[2022-04-25 05:10:20][SCENARIO] Exécution du sous-élément de type [condition] : in 1
[2022-04-25 05:10:20][SCENARIO] Evaluation de la condition : [1] = 1
[2022-04-25 05:10:20][SCENARIO] Tâche : 77 programmée à : 2022-04-25 05:11:20 (+ 1 min)
[2022-04-25 05:10:20][SCENARIO] Fin correcte du scénario
------------------------------------ Commande OFF une minute plus tard
[2022-04-25 05:11:03][SCENARIO] ************Lancement sous tâche**************
[2022-04-25 05:11:20][SCENARIO] Exécution du sous-élément de type [action] : do
[2022-04-25 05:11:20][SCENARIO] Exécution de la commande [Sur les Rues][Test Link Sur les Rues][OFF]
[2022-04-25 05:11:21][SCENARIO] ************FIN sous tâche**************
------------------------------------ Réception de la rétro-signalisation de la commande OFF, il ne se passera rien car Etat = 0
[2022-04-25 05:11:21][SCENARIO] Start : Scenario execute automatiquement sur evenement venant de : [Sur les Rues][Test Link Sur les Rues][Etat] (0).
[2022-04-25 05:11:21][SCENARIO] Exécution du sous-élément de type [condition] : if #[Sur les Rues][Test Link Sur les Rues][Etat]# == 1  
[2022-04-25 05:11:21][SCENARIO] Evaluation de la condition : [0 == 1  ] = Faux
[2022-04-25 05:11:21][SCENARIO] Exécution du sous-élément de type [action] : else
[2022-04-25 05:11:21][SCENARIO] Fin correcte du scénario
------------------------------------ Réception correcte à 5h25’ (Etat=1)
[2022-04-25 05:25:04][SCENARIO] Start : Scenario execute automatiquement sur evenement venant de : [Sur les Rues][Test Link Sur les Rues][Etat] (1).
[2022-04-25 05:25:04][SCENARIO] Exécution du sous-élément de type [condition] : if #[Sur les Rues][Test Link Sur les Rues][Etat]# == 1  
[2022-04-25 05:25:04][SCENARIO] Evaluation de la condition : [1 == 1  ] = Vrai
[2022-04-25 05:25:04][SCENARIO] Exécution du sous-élément de type [action] : then
[2022-04-25 05:25:04][SCENARIO] Exécution d'un bloc élément : 77
[2022-04-25 05:25:04][SCENARIO] Exécution du sous-élément de type [condition] : in 1
[2022-04-25 05:25:04][SCENARIO] Evaluation de la condition : [1] = 1
[2022-04-25 05:25:04][SCENARIO] Tâche : 77 programmée à : 2022-04-25 05:26:04 (+ 1 min)
[2022-04-25 05:25:04][SCENARIO] Fin correcte du scénario
------------------------------------ Commande OFF une minute plus tard
[2022-04-25 05:26:03][SCENARIO] ************Lancement sous tâche**************
[2022-04-25 05:26:04][SCENARIO] Exécution du sous-élément de type [action] : do
[2022-04-25 05:26:04][SCENARIO] Exécution de la commande [Sur les Rues][Test Link Sur les Rues][OFF]
[2022-04-25 05:26:05][SCENARIO] ************FIN sous tâche**************
------------------------------------ Réception de la rétro-signalisation de la commande OFF, il ne se passera rien car Etat = 0
[2022-04-25 05:26:05][SCENARIO] Start : Scenario execute automatiquement sur evenement venant de : [Sur les Rues][Test Link Sur les Rues][Etat] (0).
[2022-04-25 05:26:05][SCENARIO] Exécution du sous-élément de type [condition] : if #[Sur les Rues][Test Link Sur les Rues][Etat]# == 1  
[2022-04-25 05:26:05][SCENARIO] Evaluation de la condition : [0 == 1  ] = Faux
[2022-04-25 05:26:05][SCENARIO] Exécution du sous-élément de type [action] : else
[2022-04-25 05:26:05][SCENARIO] Fin correcte du scénario
------------------------------------

J’ai transmis le problème au support.

Pour mieux leur communiquer celui-ci, j’ai préparé ce matin 2 autres jeedoms avec les versions à jour du core et des plugins (V4.2.15, image du 1.5.22 pour le RPi). Il y a un minimum de plugins tant sur la source (un raspberry pi3B+) que sur la cible (une Smart). Les 2 sont reliées en local via un simple switch pour éviter tout doute sur le fonctionnement du réseau internet.

J’ai créé dans la jeedom source (Test) un simple virtuel intitulé « Oscillateur » dont l’état logique est modifié par un scénario chaque 5 minutes. Ce virtuel est transmis à la cible (Secours) par Jeelink.

Les images ci-dessous sont claires !
Wait & see !

Jeedom source :

Jeedom cible :

Grâce à l’aide de @Loic et après 3 jours de tests autour de 2 jeedoms montées à cet effet, la cause du problème est désormais connue ! Aucun souci pour réaliser un transfert via jeelink entre 2 jeedoms si elles sont sur le même réseau ethernet (interne). Par contre, l’utilisation de l’adresse DNS fournie par Jeedom pour l’adresse de la cible dans les paramètres du jeelink source crée des problèmes fréquents comme présentés ci-dessus (plusieurs pertes d’information par heure). @Loic n’a malheureusement pas de solution pour améliorer la fiabilité de ces transferts « extra-muros ».

Il existe cependant 2 work-arounds que j’ai testé :

    1. Mettre la jeedom cible dans un réseau disposant d’une adresse IP fixe. Certes, une adresse de ce type ne court pas les rues mais j’ai heureusement pu tester cette solution en squattant le réseau d’un ami. Aucune perte d’information n’a été détectée durant un test de plusieurs heures. J’ai utilisé un port libre du routeur cible pour augmenter la sécurité.
    1. Utiliser le service DNS d’un autre prestataire. Grâce à un hostname gratuit fourni par noip.com ainsi que le plugin dyndns installé dans la jeedom cible, j’ai également constaté que le transfert via jeelink est également exempt de toute lacune durant plusieurs heures.

Donc, Jeelink fonctionne bien mais implique pour le moment un work-around si le transfert concerne 2 jeedoms placés dans des réseaux différents. Et plus aucun Error code 2 : Vous n'êtes pas autorisé à effectuer cette action que plusieurs parmi vous ont signalé.

Qu’on se le dise et merci @Loic

1 « J'aime »

Bonsoir,
Cool si le problème a été détecté, j’ai plus qu’a supprimer mon debugg,

car je ne détectai aucun soucis de mon coté (tout en local).

1 « J'aime »

Grosse déception après 1 jour de test pour des liaisons jeelink hors réseau local malgré un superviseur placé sur une adresse ip statique ! 1 test par quart d’heure vers 15 jeedoms distantes, de manière asynchrone. J’ai malheureusement encore constaté des pertes d’information entre 9 des 15 jeedoms distantes et le superviseur !

Globalement, il y a une amélioration de la qualité des transmissions avec ce passage du superviseur en ip fixe par rapport à un superviseur sur une adresse DNS xxxxxx.eu.jeedom.link mais ce n’est pas encore satisfaisant. Pour les 6 jeedoms qui bénéficient d’une liaison parfaite, je n’ai pas (pas encore?) réussi à trouver ce qui les différencie des 9 « moutons noirs »…

Je poursuis mes investigations !

Par contre et comme aussi constaté par @Phpvarious, aucune perte lorsque la cible et la source sont dans le même réseau local.

1 « J'aime »

Résultat de mes investigations : tout comme l’utilisation d’une adresse IP publique pour la cible, l’utilisation d’une adresse DNS gratuite (noip.com) résout actuellement TOUS les problèmes contrairement à une adresse DNS « officielle » Jeedom (xxxxxx.eu.jeedom.link) ! Les erreurs relevées dans mon précédent post étaient dues à un oubli de ma part dans mon « ping-pong » entre 2 jeedoms… Comme chaque jeedom était à la fois source et cible, il fallait utiliser des DNS noip.com dans les 2 jeedoms (variante : une adresse IP publique d’un côté et une adresse DNS noip.com de l’autre) …

J’ai également testé l’envoi d’une valeur numérique dans les 2 sens (source sur jeedom A → cible sur jeedom B et, en parallèle, source sur jeedom B → cible sur jeedom A), même conclusion POSITIVE : Pour l’instant et selon mes essais, l’utilisation des DNS gratuits noip.com est LA solution pour utiliser le plugin Jeelink entre 2 jeedoms distantes et ne pas perdre d’informations.

Espérons que @Loic et son équipe trouvent une solution « maison » …

Le problème ayant une solution, je ferme ce post !

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