Avant toute chose merci de (re)prendre connaissance de la charte et de la respecter.
Pour résumer :
- Avant de poser une question, je cherche si la réponse existe
- Je suis poli, courtois et je respecte tout un chacun sur le forum
- Si un post m'agace : je m'en éloigne plutôt que de répondre d'une façon qui pourrait être mal interprétée


Il n'est jamais du luxe que de rappeler des choses simples :
Courtoisie, amabilité, politesse et bonne humeur sont les maîtres mots pour un forum sympathique, bienveillant et accueillant :)

Toute la communauté vous remercie

Affichage de valeur erronée suite à l'envoi d'une commande

Retrouvez ici des sujets concernant le protocole mySensors et les modules domotiques de type mySensors utilisés avec JEEDOM
/!\ Plugin mySensors non officiel
Répondre
Fifut
Timide
Messages : 14
Inscription : 26 avr. 2017, 18:49

Affichage de valeur erronée suite à l'envoi d'une commande

Message par Fifut » 06 janv. 2018, 12:44

Salut à tous !

J'ai réalisé un nœud pour gérer mon chauffage, j'ai donc présenté un capteur S_HEATER à la gateway.
Et j'utilise les types : V_HVAC_SETPOINT_HEAT, V_STATUS et V_TEMP.

L'envoi de la température depuis mon nœud à Jeedom fonctionne parfaitement.
L'envoi de commande de paramétrage depuis Jeedom à mon nœud également.

Mais quand j’envoie une commande de paramétrage depuis Jeedom à mon nœud comme la consigne de température par exemple, la température afficher dans Jeedom prend la valeur de la consigne envoyé et ce jusqu'au prochaine envoi de la température par le nœud.
Et dans la configuration du nœud, le "Type Donnée" change automatiquement pour le type de la dernière commande envoyé (de 0 à 45 pour mon exemple ci-dessus). J'ai le même résultats je déclare un S_HVAC au lieu d'un S_HEATER.

Si je regarde les logs, tout est normale au niveau des valeurs dans la structures des messages.
C'est comme si la demande d'ACK par la gateway lors du paramétrage était interprété par Jeedom comme une "vrais" information provenant d'un capteur du nœud.

Sa fait quelques jours que je suis sur se problème mais la je sèche !
Peut-être quelqu'un peut éclairer ma lanterne ? Merci d'avance ;)
En espérant avoir été assez clair dans mes explications.

Ma config :
RPi3
Jeedom 3.1.7
MySensors 2.1.1
Plugin 2017-12-27 14:18:03

tonnerre33
Timide
Messages : 159
Inscription : 28 déc. 2015, 15:44
Localisation : Bordeaux

Re: Affichage de valeur erronée suite à l'envoi d'une commande

Message par tonnerre33 » 06 janv. 2018, 20:41

As tu vérifié que ton information consigne et température aient bien un child id différent dans ton node ?

Fifut
Timide
Messages : 14
Inscription : 26 avr. 2017, 18:49

Re: Affichage de valeur erronée suite à l'envoi d'une commande

Message par Fifut » 07 janv. 2018, 11:09

Non ils ont le même child id vu que le V_HVAC_SETPOINT_HEAT et V_TEMP font parti de S_HVAC.

Voici ce qu'il y à dans mon code :

Code : Tout sélectionner

#define ID_HVAC 70

MyMessage msg_HVAC_SetPoint	(ID_HVAC, V_HVAC_SETPOINT_HEAT);
MyMessage msg_HVAC_Status	(ID_HVAC, V_STATUS);
MyMessage msg_HVAC_Temperature 	(ID_HVAC, V_TEMP);

void presentation()
{
  sendSketchInfo("Chauffage", "1.0");
  
  present(ID_HVAC , S_HVAC);
}
Je ne pense pas avoir fait d'erreur.

tonnerre33
Timide
Messages : 159
Inscription : 28 déc. 2015, 15:44
Localisation : Bordeaux

Re: Affichage de valeur erronée suite à l'envoi d'une commande

Message par tonnerre33 » 08 janv. 2018, 21:23

Je n'ai peut être pas tout compris mais il me semblais qu'une information = un child id
dans le cas contraire la dernière information envoyé va remplacer la valeur et le type de la variable Jeedom.
D'ailleurs pourquoi ton ID_HVAC est à 70 ?

Perso j'aurai fait :

Code : Tout sélectionner

define ID_HVAC_SetPoint	 1
define ID_HVAC_Status	2
define ID_HVAC_Temperature  3

MyMessage msg_HVAC_SetPoint	(ID_HVAC_SetPoint, V_HVAC_SETPOINT_HEAT);
MyMessage msg_HVAC_Status	(ID_HVAC_Status);
MyMessage msg_HVAC_Temperature 	(ID_HVAC_Temperature, V_TEMP);

void presentation()
{
  sendSketchInfo("Chauffage", "1.0");
  
  present(ID_HVAC_SetPoint , S_HVAC);
  present(ID_HVAC_Status , S_HVAC);
  present(ID_HVAC_Temperature, S_HVAC);
      
}

Fifut
Timide
Messages : 14
Inscription : 26 avr. 2017, 18:49

Re: Affichage de valeur erronée suite à l'envoi d'une commande

Message par Fifut » 09 janv. 2018, 18:54

Merci tonnerre33 pour ta réponse.

En regardant les exemple MySensors dans Arduino, il n'est attribué qu'un CHILd_ID par "Sensor", idem dans les exemples sur home-assistant.io
Donc je pense pas me tromper de se coté là.

Exemple du Sketch WaterMeterPulseSensor :

Code : Tout sélectionner

#define CHILD_ID 1                              // Id of the sensor child

MyMessage flowMsg(CHILD_ID,V_FLOW);
MyMessage volumeMsg(CHILD_ID,V_VOLUME);
MyMessage lastCounterMsg(CHILD_ID,V_VAR1);

void presentation()
{
	// Send the sketch version information to the gateway and Controller
	sendSketchInfo("Water Meter", "1.1");

	// Register this device as Waterflow sensor
	present(CHILD_ID, S_WATER);
}
Exemple HVAC home-assitant : https://home-assistant.io/components/climate.mysensors/

A moins que l'utilisation de MySensors avec Jeedom requière un CHILD_ID par information!

J'ai essayé ta proposition, je me retrouve dans Jeedom avec 3 HVAC de déclarés, et pour les 3 à chaque fois un ON, OFF, etc. donc pour moi il comprends que j'ai trois sytème de chauffage indépendant.

Mon CHILD_ID est 70 juste pour regrouper les différents capteurs en catégorie, 10 à 19 c'est les bouton, 20 à 29 les lumière, etc.

Du coup je suis toujours un peu confus dans le fonctionnement de MySensors/Jeedom :?

Fifut
Timide
Messages : 14
Inscription : 26 avr. 2017, 18:49

Re: Affichage de valeur erronée suite à l'envoi d'une commande

Message par Fifut » 09 janv. 2018, 20:37

Pour rendre mon problème plus parlant, j'ai réalisé un test avec un nœud tout simple qui représente un capteur de température auquel j'envoi une valeur au travers d'un V_VAR.

J'ai le même phénomène qu'expliquer plus haut dans mon widget Jeedom, à savoir : la température afficher prend la valeur de V_VAR1 quand je demande l'envoi de la valeur V_VAR1 au nœud et ce, jusqu'au prochaine envoi de la température par le nœud .


Voici le code du nœud :
Toutes les 10 secondes le nœud envoi la température 30° à la gateway.
Si le nœud reçoit un message V_VAR1, il l'affiche dans le moniteur série.

Code : Tout sélectionner

// Enable debug prints to serial monitor
#define MY_DEBUG

// Enable and select radio type attached
#define MY_RADIO_NRF24

// Manually set Node ID
#define MY_NODE_ID 200

#include <MySensors.h>

#define CHILD_ID 0

MyMessage msg(CHILD_ID, V_TEMP);


void presentation()
{
	// Send the sketch version information to the gateway and Controller
	sendSketchInfo("Test Sensor", "1.0");

	// Register all sensors to gateway (they will be created as child devices)
	present(CHILD_ID, S_TEMP);
}


void loop()
{
  send(msg.set(30));
  wait(10000);
}


void receive(const MyMessage &message)
{
  Serial.print("Incoming datas for child ID : ");
  Serial.println(message.sensor);
    
  switch (message.sensor) {

    case CHILD_ID:

      if (message.type == V_VAR1) {
        Serial.print("V_VAR1 set to : ");
        Serial.println(message.getByte());
      } 
    break;

    default:
      Serial.println("Unknown ID !");
    break;
  }
  
}


Log sur mon nœud:
Envoi 2 fois de la température puis réception de la valeur V_VAR1, puis à nouveau envoi de la température.

Code : Tout sélectionner

4255 TSF:MSG:SEND,200-200-0-0,s=0,c=1,t=0,pt=2,l=2,sg=0,ft=0,st=OK:30
14264 TSF:MSG:SEND,200-200-0-0,s=0,c=1,t=0,pt=2,l=2,sg=0,ft=0,st=OK:30
17961 TSF:MSG:READ,0-0-200,s=0,c=1,t=24,pt=0,l=3,sg=0:100
17967 TSF:MSG:ACK REQ
17973 TSF:MSG:SEND,200-200-0-0,s=0,c=1,t=24,pt=0,l=3,sg=0,ft=0,st=OK:100
Incoming datas for child ID : 0
V_VAR1 set to : 100
24272 TSF:MSG:SEND,200-200-0-0,s=0,c=1,t=0,pt=2,l=2,sg=0,ft=0,st=OK:30

Log dans Jeedom :
Réceptionne 2 fois la température puis envoi de la valeur V_VAR1, puis a nouveau réception de la température.

Code : Tout sélectionner

Tue Jan 09 2018 19:13:59 GMT+0000 (UTC) : 0;255;3;0;9;TSF:MSG:READ,200-200-0,s=0,c=1,t=0,pt=2,l=2,sg=0:30
Tue Jan 09 2018 19:13:59 GMT+0000 (UTC) : 200;0;1;0;0;30
Tue Jan 09 2018 19:14:09 GMT+0000 (UTC) : 0;255;3;0;9;TSF:MSG:READ,200-200-0,s=0,c=1,t=0,pt=2,l=2,sg=0:30
Tue Jan 09 2018 19:14:09 GMT+0000 (UTC) : 200;0;1;0;0;30
Tue Jan 09 2018 19:14:13 GMT+0000 (UTC) - Server connected
Tue Jan 09 2018 19:14:13 GMT+0000 (UTC) - Response: 200;0;1;1;24;100
Tue Jan 09 2018 19:14:13 GMT+0000 (UTC) - Connexion closed
Tue Jan 09 2018 19:14:13 GMT+0000 (UTC) : 0;255;3;0;9;TSF:MSG:SEND,0-0-200-200,s=0,c=1,t=24,pt=0,l=3,sg=0,ft=0,st=OK:100
Tue Jan 09 2018 19:14:13 GMT+0000 (UTC) : 0;255;3;0;9;TSF:MSG:READ,200-200-0,s=0,c=1,t=24,pt=0,l=3,sg=0:100
Tue Jan 09 2018 19:14:13 GMT+0000 (UTC) : 0;255;3;0;9;TSF:MSG:ACK
Tue Jan 09 2018 19:14:13 GMT+0000 (UTC) : 200;0;1;1;24;100
Tue Jan 09 2018 19:14:19 GMT+0000 (UTC) : 0;255;3;0;9;TSF:MSG:READ,200-200-0,s=0,c=1,t=0,pt=2,l=2,sg=0:30
Tue Jan 09 2018 19:14:19 GMT+0000 (UTC) : 200;0;1;0;0;30

Et enfin le paramétrage dans Jeedom :

Image

Est-ce-que c'est la bonne façon de faire?
Y-a-t'il un souci dans la façon de communiquer?

tonnerre33
Timide
Messages : 159
Inscription : 28 déc. 2015, 15:44
Localisation : Bordeaux

Re: Affichage de valeur erronée suite à l'envoi d'une commande

Message par tonnerre33 » 09 janv. 2018, 21:46

Dans ton exemple, il faut que tu changes l'ID Capteur de VAR1 du paramétrage de Jeedom par 1 et ca fonctionnera.

En fait ce qu'il se passe c'est que Jeedom envoi un message à destination du child_ID 0. Le node le reçoit, traite l'information suivant ton code et renvoi un acquittement à Jeedom. En fait pour acquitter, le node renvoi le message qu'il a reçu mais avec un type Acquittement.
Du coup ton jeedom voit ça comme une information à destination du Id_capteur 0 et met donc à jour le type et la valeur de température 0.
Bon après ce n'est pas trop normal qu'un acquittement est cette action sur Jeedom mais je ne vois que ça comme explication.

Je vais essayer de comprendre plus en détail ton histoire du même child_id pour des capteurs différents car j'ai toujours attribué un child_ID par mesure.

Pour que je comprenne mieux ton système peux tu m'envoyer le code du node et le paramétrage Jeedom ?

Fifut
Timide
Messages : 14
Inscription : 26 avr. 2017, 18:49

Re: Affichage de valeur erronée suite à l'envoi d'une commande

Message par Fifut » 09 janv. 2018, 22:38

A force de parcourir le forum, je commence à comprendre que plusieurs personnes ont des problèmes qui apparaissent à première vue différents mais qui proviennent tous du faite d'avoir un CHILD_ID identique pour plusieurs type de mesure d'un même capteur.

Effectivement comme tu le dit tonnerre33, avec Jeedom, il faut bien avoir des CHILD_ID différents pour chaque type de mesure et non pour chaque capteur comme le montre les différents exemples MySensors (ce qui est déroutant car apparemment propre à Jeedom).

Dans mon cas, le seul point négatif de cette façon de faire c'est la création automatique (dans Jeedom lors de la présentation du nœud) de plusieurs info/commande identique pour un seul capteur "physique" (dans mon cas plusieurs ON /OFF HVAC). Si je les supprimes, ils reviennent lorsque le nœud redémarre (même hors mode inclusion).

As-tu ce même phénomène de ton coté? Il faut que je creuse encore cette partie, et faire des essais sur la présentation du nœud à la gateway.


Dans ton exemple, il faut que tu changes l'ID Capteur de VAR1 du paramétrage de Jeedom par 1 et ca fonctionnera.
Effectivement, ceci résous le problème mais je dois supprimer mon "switch" qui vérifie pour quel ID le message est destiné vu que normalement l'ID est sensé être le même ;)


Pour que je comprenne mieux ton système peux tu m'envoyer le code du node et le paramétrage Jeedom ?
Voici mon code au complet. J'ai remplacé le HVAC par un Heater mais le résultat est le même. Si tu y vois des améliorations à faire, n'hésite pas :)
(l'info de la température est doublé mais c'est provisoire de façon à comparer avec ma valeur qui "change")

Code : Tout sélectionner

/**
* The MySensors Arduino library handles the wireless radio link and protocol
* between your home built sensors/actuators and HA controller of choice.
* The sensors forms a self healing radio network with optional repeaters. Each
* repeater and gateway builds a routing tables in EEPROM which keeps track of the
* network topology allowing messages to be routed to nodes.
*
* Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
* Copyright (C) 2013-2015 Sensnology AB
* Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
*
* Documentation: http://www.mysensors.org
* Support Forum: http://forum.mysensors.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
********************************
*
* PIN UTILISEES PAR LE NRF24L01+
* 9
* 10
* 11
* 12
* 13
* (2)
* 
* PIN UILISEES PAR I2C
* A4 (18)
* A5 (19)
* 
* 
* 
* HISTORIQUE DES REVISIONS
* v1.0 - 22.12.2017 - Creation
* 
* 
* DESCRIPTION
* - Gestion poêle à granulés par l'intermediaure du hack de la télécommande.
* 
*/


//Parametres de traitements des données
#define TRAITEMENT        6000 //Delais entre chaque traitement des données (en ms)
#define DELAIS_IR         100   //Delais entre les commandes IR
#define DELAY_ANTI_REBOND 20    //Delais anti-rebond bouton (en ms)


// Enable debug prints to serial monitor
#define MY_DEBUG

// Enable and select radio type attached
#define MY_RADIO_NRF24


// Manually set Node ID
#define MY_NODE_ID 101


#include <MySensors.h>
#include <Wire.h>
#include <Adafruit_AM2315.h>
#include <Bounce2.h>


#define PIN_BP_AUTO         A0
#define PIN_BP_Puissance    A1
#define PIN_BP_Ventilation  A2

#define PIN_Puissance        2
#define PIN_Ventilation      3
#define PIN_LED_Auto         A3
#define PIN_LED_Puissance_1  8
#define PIN_LED_Puissance_2  7
#define PIN_LED_Puissance_3  6
#define PIN_LED_Puissance_4  5
#define PIN_LED_Puissance_5  4


#define ID_Humidite     60
#define ID_Temperature  61
#define ID_Heater       70


#define EEPROM_SetPoint     1
#define EEPROM_Ventilation  2
#define EEPROM_Puissance    3
#define EEPROM_Status       4


MyMessage msg_Heater_SetPoint   (ID_Heater, V_HVAC_SETPOINT_HEAT);  //Temperature consigne chauffage
MyMessage msg_Heater_Status     (ID_Heater, V_STATUS);              //Marche / Arrêt chauffage en AUTOMATIQUE
MyMessage msg_Heater_Puissance  (ID_Heater, V_VAR1);                //Puissance
MyMessage msg_Heater_Ventilation(ID_Heater, V_VAR2);                //Vitesse ventilation
MyMessage msg_Heater_Temp       (ID_Heater, V_TEMP);

MyMessage msg_Temperature       (ID_Temperature,V_TEMP);            //Temperature ambiante
MyMessage msg_Humidite          (ID_Humidite,   V_HUM);             //Hunidité relative ambiante


Bounce BP_AUTO;
Bounce BP_Puissance;
Bounce BP_Ventilation;

Adafruit_AM2315 am2320;


//Variables pour Heater
bool  Status;
byte  SetPoint;
float Temperature;
byte  Puissance;
byte  Ventilation;
float Humidite;


//Variables pour traitement
unsigned long timer = 0;



void setup()
{
  // Définition des pins
  pinMode(PIN_Puissance,        OUTPUT);
  pinMode(PIN_Ventilation,      OUTPUT);
  pinMode(PIN_LED_Auto,         OUTPUT);
  pinMode(PIN_LED_Puissance_1,  OUTPUT);
  pinMode(PIN_LED_Puissance_2,  OUTPUT);
  pinMode(PIN_LED_Puissance_3,  OUTPUT);
  pinMode(PIN_LED_Puissance_4,  OUTPUT);
  pinMode(PIN_LED_Puissance_5,  OUTPUT);  
  
  pinMode(PIN_BP_AUTO,          INPUT_PULLUP);
  pinMode(PIN_BP_Puissance,     INPUT_PULLUP);
  pinMode(PIN_BP_Ventilation,   INPUT_PULLUP);


  // Initialisation état des pins
  digitalWrite(PIN_Puissance,   LOW);
  digitalWrite(PIN_Ventilation, LOW);

  
  //Bounce initialisation 
  BP_AUTO         = Bounce();
  BP_Puissance    = Bounce();
  BP_Ventilation  = Bounce();

  //Setup Bounce instance
  BP_AUTO.attach        (PIN_BP_AUTO);
  BP_Puissance.attach   (PIN_BP_Puissance);
  BP_Ventilation.attach (PIN_BP_Ventilation);
  
  BP_AUTO.interval        (DELAY_ANTI_REBOND);
  BP_Puissance.interval   (DELAY_ANTI_REBOND);
  BP_Ventilation.interval (DELAY_ANTI_REBOND);

  
  // Initialisation bus I2C
  Wire.begin();

  //Recherche capteur AM2320
  if (!am2320.begin()) {
    Serial.println("Capteur AM2320 non trouve !");
  }
  
  
  //Chargement et envoi dernière valeurs
  SetPoint = loadState(EEPROM_SetPoint);
  send(msg_Heater_SetPoint.set(SetPoint) );

  Status = loadState(EEPROM_Status);
  send(msg_Heater_Status.set(Status) );
  
  Puissance = loadState(EEPROM_Puissance);
  send(msg_Heater_Puissance.set(Puissance) );

  Ventilation = loadState(EEPROM_Ventilation);
  send(msg_Heater_Ventilation.set(Ventilation) );

  Temperature = am2320.readTemperature();
  send(msg_Temperature.set(Temperature,2) );

  Humidite  = am2320.readHumidity();
  send(msg_Humidite.set(Humidite,2) );
    
}






void presentation()
{
  // Send the sketch version information to the gateway and Controller
  sendSketchInfo("Poele a granules", "1.0");
  
	// Present locally attached sensors
  present(ID_Heater,      S_HEATER);
  present(ID_Temperature, S_TEMP);
  present(ID_Humidite,    S_HUM);
}






void loop()
{
  //Update bounce instance
  BP_AUTO.update();
  BP_Puissance.update();
  BP_Ventilation.update();

  
  //BOUTON ON / OFF MODE AUTOMATIQUE
  if (BP_AUTO.rose() && Status == false) {
    updateStatus(true);
  }
  else if (BP_AUTO.rose() && Status == true) {
    updateStatus(false);
  }



  // Si le Heater est en fonctionnement MANUEL
  if (Status == false) {
    
    //BOUTON PUISSANCE
    if (BP_Puissance.rose() ) {
      updatePuissance(0);
    }
  
    //BOUTON VENTILATION
    if (BP_Ventilation.rose() ) {
      updateVentilation(0);
    }
    
  }

  // Sinon le Heater est en fonctionnement AUTOMATIQUE
  else {

    // Puissance en fonction de la température
    if (Temperature <= SetPoint - 3) {
      updatePuissance(5);
    }
    else if (Temperature <= SetPoint - 2) {
      updatePuissance(4);
    }
    else if (Temperature <= SetPoint - 1) {
      updatePuissance(3);
    }
    else if (Temperature <= SetPoint) {
      updatePuissance(2);
    }
    else {
      updatePuissance(1);
    }

  }



  //Lecture et envoi à la gateway la température ambiante toute les X minutes (et surveillance de l'overflow)
  if ( millis() >= (timer + TRAITEMENT) || (millis() < timer) ) {
    
    timer = millis();

    Temperature = am2320.readTemperature();
    Humidite    = am2320.readHumidity();
    
    Serial.print("Send temperature and hunidity to gateway : ");
    Serial.print(Temperature);
    Serial.print(" °C / ");
    Serial.print(Humidite);
    Serial.println(" %");
    
    send(msg_Temperature.set(Temperature,2) );
    send(msg_Humidite.set(Humidite,2) );
    
    send(msg_Heater_Temp.set(Temperature,2) );

  }


  //Actualisation LED Auto / Manu
  if (Status)
    digitalWrite(PIN_LED_Auto, HIGH);
  else
    digitalWrite(PIN_LED_Auto, LOW);

    
  //Actualisation LED puissance
  switch (Puissance) {

    case 0:
        digitalWrite(PIN_LED_Puissance_1,  LOW);
        digitalWrite(PIN_LED_Puissance_2,  LOW);
        digitalWrite(PIN_LED_Puissance_3,  LOW);
        digitalWrite(PIN_LED_Puissance_4,  LOW);
        digitalWrite(PIN_LED_Puissance_5,  LOW);
    break;

    case 1:
        digitalWrite(PIN_LED_Puissance_1,  HIGH);
        digitalWrite(PIN_LED_Puissance_2,  LOW);
        digitalWrite(PIN_LED_Puissance_3,  LOW);
        digitalWrite(PIN_LED_Puissance_4,  LOW);
        digitalWrite(PIN_LED_Puissance_5,  LOW);
    break;

    case 2:
        digitalWrite(PIN_LED_Puissance_1,  HIGH);
        digitalWrite(PIN_LED_Puissance_2,  HIGH);
        digitalWrite(PIN_LED_Puissance_3,  LOW);
        digitalWrite(PIN_LED_Puissance_4,  LOW);
        digitalWrite(PIN_LED_Puissance_5,  LOW);
    break;

    case 3:
        digitalWrite(PIN_LED_Puissance_1,  HIGH);
        digitalWrite(PIN_LED_Puissance_2,  HIGH);
        digitalWrite(PIN_LED_Puissance_3,  HIGH);
        digitalWrite(PIN_LED_Puissance_4,  LOW);
        digitalWrite(PIN_LED_Puissance_5,  LOW);
    break;

    case 4:
        digitalWrite(PIN_LED_Puissance_1,  HIGH);
        digitalWrite(PIN_LED_Puissance_2,  HIGH);
        digitalWrite(PIN_LED_Puissance_3,  HIGH);
        digitalWrite(PIN_LED_Puissance_4,  HIGH);
        digitalWrite(PIN_LED_Puissance_5,  LOW);
    break;

    case 5:
        digitalWrite(PIN_LED_Puissance_1,  HIGH);
        digitalWrite(PIN_LED_Puissance_2,  HIGH);
        digitalWrite(PIN_LED_Puissance_3,  HIGH);
        digitalWrite(PIN_LED_Puissance_4,  HIGH);
        digitalWrite(PIN_LED_Puissance_5,  HIGH);
    break;
    
  }
  
}






void receive(const MyMessage &message)
{
  Serial.print("Incoming datas for child ID : ");
  Serial.println(message.sensor);
    
  switch (message.sensor) {

    case ID_Heater:

      if (message.type == V_HVAC_SETPOINT_HEAT) {

        Serial.print("Setpoint temperature set to : ");
        Serial.print(message.getByte());
        Serial.println(" °C");
        
        SetPoint = message.getByte();
        saveState(EEPROM_SetPoint, SetPoint);
        send(msg_Heater_SetPoint.set(SetPoint) );


      } else if (message.type == V_STATUS) {
        updateStatus(message.getBool());


      } else if (message.type == V_VAR1) {
        updatePuissance(message.getByte());

        
      } 
      else if (message.type == V_VAR2) {
        updateVentilation(message.getByte());


      } else {
        Serial.println("Unknown message type!");
      }
      
    break;

    default:
      Serial.println("Unknown ID !");
    break;
  }
  
}






void updateStatus(bool NouveauStatus)
{
  Serial.print("Set Auto Heater : ");
  Serial.println(NouveauStatus);

  if (NouveauStatus == true) {
    Status = true;
  }
  else {
    Status = false;
  }

  //Mémorisation status actuelle
  saveState(EEPROM_Status, Status);
  
  //Envoi info à la gateway
  send(msg_Heater_Status.set(Status) );
}






// Envoi le nombre d'impulsion en IR pour régler la puissance
void updatePuissance(byte PuissanceDemande)
{

  //On execute seulement si la puissance change OU si puissance + 1
  if (PuissanceDemande != Puissance || PuissanceDemande == 0) {
    
    Serial.print("Set Heater power from : ");
    Serial.print(Puissance);
    Serial.print(" to : ");
    Serial.print(PuissanceDemande);
  
    //Si paramètre = 0 alors juste Puissance + 1)
    if (PuissanceDemande == 0) {
      
      puissanceIR();

      Puissance++;
      if (Puissance > 5) Puissance = 0;
      
    } 
    
    //Sinon boucle jusqu'a puissance demandée
    else
    {
      
      while (Puissance != PuissanceDemande) {
        
        puissanceIR();

        Puissance++;

        //Si on arrive à puissance 0
        if (Puissance > 5) {

          // On passe à puissance 1
          puissanceIR();
          Puissance = 1;
          
        }
        
      }
      
    }

    Serial.println(" ...Done");
    
    //Envoi info à la gateway
    send(msg_Heater_Puissance.set(Puissance) );
  
    //Mémorisation puissance actuelle
    saveState(EEPROM_Puissance, Puissance);

  }

}






// Envoi le nombre d'impulsion en IR pour régler la ventilation
void updateVentilation(byte VentilationDemande)
{

  ///On execute seulement si la ventilation change OU si ventilation + 1
  if (VentilationDemande != Ventilation || VentilationDemande == 0) {
    
    Serial.print("Set Heater fan speed from : ");
    Serial.print(Ventilation);
    Serial.print(" to : ");
    Serial.print(VentilationDemande);
  
    //Si paramètre = 0 alors juste Ventilation + 1)
    if (VentilationDemande == 0)
    {
      ventilationIR();
  
      Ventilation++;
  
      if (Ventilation> 6) Ventilation= 1;
    } 
    
    //Sinon boucle jusqu'a puissance demandée
    else
    {
      while (Ventilation != VentilationDemande) {
        
        ventilationIR();
  
        Ventilation++;
  
        if (Ventilation > 6) Ventilation = 1;
      }
      
    }
  
    Serial.println(" ...Done");
    
    //Envoi info à la gateway
    send(msg_Heater_Ventilation.set(Ventilation) );
  
    //Mémorisation puissance actuelle
    saveState(EEPROM_Ventilation, Ventilation);
  
  }

}



void puissanceIR()
{
  digitalWrite(PIN_Puissance, HIGH);
  wait(DELAIS_IR);
  digitalWrite(PIN_Puissance, LOW);
  wait(DELAIS_IR);
}



void ventilationIR()
{
  digitalWrite(PIN_Ventilation, HIGH);
  wait(DELAIS_IR);
  digitalWrite(PIN_Ventilation, LOW);
  wait(DELAIS_IR);
}

Image

tonnerre33
Timide
Messages : 159
Inscription : 28 déc. 2015, 15:44
Localisation : Bordeaux

Re: Affichage de valeur erronée suite à l'envoi d'une commande

Message par tonnerre33 » 09 janv. 2018, 23:07

D'après ce que j'ai compris, ton problème était lors de l'envoi de la consigne uniquement ?
Du coup tu pourrais pas juste changer le champs "ID capteur" de la consigne sur Jeedom et modifier ton code dans le node ?
En gros essaye de laisser Humidité , Température et Radiateur à un ID de 60
et passe tous les paramètrages en ID 70

Par contre le code que tu m'as envoyé est étrange. Dans le receive il y a une comparaison à ID_Heater qui n'est pas SET avant, et il y a un send(msg_Heater_SetPoint.set(SetPoint) ); non défini avant également.

Le problème exposé dans ton premier message peut venir de ce send.
Si tu pouvais m'envoyer le code que tu avais à l'origine ;)

Fifut
Timide
Messages : 14
Inscription : 26 avr. 2017, 18:49

Re: Affichage de valeur erronée suite à l'envoi d'une commande

Message par Fifut » 10 janv. 2018, 22:44

D'après ce que j'ai compris, ton problème était lors de l'envoi de la consigne uniquement ?
Du coup tu pourrais pas juste changer le champs "ID capteur" de la consigne sur Jeedom et modifier ton code dans le node ?
En gros essaye de laisser Humidité , Température et Radiateur à un ID de 60
et passe tous les paramètrages en ID 70
Lors de l'envoi de n'importe quel paramètre au sensor.
Je vais faire comme tu as dit : laisser Humidité , Température et Radiateur avec le même ID est mettre un ID différent pour tous les paramètre à envoyer.

Par contre le code que tu m'as envoyé est étrange. Dans le receive il y a une comparaison à ID_Heater qui n'est pas SET avant, et il y a un send(msg_Heater_SetPoint.set(SetPoint) ); non défini avant également.
Je comprend pas ce que tu veux dire par ID_Heater qui n'est pas SET? Mon ID est défini en début de programme par un #define et je récupère pour quel ID est destiné le message avec message.sensor
Quand au send(...) c'était pour essayer de renvoyer le paramètre que le nœud venait de recevoir pour palier au problème dans Jeedom, mais au finale avec ou sans ça ne change rien, je vais les retirer.

Si tu pouvais m'envoyer le code que tu avais à l'origine ;)
Le code que j’avais à l'origine est exactement le même que celui que j’ai posté, sauf qu'au lieu d'un S_HEATER j'avais un S_HAVC. Ce qui au finale ne change rien.


J’essaie de tester tout ceci demain !

tonnerre33
Timide
Messages : 159
Inscription : 28 déc. 2015, 15:44
Localisation : Bordeaux

Re: Affichage de valeur erronée suite à l'envoi d'une commande

Message par tonnerre33 » 11 janv. 2018, 19:48

Ok j'ai compris pour le #define ID_Heater, je ne sais pas faire une recherche avec notepad++ XD j'étais en bas de la page et il me disait qu'il n'y avait pas de résultats ^^

tonnerre33
Timide
Messages : 159
Inscription : 28 déc. 2015, 15:44
Localisation : Bordeaux

Re: Affichage de valeur erronée suite à l'envoi d'une commande

Message par tonnerre33 » 13 janv. 2018, 13:01

Alors tes essais ?

Fifut
Timide
Messages : 14
Inscription : 26 avr. 2017, 18:49

Re: Affichage de valeur erronée suite à l'envoi d'une commande

Message par Fifut » 14 janv. 2018, 21:15

Alors tes essais ?
Plus ou moins terminées ;)

J'ai défini une ID par "message". Et déclarer autant de S_HEATER que de message.

Code : Tout sélectionner

#define ID_Heater_SetPont     70
#define ID_Heater_Status      71
#define ID_Heater_Puissance   72
#define ID_Heater_Ventilation 73
#define ID_Heater_Temperature 74

MyMessage msg_Heater_SetPoint   (ID_Heater_SetPont,     V_HVAC_SETPOINT_HEAT);
MyMessage msg_Heater_Status     (ID_Heater_Status,      V_STATUS);
MyMessage msg_Heater_Puissance  (ID_Heater_Puissance,   V_VAR1);
MyMessage msg_Heater_Ventilation(ID_Heater_Ventilation, V_VAR2);
MyMessage msg_Heater_Temperature(ID_Heater_Temperature, V_TEMP); 

void presentation()
{
  // Send the sketch version information to the gateway and Controller
  sendSketchInfo("Poele a granules", "1.0");
  
  // Present locally attached sensors
  present(ID_Heater_SetPont,      S_HEATER);
  present(ID_Heater_Status,       S_HEATER);
  present(ID_Heater_Puissance,    S_HEATER);
  present(ID_Heater_Ventilation,  S_HEATER);
  present(ID_Heater_Temperature,  S_HEATER);
 }
Apparait donc dans Jeedom autant de S_Heater que de message avec pour chacun, une "info" et deux "action" (paramétrage 1 ON et 0 OFF).
Chose étrange, ces deux paramétrage sont définit par défaut sur le type de donné 22 (V_HVAC_SPEED)? Elle devrais plutôt pointé sur 2 (V_STATUS)!

Image

Bref rien de grave, j'ai changé tout ceci pour correspondre à ma configuration. Dans mon nœud j'ai modifié ma fonction receive de façon à traiter toutes les ID. Maintenant tout fonctionne bien, il n'y à plus le problème cité précédemment.
Le seul point négatif c'est qu'à chaque présentation du nœud (redémarrage), si une ID à moins de 2 "action" de déclarées, il s'en recréer automatiquement pour combler le manque. Les supprimer ne change rien, elles reviennent automatiquement. En revanche, si elles possédaient déjà deux "action" rien n'est ajouté. Pour palier à ce problème, j'ai juste décoché la visibilité de ces deux "action".

Merci à toi tonnerre33 !

Avis au admin, je pense qu'il faudrait épingler un sujet traitant de ce problème (je pense au poste de Barbapapa viewtopic.php?f=35&t=26867), car nous somme beaucoup à ne pas avoir compris la particularité des ID pour le couple Jeedom/MySensors. Et pour ma part, ne sachant pas vraiment comment expliquer mon problème, je n'ai pas vu les autres postes qui traitaient de ce problème.

tonnerre33
Timide
Messages : 159
Inscription : 28 déc. 2015, 15:44
Localisation : Bordeaux

Re: Affichage de valeur erronée suite à l'envoi d'une commande

Message par tonnerre33 » 16 janv. 2018, 20:46

Fifut a écrit :
14 janv. 2018, 21:15
...
Tu n'as qu'à déclarer les autres sensors en autre chose que S_HEATER au moins tu n'auras pas la création automatique des commandes.
Tu mets par exemple ta ventilation en S_HEATER, la température et SetPont en S_TEMP, la puissance en S_POWER et ton status en S_HVAC ;)

Dis moi ce que ca donne.

Fifut
Timide
Messages : 14
Inscription : 26 avr. 2017, 18:49

Re: Affichage de valeur erronée suite à l'envoi d'une commande

Message par Fifut » 27 janv. 2018, 22:07

J'ai fait quelques testes. Même si ces derniers temps, je l’avoue, j'ai mis en stand-by ma domotique.
Tu mets par exemple ta ventilation en S_HEATER, la température et SetPont en S_TEMP, la puissance en S_POWER et ton status en S_HVAC ;)
Effectivement c'est mieux à la présentation du nœud, ça correspond mieux à la réalité. Mais certaines actions ne corresponde pas à ce que j'ai besoin et sont toujours ajoutées automatiquement si je les supprime.

Bref pas grave sa fonctionne de toute façon.

tonnerre33
Timide
Messages : 159
Inscription : 28 déc. 2015, 15:44
Localisation : Bordeaux

Re: Affichage de valeur erronée suite à l'envoi d'une commande

Message par tonnerre33 » 28 janv. 2018, 17:53

Si tu me dis ce que tu obtiens et ce que tu souhaites, je pourrai peut être t'aider.
En fait j'analyse le code du plugin pour te guider :)

Répondre

Revenir vers « [Plugin Tiers] MySensors »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 2 invités