[RÉSOLU] - Gérer les lumières via Gladys


#41

Voilà,
J’ai installé le module, je clique sur configuration et rien ne se passe


#42

Salut @Furiousmax

Tu dois être sur une veille version de Gladys (avant la 3.9 je pense, pour preuve il te manque une colonne dans le tableau des modules) c’est pour ça que tu ne vois pas la page de configuration du module s’afficher, c’est très récent ^^

Avant de pouvoir utiliser cette page tu dois mettre à jour ton installation :slightly_smiling_face:


#44

Effectivement @MathieuA je suis sur 3.8.0
En mettant à jour tout fonctionne merci beaucoup !
Plus qu’à voir si le serial avec 2 arduinos fonctionne après la maj !


#45

Tout est expliqué ici => https://gladysassistant.com/fr/article/gladys-3-9-disponible

Bon si ce n’est que depuis on est version 3.11.6 ^^
Mais la procédure reste la même :wink:


#46

Je lis ça sans attendre, un grand merci @MathieuA


#47

Tout est ok @MathieuA, je suis sur la version 3.9 ! YES
Je me permet de te déranger encore une fois.
Sais tu pourquoi je n’arrive pas à gérer deux arduinos en communication série en même temps ?

Comme tu le vois ils sont bien reconnu.
Le premier s’occupe du 433MHZ, via le module radioemitter, voici le code :

/*
 * Receiver is not mandatory !!
 * You can just have a emitter.
 * 
 * Configuration  
 * Pin 2 => interruption 0 => radio receiver
 * Pin 10 => 433Mhz emitter
 * 
 * Wait for a JSON on serial port. When a JSON is received, it calls the right function
 * Code example : (the % is for the end of the command). Put thats code into the serial to test
 * {"function_name":"SendRadioCode","code":"16129807"}%
 * => call the SendRadioCode function with code "16129807"
 */
 
#include <ArduinoJson.h>
#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();


void SendRadioCode(long code) {

   mySwitch.send(code, 24);
}

// Serial buffer

String command = "";


// End of command marker

char endMarker = '%';


/*
 * Execute the right function
 */

void executeFunction(String json_data) {

  StaticJsonBuffer<200> jsonBuffer;

  JsonObject& v = jsonBuffer.parseObject(json_data);

  //on décompose la chaine de cartère

  if ( v["function_name"] == String("SendRadioCode") ) {

    SendRadioCode(v["code"]);

  } 

}


/**
 * This function is automatically called when data is received on serial port
 */

void serialEvent() {

    //lit toutes les données (vide le buffer de réception)

    char last_readed_char = Serial.read();

    if ( last_readed_char == endMarker ) {

      executeFunction(command);

      command = "";

    } else {

      command += last_readed_char;

    }

}

void setup() {

  
 // Open serial communications and wait for port to open: 

  Serial.begin(9600);

  // Receiver is connected on Arduino Pin #2

  mySwitch.enableReceive(0);

  // Transmitter is connected to Arduino Pin #10  

  mySwitch.enableTransmit(10);

  // Optional set pulse length.

  mySwitch.setPulseLength(310);

  // Optional set protocol (default is 1, will work for most outlets)

  mySwitch.setProtocol(1); 

  // Optional set number of transmission repetitions.

  mySwitch.setRepeatTransmit(15);

  delay(1000);

}

void loop() {

  if (mySwitch.available()) {

    int value = mySwitch.getReceivedValue();

    
    if (value == 0) {

      Serial.print("Unknown encoding");

    } else {

      Serial.print("{\"action\":\"received\",\"value\":");

      Serial.print( mySwitch.getReceivedValue() );

      Serial.println("}");

    }

    delay(200); 

    mySwitch.resetAvailable();

  }
}

Le second s’occupe de gérer des relais, via Gladys-to-arduino, voici le code :

#include <ArduinoJson.h>

struct actionneurData {
  int id;
  int valeur;
};

actionneurData cde;

void setup() {
  Serial.begin(9600);
  pinMode(7, OUTPUT);
}

void loop() {
}

void serialEvent() {
  if (deserialize(cde)) {
    String tmpCde = "";
    tmpCde = "{\"deviceType\":\"";
    tmpCde += cde.id;
    tmpCde += "\",\"value\":\"";
    tmpCde += cde.valeur;
    tmpCde += "\"}";
    Serial.println(tmpCde);
  }
}

bool deserialize(actionneurData &data) {
  StaticJsonBuffer<55> jsonBuffer;
  JsonObject& root = jsonBuffer.parseObject(Serial);
  if (root == JsonObject::invalid()) {
    Serial.println("JSON invalid");
    delay(1000);  
    return false;
  }
  else {
    Serial.println("JSON received");
    data.id = root["deviceType"];
    data.valeur = root["value"];

    if(data.valeur == 1){
          digitalWrite(7, HIGH); 
    } else {
          digitalWrite(7, LOW); 
    }

    delay(1000);   
    return true;
  }
}

Si j’en test un sans l’autre cela fonctionne mais L’UN ET L’AUTRE ne fonctionne pas !
Peux tu m’aider stp ?
Merci :slight_smile:


#48

Tu devrais être en Gladys 3.11.6 …


#49

Oui effectivement tu devrait être en 3.11 comme dis @Jean34 :thinking:
Mais bon c’est pas très grave à la limite.

@ForzAguanno Tu peux essayer d’actionner les devices qui commandes tes deux arduino et poster ici les logs ?


#50

Salut @MathieuA et @Jean34 effectivement je suis sur la version 3.11.6

En ce qui concerne les logs c’est à n’y rien y comprendre
Les 6 premiers concerne le 433MHz et mes prises chacon :

0|gladys   | Event : create : new Event with code : devicetype-new-value
0|gladys   | Scenario : Trigger : New event : devicetype-new-value
0|gladys   | Scenario : Trigger : Found 0 launchers with code devicetype-new-value.
0|gladys   | Event : create : new Event with code : devicetype-new-value
0|gladys   | Scenario : Trigger : New event : devicetype-new-value
0|gladys   | Scenario : Trigger : Found 0 launchers with code devicetype-new-value.

Ces 6 la sont pour ma gestion du relais :

0|gladys   | Event : create : new Event with code : devicetype-new-value
0|gladys   | Scenario : Trigger : New event : devicetype-new-value
0|gladys   | Scenario : Trigger : Found 0 launchers with code devicetype-new-value.
0|gladys   | Event : create : new Event with code : devicetype-new-value
0|gladys   | Scenario : Trigger : New event : devicetype-new-value
0|gladys   | Scenario : Trigger : Found 0 launchers with code devicetype-new-value.

Ma prise 433MHz s’allume, tout va bien
Mon relais quand à lui ne s’actionne pas alors qu’il ne semble pas y avoir de soucis dans les logs…
C’est à me rendre barge lol


#51

Je viens de trouver ce tutoriel :

J’ai vu cette commande :

npm install -g serialport --unsafe-perm

A t-elle obligatoirement un rôle à jouer pour faire fonctionner la communication série USB ?


#52

Hello,

Avec un seul Arduino, tout fonctionne, donc tu as tout ce qu’il faut déjà :slight_smile:


#53

D’accord, merci @piznel

Bon alors je ne comprend toujours pas pourquoi je ne peux pas en utiliser deux en même temps.
Tout semble fonctionner pourtant


#54

Il y a du nouveau j’ai essayé de configurer les deux en même temps lorsque j’actionne le bouton, voilà ce que les logs me disent :

/home/pi/.pm2/logs/gladys-out-0.log last 15 lines:
0|gladys   | Gladys serial : cannot parse JSON received from arduino : SyntaxError: Unexpected token J in JSON at position 0
0|gladys   | Received data from Arduino JSON invalid
0|gladys   | Gladys serial : cannot parse JSON received from arduino : SyntaxError: Unexpected token J in JSON at position 0
0|gladys   | Received data from Arduino JSON invalid
0|gladys   | Gladys serial : cannot parse JSON received from arduino : SyntaxError: Unexpected token J in JSON at position 0
0|gladys   | Received data from Arduino JSON invalid
0|gladys   | Gladys serial : cannot parse JSON received from arduino : SyntaxError: Unexpected token J in JSON at position 0
0|gladys   | Received data from Arduino JSON invalid
0|gladys   | Gladys serial : cannot parse JSON received from arduino : SyntaxError: Unexpected token J in JSON at position 0
0|gladys   | Received data from Arduino JSON invalid
0|gladys   | Gladys serial : cannot parse JSON received from arduino : SyntaxError: Unexpected token J in JSON at position 0
0|gladys   | Received data from Arduino JSON invalid
0|gladys   | Gladys serial : cannot parse JSON received from arduino : SyntaxError: Unexpected token J in JSON at position 0
0|gladys   | Received data from Arduino JSON invalid
0|gladys   | Gladys serial : cannot parse JSON received from arduino : SyntaxError: Unexpected token J in JSON at position 0

0|gladys   | Received data from Arduino JSON invalid
0|gladys   | Gladys serial : cannot parse JSON received from arduino : SyntaxError: Unexpected token J in JSON at position 0
0|gladys   | Received data from Arduino JSON invalid
0|gladys   | Gladys serial : cannot parse JSON received from arduino : SyntaxError: Unexpected token J in JSON at position 0
0|gladys   | Received data from Arduino JSON invalid
0|gladys   | Gladys serial : cannot parse JSON received from arduino : SyntaxError: Unexpected token J in JSON at position 0

Et la le deuxième bouton :

0|gladys   | Scenario : Trigger : New event : devicetype-new-value
0|gladys   | Scenario : Trigger : Found 0 launchers with code devicetype-new-value.
0|gladys   | Received data from Arduino {"deviceType":"13","value":"1"}
0|gladys   | Received data from Arduino JSON invalid
0|gladys   | Gladys serial : cannot parse JSON received from arduino : SyntaxError: Unexpected token J in JSON at position 0
0|gladys   | Event : create : new Event with code : devicetype-new-value
0|gladys   | Received data from Arduino JSON received
0|gladys   | Gladys serial : cannot parse JSON received from arduino : SyntaxError: Unexpected token J in JSON at position 0
0|gladys   | Scenario : Trigger : New event : devicetype-new-value
0|gladys   | Scenario : Trigger : Found 0 launchers with code devicetype-new-value.
0|gladys   | Received data from Arduino {"deviceType":"13","value":"0"}
0|gladys   | Received data from Arduino JSON invalid
0|gladys   | Gladys serial : cannot parse JSON received from arduino : SyntaxError: Unexpected token J in JSON at position 0

Une idée ?


#55

De mémoire, certains modules communiquent avec « devicetype » et d’autre avec « deviceType » (la diffèrence est le t).
Tu peux modifier ton script Arduino en conséquence ?


#56

Je viens d’essayer, ce n’est pas ça non plus


#57

Et les logs, du coup ?


#58

J’ai encore besoin de vos compétences.
Je pense avoir trouvé la source du problème mais je ne suis pas capable de corriger tout ça, en revanche je pense que ça peut être utile à la communauté :slight_smile:

Je suis tombé sur ce message indiquant que le fichier “sendCode.js” du module Serial de Gladys prenait en compte uniquement le premier port USB détecté !

Capture1

Ça explique ENFIN pourquoi je ne peux qu’utiliser un seul de mes arduinos, en l’occurrence le premier qui est configuré !

Donc, ici le premier Arduino détecté est sur le port USB "/dev/ttyACM0 :

Cette Arduino permet de contrôler mes relais, et donc une lampe qui est branché sur mon dessus.
Jusqu’ici je n’ai paramétré qu’un seul Device (LAMPE) donc cela fonctionne correctement !

Capture4

En revanche, dès lors que je crée le second Device (PRISE CHACON)

Impossible d’utiliser les deux en même temps ! RAGEANT !!

Ma question est la suivante,
Est il possible de modifier cette fameuse ligne dans le "sendCode.js ?
Du style rajouter

var port = ports [ 1 ];

Ce qui donnerait donc :

var shared =  require ( ' ./shared.js ' );

module . exports  =  fonction ( code ) {

  // obtenir le premier arduino trouvé sur usb
  var ports =  partagé . getPorts ();
  var port = ports [ 0 ];
  var port = ports [ 1 ];
  // écrit le code sur l'arduino
  port . écrire (code);
    
};

Je m’en remet à vos connaissances !
PS : Le “sendCode.js” est le même que ce soit sur le Serial officiel ou celui d’ @isokar

Sur cette page github on parle de modification à faire pour activer le “multi-arduino”

Encore un grand merci pour tout le temps consacré à ce sujet


#59

Avez vous une idée de comment faire svp ?


#60

J’ai trouvé un lien du module Serial d’ @isokar ou il semble y avoir la possibilité de reconnaître plusieurs arduinos en même temps.

Désolé d’être lourd avec ça mais pouvez vous me venir en aide svp ? @piznel @MathieuA
Je suis à la ramasse lol
Merci par avance


#61

Salut @ForzAguanno,

Je viens de tout relire.
Donc, tu souhaites, depuis Gladys, piloter des lampes et des prises.
Le soucis principal vient donc du fait que tu veux impérativement un Arduino pour les lampes, et un autre pour les prises.

Situation

Bouton Lampe -> Module gladys-to-arduino -> module serial -> Arduino n°1
Bouton prise -> Module radioemitter -> module serial -> Arduino n°2

Module gladys-to-arduino -> module serial :
Le code d’appel du module Serial est :

gladys.modules.serial.sendCode({“deviceType”:"${id}",“value”:"${code}"}%);

Module radioemitter -> module serial :
Le code d’appel du module Serial est :

gladys.modules.serial.sendCode({“function_name”:“SendRadioCode”,“code”:"${code}"}%);

Le module Serial est le même pour les 2 “routes”, on peut voir qu’il est appelé de la même façon : on envoi un JSON avec des infos sur l’action à effectuer ( = "function_name":"SendRadioCode" ) ou bien un JSON permettant d’identifier le device à actionner ( = "deviceType":"${id}").

Dans le module serial, nous avons alors ce code qui s’exécute :

   // geting the first arduino finded on usb
  var ports = shared.getPorts();
  var port = ports[0];
  // write the code to the arduino
  port.write(code);

Ce qui envoi donc systématiquement sur le premier Arduino.

Quel est le problème ?

Comment, depuis le bouton dans Gladys, dire au module serial sur quel port il faut envoyer la commande ?
En effet, dans la situation actuelle, rien ne permet de rattacher un deviceType à un Arduino dans Gladys;

Je vois plusieurs solutions possibles, de la moins lourdes (la plus môche aussi!) à la plus lourde (la plus propre!!!).

Mais l’idéal serait de n’avoir qu’un seul Arduino, avec une sélection dans son code de l’action à faire, en fonction du JSON reçu.

@MathieuA ou autre, une idée ?