bln35 a écrit :J'ai comparé les traces lorsque me valeurs customs sont prisent en compte ou pas.
Lorsque ça fonctionne correctement, j'ai le type de trace ci dessous (après chaque requete type [92mArduino, il y a des requete type 91mPHP)
[92mArduino >>[DATA:0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
18.94,18.94,18.75,19.12,18.87,18.75,24.87,18.94,14.63,19.56,17.62,0.00,0.00,0.00,63.20,1022.00][0m
2015-05-12 11:03:09 | debug | [91mPHP=> 0=0 1=0 2=0 3=0 4=0 5=0 6=0 7=0 8=0 9=0 10=0 11=0 12=0 13=0 14=0 15=0 16=0 17=0 18=0 19=0 20=0 21=0 22=0 23=0 24=1 25=0 26=1 27=0 28=0 29=0 30=0 31=0 32=0 33=0 34=0 35=0 36=0 37=0 38=0 39=0 40=0 41=0 42=0 43=0 44=0 45=0 46=0 47=0 48=0 49=0 50=0 51=0 52=0 53=0 54=0 55=0 56=0 57=0 58=0 59=0 60=0 61=0 62=0 63=0 64=0 65=0 66=0 67=0 68=0 69=0 70=18.94 71=18.94 72=18.75 73=19.12 74=18.87 75=18.75 76=24.87 77=18.94 78=14.63 79=19.56 80=17.62 81=0.00 82=0.00 83=0.00 84=63.20 85=1022.00 [0m
2015-05-12 11:03:09 | debug | [92mArduino >> [70>>18.94<<][0m
2015-05-12 11:03:09 | debug | [91mPHP=> 70=18.94 [0m
2015-05-12 11:03:09 | debug | [92mArduino >> [71>>18.94<<][0m
2015-05-12 11:03:09 | debug | [91mPHP=> 71=18.94 [0m
Par contre, après un reboot de Jeedom, et la non prise en compte de mes valeurs Customs, j'ai des requetes type [92mArduino, mais aucune requete type 91mPHP. Cela explique probablement mon problème.
@Alois, quel fichier/script est chargé de répondre par des requêtes du type 91mPHP ? Pour rappel, pour que ça fonctionne à nouveau je dois stopper le Daemon (car il est vu en service) puis le réactiver pour que mes valeurs customs soient prise à nouveau en compte. Comment puis je faire ces opérations (Stop & start) à la mano en SSH pour solutionner mon problème ?
De votre coté avez vous constatez le même problème ou est ce que cela fonctionne correctement après reboot de Jeedom ?
Merci d'avance pour votre support
Bon après une petite interruption dans mes recherches et comme je n’ai pas vu de réponse sur le forum j’ai repris les tests hier et je pense connaitre la cause et avoir une solution au problème.
Voilà ce que j’ai trouvé.
D’abord les symptômes :
Apres un redémarrage du Deamon ou un reboot du système
1 dans Jeedom le plug-ins indique que le « Deamon n’a pas démarré » ou que le « Deamon ne fonctionnement pas ».
2 Si l’on regarde les logs du Deamon on trouve qqc qui ressemble à ce que bln35 a posté.
3
L’envoi de commande depuis Jeedom vers Arduino MARCHE
4
La remonté d’info de l’Arduino vers Jeedom ne MARCHE PAS.
Pour ceux qui ont le problème et pas le courage de tout lire
voila la solution. Dans le Sketch de l’Arduino il faut ajouter une ligne comme ceci :
version d'origine
Code : Tout sélectionner
if (DataSerie[0] == 'P' && DataSerie[1] == 'I' && DataSerie[2] == 'N' && DataSerie[3] == 'G') { // ***************************** PING
Serial.println("PING_OK");
}
à remplace par
Code : Tout sélectionner
if (DataSerie[0] == 'P' && DataSerie[1] == 'I' && DataSerie[2] == 'N' && DataSerie[3] == 'G') { // ***************************** PING
Serial.println("PING_OK");
Serial.println("CP_OK"); // @@RC Fix plugins init bug
}
Pour ceux qui veulent l’explication la voila :
Le problème est lié à la phase d’initialisation entre les trois softs, Plugins, Deamon et Arduino ce qui est normal ayant un peu d’expérience sur la communication entre systèmes je peux dire que les phases d’init entre deux systèmes communicant est toujours très difficile, ici il y a trois systèmes donc c’est pire.
Bref ou est le problème
Et bien il est dans les trois systèmes car de ce que j’ai trouvé dans le code de cette init, si il y a le moindre décalage dans les réponses d’un des système tout est coincé.
Le plugins démarre le Daemon puis le Deamon ping l’Arduino et remonte le résultat du ping vers le plugins. Si le plugins à la bonne réponse dans les temps il envoi un ordre de configuration des Pin au Deamon qui l’envoi à l’Arduino, si l’Arduino renvoi configuration ok = CP_OK alors le Deamon est complètement et correctement initialisé.
Coté plugins tout est dans la méthode
arduidom::startdaemon() de
arduidom.class.php. Si tout va bien (pas d’erreurs) cette méthode lance
self::setPinMapping() et c’est tout bon. Le problème coté Deamon est que les envois vers Jeedom sont conditionnés par l’état du booléen
Arduino_CPOK et que ce booléen est «
false » tant que Deamon n’a pas reçu au moins un «
CP_OK ». L’Arduino envoi un
CP_OK que si le Deamon lui envoi une commande CPzz….. si vous avez suivie cette commande est envoyé par le Plugins via la méthode
self::setPinMapping(). Donc si pas de self::setPinMapping() pas de CP_OK pas de Arduino_CPOK = true donc pas de remontée d’info vers Jeedom.
Mais pourquoi est-ce que le Plugins détecte des erreur dans startdaemon() et bien je ne sait pas vraiment, il y a semble-t-il plusieurs causes, les messages ce croisent, l’Arduino ne répond pas assez vite, le Deamon n’est pas complètement près, bref je n’ai pas toujours la même comportement mais souvent le même résultat.
Il faudrait à mon avis revoir la phase d’init complètement pour éliminer les dépendances entre système, mais c’est une autre histoire. Pour le moment je me suis contenté d’intervenir sur la partie qui est customisable c’est à dire le Sketch de l’Arduino.
J’ai simplement ajouté l’envoi d’un CP_OK en réponse d’une demande de PING pour forcer le Daemon
à passer Arduino_CPOK à 1. Et voila tout va bien .
Code : Tout sélectionner
if (DataSerie[0] == 'P' && DataSerie[1] == 'I' && DataSerie[2] == 'N' && DataSerie[3] == 'G') { // ***************************** PING
Serial.println("PING_OK");
// @@RC
if ( CPConfDone ) {
Serial.println("CP_OK");
}
// end @@RC
}
J’ai défini un booléen
CPConfDone qui est
false si l’Arduino n’a jamais reçu de configuration des pin, ce n’est pas indispenssable mais si vous voulez faire la même chose il faux créer la variable comme ceci :
Code : Tout sélectionner
// PARTIE DEFINITION
// Vos #define et autre ici
bool CPConfDone = true;
C’est la fonction
InitEEPROM qui passe cette variable à false si besoin. Il faux donc modifier le méthode
InitEEPROM comme ceci
Code : Tout sélectionner
void InitEEPROM() {
EEPROM.write(1, ArduiDomVersion); // Pin Mode
for (int i = 2; i < 200; i++) {
EEPROM.write(i, 'z'); // Pin 0 Mode // RESERVED FOR USB
}
// @@RC fix bug in plugins
CPConfDone=false;
// end @@RC
} // END OF InitEEPROM()
Encore une fois vous pouvez faire simple et uniquement ajouter
Serial.println("CP_OK"); après le
Serial.println("PING_OK");
Résultat à chaque PING l’Arduino envoi un CP_OK au Deamon qui set Arduino_CPOK à 1 et autorise les remontées d’info vers Jeedom.
Je peux revoir un peu la méthode d'init du plugin si cela peu aider l'équipe Arduidom.