Plugin jMQTT
Re: Plugin jMQTT
Bonjour Vincnet68,
C'est donc jMQTT qui est en retard. As-tu toutefois essayé de désactiver le mode synchrone dans le scénario?
Sur quel PI / version de debian tournes tu?
C'est donc jMQTT qui est en retard. As-tu toutefois essayé de désactiver le mode synchrone dans le scénario?
Sur quel PI / version de debian tournes tu?
Re: Plugin jMQTT
Bonjour domotruc,
C'est justement parce que j'avais des temps de réaction long que j'ai activé le monde synchrone (j'ai vu cela quelque part sur le forum).
Je suis sous RPI3 avec disque externe
Version : raspberrypi 4.9.35-v7+ #1014 SMP Fri Jun 30 14:47:43
Voici le monitoring à l'instant où j'écris : Merci de ton aide
Vincnet68
C'est justement parce que j'avais des temps de réaction long que j'ai activé le monde synchrone (j'ai vu cela quelque part sur le forum).
Je suis sous RPI3 avec disque externe
Version : raspberrypi 4.9.35-v7+ #1014 SMP Fri Jun 30 14:47:43
Voici le monitoring à l'instant où j'écris : Merci de ton aide
Vincnet68
Re: Plugin jMQTT
Je vais me monter une conf de test sur RPi3.vincnet68 a écrit :
Tu dis que les retards ne sont pas systématiques.
Pourrais tu me fournir ton traffic MQTT (voir commande quelques posts au dessus) et le log jmqtt correspondant lorsque le retard est significatif?
Re: Plugin jMQTT
@domotruc,
Je t’envoie le log par mp.
Merci
Vincnet68
Je t’envoie le log par mp.
Merci
Vincnet68
Re: Plugin jMQTT
Bonjour,
Peut etre une piste à investiguer pour mon problème de crash du deamon jMQTT et de latence dans le traitement des message:
Dans jMQTTClass la fonction mosquittoMessage() fait un appel setStatus(‘lastCommunication’,...) suivi de save() pour chaque équipement concerné par le message (qui semble mettre à jour le updateTime de l’equipement). Cet appel introduit un délai imporant dans le traitement des messages, en suppriment ces 2 lignes le traitement est beaucoup plus rapide et je n’ai plus de crash !
Je ne connais pas les détails sur le but de cet appel, mais ceci semble résoudre mon problème sans perturber le fonctionnement de l’ensemble...
Cdlt
JM
Peut etre une piste à investiguer pour mon problème de crash du deamon jMQTT et de latence dans le traitement des message:
Dans jMQTTClass la fonction mosquittoMessage() fait un appel setStatus(‘lastCommunication’,...) suivi de save() pour chaque équipement concerné par le message (qui semble mettre à jour le updateTime de l’equipement). Cet appel introduit un délai imporant dans le traitement des messages, en suppriment ces 2 lignes le traitement est beaucoup plus rapide et je n’ai plus de crash !
Je ne connais pas les détails sur le but de cet appel, mais ceci semble résoudre mon problème sans perturber le fonctionnement de l’ensemble...
Cdlt
JM
Re: Plugin jMQTT
Bonjour,jmc a écrit : ↑11 sept. 2018, 13:26Bonjour,
Peut etre une piste à investiguer pour mon problème de crash du deamon jMQTT et de latence dans le traitement des message:
Dans jMQTTClass la fonction mosquittoMessage() fait un appel setStatus(‘lastCommunication’,...) suivi de save() pour chaque équipement concerné par le message (qui semble mettre à jour le updateTime de l’equipement). Cet appel introduit un délai imporant dans le traitement des messages, en suppriment ces 2 lignes le traitement est beaucoup plus rapide et je n’ai plus de crash !
Je ne connais pas les détails sur le but de cet appel, mais ceci semble résoudre mon problème sans perturber le fonctionnement de l’ensemble...
Cdlt
JM
Je vais regarder, ça semble très prometteur.
Pourrais-tu tester de conserver le setStatus et remplacer le save() par save(true) ?
Merci
Re: Plugin jMQTT
domotruc a écrit : ↑11 sept. 2018, 21:25Bonjour,jmc a écrit : ↑11 sept. 2018, 13:26Bonjour,
Peut etre une piste à investiguer pour mon problème de crash du deamon jMQTT et de latence dans le traitement des message:
Dans jMQTTClass la fonction mosquittoMessage() fait un appel setStatus(‘lastCommunication’,...) suivi de save() pour chaque équipement concerné par le message (qui semble mettre à jour le updateTime de l’equipement). Cet appel introduit un délai imporant dans le traitement des messages, en suppriment ces 2 lignes le traitement est beaucoup plus rapide et je n’ai plus de crash !
Je ne connais pas les détails sur le but de cet appel, mais ceci semble résoudre mon problème sans perturber le fonctionnement de l’ensemble...
Cdlt
JM
Je vais regarder, ça semble très prometteur.
Pourrais-tu tester de conserver le setStatus et remplacer le save() par save(true) ?
Merci
Oublies ma demande de test jmc.
Je vais faire quelques essais complémentaires mais je pense que tu as vu juste
Le setStatus(‘lastCommunication’,...) met à jour la donnée intitulée "Date de dernière communication" visible dans la page de configuration avancée de l'équipement. Mais, même en supprimant cette instruction comme tu le proposes, cette valeur reste mise à jour : le core de jeedom s'en occupe sur mise à jour des commandes de l'équipement.
Le save sauve tout l'équipement ce qui ne sert à rien dans le cas de réception de message associé à un équipement existant, et c'est consommateur en charge CPU. Ça a finalement aussi l'inconvénient de mettre à jour la donnée Dernière Activité (ou Dernière mise à jour dans la configuration avancée).
Par contre, jmc, la modif que tu as faite va empêcher de sauver (et donc créer) tout nouvel équipement dans le mode inclusion. Je le changerai dans la correction définitive.
@Vincnet68: si tu peux vérifier que la correction proposée résout ton problème, ce serait super.
Re: Plugin jMQTT
@domotruc, @jmc,
J'ai effectué la modif suivant (ligne 493):
C'est ma première modif de code dans jeedom ai-je bien fait ?
Je suis passé par l'éditeur jeedom, modifié enregistrer.
Dois-je faire une autre manip ? (rédémarrer le deamon, plugin, jeedom, ...)
Merci
Vincnet68
J'ai effectué la modif suivant (ligne 493):
Code : Tout sélectionner
//$eqpt->setStatus('lastCommunication', date('Y-m-d H:i:s'));
$eqpt->save(true);
Je suis passé par l'éditeur jeedom, modifié enregistrer.
Dois-je faire une autre manip ? (rédémarrer le deamon, plugin, jeedom, ...)
Merci
Vincnet68
Re: Plugin jMQTT
vincnet68 a écrit : ↑12 sept. 2018, 08:28J'ai effectué la modif suivant (ligne 493):
C'est ma première modif de code dans jeedom ai-je bien fait ?Code : Tout sélectionner
//$eqpt->setStatus('lastCommunication', date('Y-m-d H:i:s')); $eqpt->save(true);
Je suis passé par l'éditeur jeedom, modifié enregistrer.
Dois-je faire une autre manip ? (rédémarrer le deamon, plugin, jeedom, ...)
Bonjour Vincnet68,
La procedure de modification est la bonne, la prise en compte est immediate à l'enregistrement, aucune autre manip n'est nécessaire.
Je suis intéressé par ton retour sur la modif que tu as faite à titre informatif (supprime t'elle le délai entre publication du message par mosquito et traitement de ce dernier par jeedom). Mais la modification finale supprimera aussi le save (voir mon message precedent):
Code : Tout sélectionner
//$eqpt->setStatus('lastCommunication', date('Y-m-d H:i:s'));
//$eqpt->save(true);
Re: Plugin jMQTT
Domotruc,domotruc a écrit :vincnet68 a écrit : ↑12 sept. 2018, 08:28J'ai effectué la modif suivant (ligne 493):
C'est ma première modif de code dans jeedom ai-je bien fait ?Code : Tout sélectionner
//$eqpt->setStatus('lastCommunication', date('Y-m-d H:i:s')); $eqpt->save(true);
Je suis passé par l'éditeur jeedom, modifié enregistrer.
Dois-je faire une autre manip ? (rédémarrer le deamon, plugin, jeedom, ...)
Bonjour Vincnet68,
La procedure de modification est la bonne, la prise en compte est immediate à l'enregistrement, aucune autre manip n'est nécessaire.
Je suis intéressé par ton retour sur la modif que tu as faite à titre informatif (supprime t'elle le délai entre publication du message par mosquito et traitement de ce dernier par jeedom). Mais la modification finale supprimera aussi le save (voir mon message precedent):
Code : Tout sélectionner
//$eqpt->setStatus('lastCommunication', date('Y-m-d H:i:s')); //$eqpt->save(true);
Il n'y a pas d'amélioration claire avec la modification de la première ligne.
Je vais désactiver la ligne save et je te tiens au courant.
Vincnet68
Envoyé de mon EVA-L09 en utilisant Tapatalk
Dernière édition par vincnet68 le 13 sept. 2018, 08:16, édité 1 fois.
Re: Plugin jMQTT
Effectivement le mode inclusion ne fonctionne plus après cette modification: le nouvel équipement est créé mais pas sauvegardé à l’arrivée du message et le deamon le plante lors de la création de la commande associée car l’equipe n’existe pas.
J’ai ajouté un $eqpt->save() après la création du nouvel équipement (jMQTT::newEquipement(...)) dans la même fonction tout en conservant les modifs precedentes et tout à l’air ok:
-nouvel équipement en mode inclusion
-nouvelles commandes
-dates de communication mises à jour
Merci
JMC
J’ai ajouté un $eqpt->save() après la création du nouvel équipement (jMQTT::newEquipement(...)) dans la même fonction tout en conservant les modifs precedentes et tout à l’air ok:
-nouvel équipement en mode inclusion
-nouvelles commandes
-dates de communication mises à jour
Merci
JMC
Re: Plugin jMQTT
Oui, c'est bien l'ajout que j'avais à l'esprit, ça doit effectivement être bon maintenant.jmc a écrit : ↑13 sept. 2018, 08:18Effectivement le mode inclusion ne fonctionne plus après cette modification: le nouvel équipement est créé mais pas sauvegardé à l’arrivée du message et le deamon le plante lors de la création de la commande associée car l’equipe n’existe pas.
J’ai ajouté un $eqpt->save() après la création du nouvel équipement (jMQTT::newEquipement(...)) dans la même fonction tout en conservant les modifs precedentes et tout à l’air ok:
-nouvel équipement en mode inclusion
-nouvelles commandes
-dates de communication mises à jour
Merci à toi
Re: Plugin jMQTT
Salut domotruc et jmc ,
Je confirme qu'il y a du mieux en réactivité en supprimant les 2 lignes :
Va-t-il y avoir une modification officielle du plugin pour cette "correction" ?
Ou dois-je implémenter la modification de jmc ?
Merci
Vincnet68
Je confirme qu'il y a du mieux en réactivité en supprimant les 2 lignes :
Code : Tout sélectionner
//$eqpt->setStatus('lastCommunication', date('Y-m-d H:i:s'));
//$eqpt->save(true);
Ou dois-je implémenter la modification de jmc ?
Merci
Vincnet68
Re: Plugin jMQTT
Bonjour Vincnet68,vincnet68 a écrit : ↑15 sept. 2018, 14:21Je confirme qu'il y a du mieux en réactivité en supprimant les 2 lignes :Va-t-il y avoir une modification officielle du plugin pour cette "correction" ?Code : Tout sélectionner
//$eqpt->setStatus('lastCommunication', date('Y-m-d H:i:s')); //$eqpt->save(true);
Ou dois-je implémenter la modification de jmc ?
Merci pour le retour, je vais publier cette correction dans le week-end.
Re: Plugin jMQTT
Bonjour,
Nouvelle version stable publiée à l'instant qui intègre la correction de jmc (grand merci à lui) : réduit la charge CPU du plugin et corrige les déconnexions intempestives du démon sur rafale de message.
Nouvelle version stable publiée à l'instant qui intègre la correction de jmc (grand merci à lui) : réduit la charge CPU du plugin et corrige les déconnexions intempestives du démon sur rafale de message.
Re: Plugin jMQTT
Hello,
Depuis le début j'avais mis en évidence un problème de charge cpu étrange. Je crois que vous avez finalement trouvé la source du problème.
Preuve a l'appui, un peu avant 0H13 j'ai fais la mise a jour de jmqtt et il n'y a pas photo ...
Merci a vous deux !
Depuis le début j'avais mis en évidence un problème de charge cpu étrange. Je crois que vous avez finalement trouvé la source du problème.
Preuve a l'appui, un peu avant 0H13 j'ai fais la mise a jour de jmqtt et il n'y a pas photo ...
Merci a vous deux !
Jeedom VM ESXI sur NUC
Ilot I/O Modbus Wago Z-Wave (11 volets,prises,présences) + RFXCom (sondes T°+RH, prises)
Pont Hue et une vingtaine d'ampoules,une flopée de Xiaomi aquara, Harmony Elite
8 Google Home et un PC tactile All-In accroché au mur
Ilot I/O Modbus Wago Z-Wave (11 volets,prises,présences) + RFXCom (sondes T°+RH, prises)
Pont Hue et une vingtaine d'ampoules,une flopée de Xiaomi aquara, Harmony Elite
8 Google Home et un PC tactile All-In accroché au mur
Re: Plugin jMQTT
Bonjour Domotruc,
Je suis en train de travailler sur des nodes à base d'Arduino qui communiquent avec Jeedom via MQTT.
Après avoir testé la librairie Pubsubclient je suis passé à cette librairie qui semble prendre en charge le QoS ainsi que le mode persistant contrairement à la première.
Ma question: je souhaite être capable de détecter si mes nodes sont ONLINE/OFFLINE, donc avoir un retour de connexion via une variable STATUS comme c'est le cas par défaut dans l'équipement JEEDOM.
Si je comprends bien la doc, en mode inclusion et si mes nodes publient en mode PERSISTANT, ce flag STATUS devrait être créé par défaut?
Ce n'est pas le cas pour le moment, donc je cherche d'où vient le pb.
Merci
Loic
Je suis en train de travailler sur des nodes à base d'Arduino qui communiquent avec Jeedom via MQTT.
Après avoir testé la librairie Pubsubclient je suis passé à cette librairie qui semble prendre en charge le QoS ainsi que le mode persistant contrairement à la première.
Ma question: je souhaite être capable de détecter si mes nodes sont ONLINE/OFFLINE, donc avoir un retour de connexion via une variable STATUS comme c'est le cas par défaut dans l'équipement JEEDOM.
Si je comprends bien la doc, en mode inclusion et si mes nodes publient en mode PERSISTANT, ce flag STATUS devrait être créé par défaut?
Ce n'est pas le cas pour le moment, donc je cherche d'où vient le pb.
Merci
Loic
---------------------------------------
Jeedom v3.3.19, VM sur Synology RS1619xs+, Arduinos, ETH-IO32B, MQTT, TTN, LoRa, Service Pack Power Ultimate
Ma présentation
Ma piscine connectée
ioBoard
Jeedom v3.3.19, VM sur Synology RS1619xs+, Arduinos, ETH-IO32B, MQTT, TTN, LoRa, Service Pack Power Ultimate
Ma présentation
Ma piscine connectée
ioBoard
Re: Plugin jMQTT
Loic74 a écrit : ↑23 sept. 2018, 21:28Bonjour Domotruc,
Je suis en train de travailler sur des nodes à base d'Arduino qui communiquent avec Jeedom via MQTT.
Après avoir testé la librairie Pubsubclient je suis passé à cette librairie qui semble prendre en charge le QoS ainsi que le mode persistant contrairement à la première.
Ma question: je souhaite être capable de détecter si mes nodes sont ONLINE/OFFLINE, donc avoir un retour de connexion via une variable STATUS comme c'est le cas par défaut dans l'équipement JEEDOM.
Si je comprends bien la doc, en mode inclusion et si mes nodes publient en mode PERSISTANT, ce flag STATUS devrait être créé par défaut?
Bonjour Loic,
Si ton équipement n'existe pas encore, il faut effectivement se mettre en mode inclusion.
Si il existe déjà, il faut cocher Ajout automatique des commandes dans l'équipement.
Pour investiguer, tu peux taper la commande suivante dans un terminal connecté à la machine hébergeant le broker mosquitto:
Code : Tout sélectionner
mosquitto_sub -t "#" -v| xargs -d$'\n' -L1 bash -c 'date "+%Y-%m-%d %T.%3N $0"'
Pour faire ce que tu souhaites, il faudra aussi que tu définisses le message testament pour positionner ton status à offline via l'API setWill.
Re: Plugin jMQTT
Merci Domotruc,
Bon, finalement j'ai l'impression que mon besoin n'a rien à voir avec le mode persistant/clean session, je ne sais pas pourquoi j'étais parti la dessus.
En fait il faut simplement que mon node publie à intervalle régulier le message "online" sur le topic "XXX/status" et mettre le LastWill à "offline" sur le même topic, c'est cela?
Bon, finalement j'ai l'impression que mon besoin n'a rien à voir avec le mode persistant/clean session, je ne sais pas pourquoi j'étais parti la dessus.
En fait il faut simplement que mon node publie à intervalle régulier le message "online" sur le topic "XXX/status" et mettre le LastWill à "offline" sur le même topic, c'est cela?
---------------------------------------
Jeedom v3.3.19, VM sur Synology RS1619xs+, Arduinos, ETH-IO32B, MQTT, TTN, LoRa, Service Pack Power Ultimate
Ma présentation
Ma piscine connectée
ioBoard
Jeedom v3.3.19, VM sur Synology RS1619xs+, Arduinos, ETH-IO32B, MQTT, TTN, LoRa, Service Pack Power Ultimate
Ma présentation
Ma piscine connectée
ioBoard
Re: Plugin jMQTT
Bonjour Loïc,
Ta première approche, basée sur un message persistant est bien la bonne, en rajoutant le LastWill, également persistant. La vérification de la communication entre le nœud et le broker est automatiquement gérée par le protocole grâce au keepAlive. Dans le cas de ta librairie son timeout est 10s par défaut, ce qui signifie que si il n'y a pas de messages échangés pendant 10s, le nœud envoi un PINGREQ au broker pour lui signifier qu'il est en vie (la librairie le gère automatiquement).
Concrètement:
Il faut bien sûr ensuite la boucle infinie sur le loop() pour que la communication se fasse.
Ta première approche, basée sur un message persistant est bien la bonne, en rajoutant le LastWill, également persistant. La vérification de la communication entre le nœud et le broker est automatiquement gérée par le protocole grâce au keepAlive. Dans le cas de ta librairie son timeout est 10s par défaut, ce qui signifie que si il n'y a pas de messages échangés pendant 10s, le nœud envoi un PINGREQ au broker pour lui signifier qu'il est en vie (la librairie le gère automatiquement).
Concrètement:
- Avant de se connecter au broker, spécifier le LastWill, par exemple avec ta librairie:
Code : Tout sélectionner
setWill("nodexxx/status", "offline", true, 1);
- Se connecter au broker, et publier le status:
Code : Tout sélectionner
connect(...);
publish("nodexxx/status", "online", true, 1);
Dernière édition par domotruc le 26 sept. 2018, 06:03, édité 1 fois.
Qui est en ligne ?
Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité