Page 1 sur 1

Utilisation de VAR1

Publié : 11 nov. 2017, 18:30
par pataqua
Bonjour,
je souhaite réaliser un suivi de la consommation de mon chauffe eau.
J'utilise une carte "maison" mysensors à base d'arduino La mesure de la consommation s'effectuant à l'aide d'un transformateur de courant.
Aucun problème pour l'information de puissance, en revanche je bloque un peu sur la consommation.
Je pense que DOMOTICZ reporte les KWH en cumulé c'est a dire qu'il n'affiche que la différence depuis la dernière mesure.
Pour cela je souhaite récupérer cette dernière valeur dans DOMOTICZ .
J'ai donc tenté d'utiliser V_VAR1 pour retrouver ma valeur, mais je ne comprends pas comment associer cette variable avec mon info de KWH.
Lors de la commande request( CHILD_ID_KWH,V_VAR1); je récupère une valeur de 59.0 qui ne correspond a rien.
Quelqu'un a t'il une idée?
voila un extrait de mon code (je n'ai conservé que les éléments concernés par ma question..)
Merci d'avance.

Code : Tout sélectionner

// Enable and select radio type attached
#define MY_RADIO_NRF24
//#define MY_RADIO_RFM69
#define MY_NODE_ID 6

#include <MySensors.h>
#include <OneWire.h> // Inclusion de la librairie OneWire
#define DS18B20 0x28     // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 3 // Broche utilisée pour le bus 1-Wire

OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds

#define SN "Wattmetre"
#define SV "1.0"
#define CHILD_ID_WATT 1
#define CHILD_ID_TEMP 2
#define CHILD_ID_KWH 3

MyMessage powerMsg(CHILD_ID_WATT, V_WATT);
MyMessage tempMsg(CHILD_ID_TEMP, V_TEMP);
MyMessage kwhMsg(CHILD_ID_KWH, V_KWH);


int pwr;
float puissance;
static float conso;
float kwh;
int valeur;


void presentation() {
  // Send the Sketch Version Information to the Gateway
  sendSketchInfo(SN, SV);

  present(CHILD_ID_WATT, S_POWER);
  present (CHILD_ID_TEMP, S_TEMP);
  present(CHILD_ID_KWH, S_POWER);


}
void setup()
{
  //Recuperation ancienne valeur de la consommation
 
  request( CHILD_ID_KWH,V_VAR1);
  
}
void receive(const MyMessage &message)
{
  if (message.type == V_VAR1)
  {
    kwh=atoi(message.data);
  }

Re: Utilisation de VAR1

Publié : 12 nov. 2017, 11:17
par digdogger
Salut,
c'est apparemment parce que domoticz répond uniquement aux demandes de certains types de capteurs. KWh n'en fait pas partie.
Essaie avec V_TEXT.

Jette un oeil ici, cette solution a fonctionné pour lui.

Re: Utilisation de VAR1

Publié : 12 nov. 2017, 16:03
par pataqua
Merci pour cette réponse.

Dans mon cas V_TEXT ne donne pas plus de résultat que V_VAR1.
Je vais donc me contenter de stocker la valeur en local dans l'Eeprom.
Comme la carte n'est alimentée qu'en heures creuses, il est important de retrouver la dernière valeur.

Re: Utilisation de VAR1

Publié : 12 nov. 2017, 16:31
par Fredok
Bonjour, j'utilise un capteur MSensor avec 2 pinces Amperemetrique qui envoit vers DZ et informe 2 compteurs MySensors.
dans le presentation, il y a 2 request pour V_VAR1 et V_VAR2
concernant le receive j'ai ça
...

Code : Tout sélectionner

void receive(const MyMessage &message)
{
  if (message.type == V_VAR1)
  {
    nrj1  = message.getFloat();
    Serial.print("Received last nrj count from gw:");
    Serial.println(nrj1);
    pcReceived1 = true;
  }

  if (message.type == V_VAR2)
  {
    nrj2  = message.getFloat();
    Serial.print("Received last nrj count from gw:");
    Serial.println(nrj2);
    pcReceived2 = true;
  }

}
Les variables pcReceived indique au code qu'on a bien reçu les valeurs de chaque compteur.
et il n'y a pas de problème particulier.

Bon WE

Re: Utilisation de VAR1

Publié : 12 nov. 2017, 17:47
par pataqua
Je vais tester cette méthode et je vous tiens au courant.
Pour le moment j'ai créé deux fonctions qui permettent de lire et d’écrire ma valeur dans l'Eeprom et cela fonctionne bien.
Pour préserver l'Eeprom je n'enregistre la valeur que si elle a évoluée.

Code : Tout sélectionner

float lecprom()
{
  //On lit les 3 octets
  int byte1 = loadState(2);
  int byte2 = loadState(3);
  float decim = loadState(4);

  float decim2 = (decim / 100); //on deplace les décimales
  
  //on recrée la valeur décimale
  float oldkwh = (((byte1 << 8) | byte2) + decim2);
  return oldkwh;
}

void saveprom(float kwhvalue)
{

  int entier = int(kwhvalue); //On extrait la partie entiere

  // on extrait les décimales et on les multiplie par 100
  float decim = ((kwhvalue - entier) * 100);

  //On separe en deux octets
  int Byte2 = byte(entier);
  int Byte1 = byte(entier >> 8);
  int Byte3 = byte(decim);

  saveState (2, Byte1);
  saveState (3, Byte2);
  saveState (4, Byte3);


}

Re: Utilisation de VAR1

Publié : 14 nov. 2017, 11:46
par ricorico94
Bonjour,

Pour avoir beaucoup galéré moi-même il y a quelques semaiens avec les V_Text et V_VARx, voici quelques éclaircissements qui peuvent t'aider.
Avec Domoticz, un capteur peut stocker des informations dans Domoticz grâce à V_VAR1..5 : le capteur peut les écrire et les lire, mais domoticz ne peut pas y accéder (ie même avec des scripts, tu ne peux pas les utiliser dans domoticz, sauf si tu arrives à faire des appels SQL vers la base de donnée domoticz..). Ces V_VARx évitent donc d'utiliser l'EEPROM qui aime peu les écritures.
Pour que Domoticz puisse envoyer des infos vers le capteur, il faut utiliser V_TEXT uniquement : le capteur peut lire et écrire V_TEXT et Domoticz (en LUA pr exemple) peut lire et écrire cette variable. Pour pouvoir utiliser V_TEXT, il faut l'initialiser dans domoticz par une écriture PAR LE CAPTEUR la première fois où tu essaies de connecter le capteur (donc il faut bien mettre Domoticz en inclusion à moment-là, sinon ta gateway va voir ce champ V_TEXT (dès lors visible dans matériel/mysensors/réglages), mais pas Domoticz).

Pour l'usage des V_VAR1, l'exemple MYsensors des Pulse water meter peut être utilisé. Pour l'usage de V_TEXT, j'avais posté des exemples sur le forum Mysensors.

cdlt
Ricorico94