[Tuto diy] Compteur impulsion eau/gas+rfxmeter maison 5€ (rfxcom) pour les nuls

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
Soyez précis quant aux prérequis, les manips à faire pour que votre bijou fonctionne (des chmod ?, un apt-get à faire ...)
Décrivez précisément son fonctionnement.
Merci d'utiliser la balise correspondante à votre sujet : [Tuto], [Plugin], [DzVents], [LUA], [Python], [Bash] ...
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
mulot35
Messages : 200
Enregistré le : 20 déc. 2014, 00:27

[Tuto diy] Compteur impulsion eau/gas+rfxmeter maison 5€ (rfxcom) pour les nuls

Message par mulot35 »

_______________________________________
Pour finaliser:
Je préfère la solution n°2 chez moi elle est plus réactive (on attend pas la fin de l'heure pour avoir ca conso).
Toutefois l'affichage est en KWh (pour les M3) et en watt (pour les litres) et le rapport du graphique ne donnera pas la vrai facture en euros car il regarde le prix du KWh dans les paramètres.(contrairement a la solution une)

Je n'ai pas détecté d'erreur dans mon script mais n’hésiter pas a l'améliorer et a partager.

Voila a vos fer a souder....
_______________________________________

Salut ,
Vu le succée du tuto sonde oregon pour les nuls (viewtopic.php?f=7&t=240) je me suis dit que je n'été pas la seul quiche en arduino du coup voici le tuto pour faire un rfxmetercounter + sonde dht22
Votre arduino nano seras reconnu comme un rfx meter.

L'article du Pro:
-La domotique vu par Equinoxe : http://www.equinoxefr.org/post/2015/01/ ... -domoticz/

Commande:
A prendre pour le rfxmeter:
-"Arduino" nano http://fr.aliexpress.com/item/Freeshipp ... 51505.html 2.45$
-1 sonde dht 22 1.5€ chez aliexpress
-2 LED (rouge et verte)
-1 capteur si non fourni avec le compteur
-3 Résistances 10 kohms,1 kohms,1 kohms.
-1 alim 5v (raspi ??)
-cable...
-Plaque d'essai ....
_____________________________________________________________________________________________
La base:
1-Télécharger et installer le logiciel Arduino
http://arduino.cc/download.php?f=/ardui ... indows.exe
2-Brancher l'arduino
3-Vérifier dans le gestionnaire de périphérique que l'arduino est bien reconnu
=>Si non reconnu installer le driver et allez pointer sur le dossier fraichement installé dans le dossier driver (c:program files/arduino/drivers)
=>Vous pouvez en profiter pour regarder le port com de l'arduino (dans Ports(com et LPT) USB-SERIAL CH340(COM3)chez moi)
4-Débrancher / redemarrer
5-Pour que la carte Arduino soit capable de programmer :
- Branchez la carte Arduino Uno au port USB de votre ordinateur
- Lancer le programme Arduino
- Allez dans ( outils/port série) sélectionnez le port COM sur le quel est connecté la carte Arduino Nano.
- Dans la nouvelle fenetre allez dans ( Outils/Type de carte) cliquez sur ( Arduino Nano w/ATmega328 )
- Allez dans ( outils/programmateur) sélectionnez USBasp.
- Allez dans ( Fichier/exemple) et cliquez sur ( ArduinoISP )
_____________________________________________________________________________________________
les mains dans le cambouis.
1-Copier le script de Equinoxe https://github.com/equinoxefr/gasMonito ... onitor.ino ou celui ci dessous.

Code : Tout sélectionner

// Gas monitoring device / Code from EquinoxeFR
// RFXmeter code from pyrou https://github.com/pyrou/x10rf
// OOK oregon encoding from http://connectingstuff.net/blog/encodage-protocoles-oregon-scientific-sur-arduino/


#include <x10rf.h>
//#include <Energia.h>
#include <avr/eeprom.h>
#include <dht.h>


#define SCHEMA 69 // Change value to initialize or reset the EEPROM
//#define DEBUG 1 // serial debug
#define WITHDHT22
#define DHT22_PIN 5 // Temp/humidity sensor pin
#define txPin 7 // RF 433MHz module
#define txRetry 5 // delay for retry when sending packets
#define transmitLedPin 13 
#define reedLedPin 12
#define rfxSensorID 12
#define reedInterrupt 0 // Reed switch pin
#define delayPulse 5 // wait between two pulses. Avoid false reading with slow rotation


#define SEND_HIGH() digitalWrite(txPin, HIGH)
#define SEND_LOW() digitalWrite(txPin, LOW)
const unsigned long TIME = 512;
const unsigned long TWOTIME = TIME*2;
byte OregonMessageBuffer[9];
dht DHT;
unsigned long pulses = 0;
unsigned long previousPulses = 0;
int timer1_counter;
volatile unsigned long timerEeprom = 0;
volatile unsigned long timerSend = 0;
volatile unsigned long timerDebounce = 0;
volatile unsigned long lastDebounce = 0;

x10rf myx10 = x10rf(txPin,transmitLedPin,txRetry);

void setup()
{
  byte status=0;
  myx10.begin();
  
#ifdef DEBUG
  Serial.begin(9600);
#endif

  // Timer1 5Hz
  noInterrupts();           // disable all interrupts
  TCCR1A = 0;
  TCCR1B = 0;
  timer1_counter = 53036;   // preload timer 65536-16MHz/256/5Hz
  TCNT1 = timer1_counter;   // preload timer
  TCCR1B |= (1 << CS12);    // 256 prescaler 
  TIMSK1 |= (1 << TOIE1);   // enable timer overflow interrupt
  interrupts();             // enable all interrupts

    // EEProm init or read
  eeprom_read_block((void*)&status, (void*)0, sizeof(status));
  if (status != SCHEMA)
  {
#ifdef DEBUG
    Serial.println("New EEPROM detected. Initializing...");
#endif
    status=SCHEMA;
    // writing SCHEMA version
    eeprom_write_block((const void*)&status, (void*)0, sizeof(status));
    // writing initial pulse count (0)
    eeprom_write_block((const void*)&pulses, (void*)1, sizeof(pulses));
  }
  else
  {
    // reading pulses from EEprom
    eeprom_read_block((void*)&pulses, (void*)1, sizeof(pulses));
  }
  previousPulses=pulses;
#ifdef DEBUG
  Serial.print("Reading data from eeprom: ");
  Serial.println(pulses);
#endif
#ifdef WITHDHT22
  // Setup OOK packets for Oregon sensors
  byte ID[] = {
    0x1A,0x2D  };
  setType(OregonMessageBuffer, ID);
  setChannel(OregonMessageBuffer, 0x20);
  setId(OregonMessageBuffer, 0xBB);
#endif
  // Setup pins
  pinMode(transmitLedPin,OUTPUT);
  pinMode(reedLedPin,OUTPUT);
  pinMode(reedInterrupt,INPUT);

  // Interrupt for reed switch
  attachInterrupt(reedInterrupt, debounceInterrupt, RISING);
}

// Main loop
void loop()
{

  // Saving pulses to EEprom every hour (100 000 write cycles allowed)  
  if (timerEeprom >= 3600*5)
  {
    timerEeprom=0;
    if (pulses != previousPulses)
    {
#ifdef DEBUG
      Serial.println("Saving data to eeprom");
#endif
      eeprom_write_block((const void*)&pulses, (void*)1, sizeof(pulses));
    }

  }

  // Sending RF packets every 30s  
  if (timerSend >= 30*5)
  {
    timerSend=0;
    myx10.RFXmeter(rfxSensorID,0,pulses);
#ifdef WITHDHT22
    int chk = DHT.read22(DHT22_PIN);
#ifdef DEBUG
    Serial.print("Temp: ");
    Serial.println(DHT.temperature, 1);
    Serial.print("Humidity: ");
    Serial.println(DHT.humidity, 1);
#endif
    setBatteryLevel(OregonMessageBuffer, 1);
    setTemperature(OregonMessageBuffer, DHT.temperature);
    setHumidity(OregonMessageBuffer, DHT.humidity); 
    calculateAndSetChecksum(OregonMessageBuffer);
    sendOregon(OregonMessageBuffer, sizeof(OregonMessageBuffer));
    SEND_LOW();
    delayMicroseconds(TWOTIME*8);
    sendOregon(OregonMessageBuffer, sizeof(OregonMessageBuffer));
    SEND_LOW();
    
#endif

  }
}


// Timer1 interrupt. Managing timers
ISR(TIMER1_OVF_vect)        // interrupt service routine 
{
  TCNT1 = timer1_counter;   // preload timer
  timerEeprom++;
  timerSend++;
  timerDebounce++;
}


// Reed switch interrupt with debounce
void debounceInterrupt() {
#ifdef DEBUG
  Serial.println("Int !!!");
  Serial.println(timerDebounce);
  Serial.println(lastDebounce);
#endif
  if ((timerDebounce - lastDebounce) >= delayPulse * 5) 
  {                                                  
    lastDebounce = 0;
    timerDebounce = 0;
    Interrupt();
  }

}

// Reed switch
void Interrupt() {
#ifdef DEBUG
  Serial.println("New pulse !");
#endif
  pulses++;
  digitalWrite(reedLedPin,HIGH);
  delay(800);
  digitalWrite(reedLedPin,LOW);
}

// Other code is from http://connectingstuff.net/blog/encodage-protocoles-oregon-scientific-sur-arduino/
// Copy and paste :)


/**
 * \brief    Send logical "0" over RF
 * \details  azero bit be represented by an off-to-on transition
 * \         of the RF signal at the middle of a clock period.
 * \         Remenber, the Oregon v2.1 protocol add an inverted bit first
 */
inline void sendZero(void)
{
  SEND_HIGH();
  delayMicroseconds(TIME);
  SEND_LOW();
  delayMicroseconds(TWOTIME);
  SEND_HIGH();
  delayMicroseconds(TIME);
}

/**
 * \brief    Send logical "1" over RF
 * \details  a one bit be represented by an on-to-off transition
 * \         of the RF signal at the middle of a clock period.
 * \         Remenber, the Oregon v2.1 protocol add an inverted bit first
 */
inline void sendOne(void)
{
  SEND_LOW();
  delayMicroseconds(TIME);
  SEND_HIGH();
  delayMicroseconds(TWOTIME);
  SEND_LOW();
  delayMicroseconds(TIME);
}

/**
 * Send a bits quarter (4 bits = MSB from 8 bits value) over RF
 *
 * @param data Source data to process and sent
 */

/**
 * \brief    Send a bits quarter (4 bits = MSB from 8 bits value) over RF
 * \param    data   Data to send
 */
inline void sendQuarterMSB(const byte data)
{
  (bitRead(data, 4)) ? sendOne() : sendZero();
  (bitRead(data, 5)) ? sendOne() : sendZero();
  (bitRead(data, 6)) ? sendOne() : sendZero();
  (bitRead(data, 7)) ? sendOne() : sendZero();
}

/**
 * \brief    Send a bits quarter (4 bits = LSB from 8 bits value) over RF
 * \param    data   Data to send
 */
inline void sendQuarterLSB(const byte data)
{
  (bitRead(data, 0)) ? sendOne() : sendZero();
  (bitRead(data, 1)) ? sendOne() : sendZero();
  (bitRead(data, 2)) ? sendOne() : sendZero();
  (bitRead(data, 3)) ? sendOne() : sendZero();
}

/******************************************************************/
/******************************************************************/
/******************************************************************/

/**
 * \brief    Send a buffer over RF
 * \param    data   Data to send
 * \param    size   size of data to send
 */
void sendData(byte *data, byte size)
{
  for(byte i = 0; i < size; ++i)
  {
    sendQuarterLSB(data[i]);
    sendQuarterMSB(data[i]);
  }
}

/**
 * \brief    Send an Oregon message
 * \param    data   The Oregon message
 */
void sendOregon(byte *data, byte size)
{
  sendPreamble();
  //sendSync();
  sendData(data, size);
  sendPostamble();
}

/**
 * \brief    Send preamble
 * \details  The preamble consists of 16 "1" bits
 */
inline void sendPreamble(void)
{
  byte PREAMBLE[]={
    0xFF,0xFF  };
  sendData(PREAMBLE, 2);
}

/**
 * \brief    Send postamble
 * \details  The postamble consists of 8 "0" bits
 */
inline void sendPostamble(void)
{
#ifdef THN132N
  sendQuarterLSB(0x00);
#else
  byte POSTAMBLE[]={
    0x00  };
  sendData(POSTAMBLE, 1); 
#endif
}

/**
 * \brief    Send sync nibble
 * \details  The sync is 0xA. It is not use in this version since the sync nibble
 * \         is include in the Oregon message to send.
 */
inline void sendSync(void)
{
  sendQuarterLSB(0xA);
}

/******************************************************************/
/******************************************************************/
/******************************************************************/

/**
 * \brief    Set the sensor type
 * \param    data       Oregon message
 * \param    type       Sensor type
 */
inline void setType(byte *data, byte* type)
{
  data[0] = type[0];
  data[1] = type[1];
}

/**
 * \brief    Set the sensor channel
 * \param    data       Oregon message
 * \param    channel    Sensor channel (0x10, 0x20, 0x30)
 */
inline void setChannel(byte *data, byte channel)
{
  data[2] = channel;
}

/**
 * \brief    Set the sensor ID
 * \param    data       Oregon message
 * \param    ID         Sensor unique ID
 */
inline void setId(byte *data, byte ID)
{
  data[3] = ID;
}

/**
 * \brief    Set the sensor battery level
 * \param    data       Oregon message
 * \param    level      Battery level (0 = low, 1 = high)
 */
void setBatteryLevel(byte *data, byte level)
{
  if(!level) data[4] = 0x0C;
  else data[4] = 0x00;
}

/**
 * \brief    Set the sensor temperature
 * \param    data       Oregon message
 * \param    temp       the temperature
 */
void setTemperature(byte *data, float temp)
{
  // Set temperature sign
  if(temp < 0)
  {
    data[6] = 0x08;
    temp *= -1; 
  }
  else
  {
    data[6] = 0x00;
  }

  // Determine decimal and float part
  int tempInt = (int)temp;
  int td = (int)(tempInt / 10);
  int tf = (int)round((float)((float)tempInt/10 - (float)td) * 10);

  int tempFloat =  (int)round((float)(temp - (float)tempInt) * 10);

  // Set temperature decimal part
  data[5] = (td << 4);
  data[5] |= tf;

  // Set temperature float part
  data[4] |= (tempFloat << 4);
}

/**
 * \brief    Set the sensor humidity
 * \param    data       Oregon message
 * \param    hum        the humidity
 */
void setHumidity(byte* data, byte hum)
{
  data[7] = (hum/10);
  data[6] |= (hum - data[7]*10) << 4;
}

/**
 * \brief    Sum data for checksum
 * \param    count      number of bit to sum
 * \param    data       Oregon message
 */
int Sum(byte count, const byte* data)
{
  int s = 0;

  for(byte i = 0; i<count;i++)
  {
    s += (data[i]&0xF0) >> 4;
    s += (data[i]&0xF);
  }

  if(int(count) != count)
    s += (data[count]&0xF0) >> 4;

  return s;
}

/**
 * \brief    Calculate checksum
 * \param    data       Oregon message
 */
void calculateAndSetChecksum(byte* data)
{
#ifdef THN132N
  int s = ((Sum(6, data) + (data[6]&0xF) - 0xa) & 0xff);

  data[6] |=  (s&0x0F) << 4;     
  data[7] =  (s&0xF0) >> 4;
#else
  data[8] = ((Sum(8, data) - 0xa) & 0xFF);
#endif
}


2-Lancer arduino et coller le script fraichement copier.
2,5-La ligne "#define delayPulse 5 // wait between two pulses. Avoid false reading with slow rotation" peut etre edité pour supprimer des faux positif ici l'arduino n'accepte que 1 pulsation toute les 5 secondes.
3-faire un fichier enregistrer sous mes documents/arduino/gasMonitor.ino
4-Dans mes documents/arduino/libraries cree un dossier dht
5-Dans dht cree 2 fichier txt dhth.txt et un dhtcpp.txt
6-Dans dhth.txt coller le script du meme nom trouvé ici http://playground.arduino.cc/Main/DHTLib ou ci dessous puis enregistrer et le renommer en dht.h

Code : Tout sélectionner

//     URL: http://arduino.cc/playground/Main/DHTLib
//
// HISTORY:
// see dht.cpp file
//

#ifndef dht_h
#define dht_h

#if ARDUINO < 100
#include <WProgram.h>
#else
#include <Arduino.h>
#endif

#define DHT_LIB_VERSION "0.1.14"

#define DHTLIB_OK                0
#define DHTLIB_ERROR_CHECKSUM   -1
#define DHTLIB_ERROR_TIMEOUT    -2
#define DHTLIB_INVALID_VALUE    -999

#define DHTLIB_DHT11_WAKEUP     18
#define DHTLIB_DHT_WAKEUP       1

// max timeout is 100 usec.
// For a 16 Mhz proc 100 usec is 1600 clock cycles
// loops using DHTLIB_TIMEOUT use at least 4 clock cycli
// so 100 us takes max 400 loops
// so by dividing F_CPU by 40000 we "fail" as fast as possible
#define DHTLIB_TIMEOUT (F_CPU/40000)

class dht
{
public:
    // return values:
    // DHTLIB_OK
    // DHTLIB_ERROR_CHECKSUM
    // DHTLIB_ERROR_TIMEOUT
    int read11(uint8_t pin);
    int read(uint8_t pin);

    inline int read21(uint8_t pin) { return read(pin); };
    inline int read22(uint8_t pin) { return read(pin); };
    inline int read33(uint8_t pin) { return read(pin); };
    inline int read44(uint8_t pin) { return read(pin); };

    double humidity;
    double temperature;

private:
    uint8_t bits[5];  // buffer to receive data
    int _readSensor(uint8_t pin, uint8_t wakeupDelay);
};
#endif
//
// END OF FILE
//
8-Meme chose pour le cpp

Code : Tout sélectionner

//
//    FILE: dht.cpp
//  AUTHOR: Rob Tillaart
// VERSION: 0.1.14
// PURPOSE: DHT Temperature & Humidity Sensor library for Arduino
//     URL: http://arduino.cc/playground/Main/DHTLib
//
// HISTORY:
// 0.1.14 replace digital read with faster (~3x) code => more robust low MHz machines.
// 0.1.13 fix negative temperature
// 0.1.12 support DHT33 and DHT44 initial version
// 0.1.11 renamed DHTLIB_TIMEOUT
// 0.1.10 optimized faster WAKEUP + TIMEOUT
// 0.1.09 optimize size: timeout check + use of mask
// 0.1.08 added formula for timeout based upon clockspeed
// 0.1.07 added support for DHT21
// 0.1.06 minimize footprint (2012-12-27)
// 0.1.05 fixed negative temperature bug (thanks to Roseman)
// 0.1.04 improved readability of code using DHTLIB_OK in code
// 0.1.03 added error values for temp and humidity when read failed
// 0.1.02 added error codes
// 0.1.01 added support for Arduino 1.0, fixed typos (31/12/2011)
// 0.1.00 by Rob Tillaart (01/04/2011)
//
// inspired by DHT11 library
//
// Released to the public domain
//

#include "dht.h"

/////////////////////////////////////////////////////
//
// PUBLIC
//

// return values:
// DHTLIB_OK
// DHTLIB_ERROR_CHECKSUM
// DHTLIB_ERROR_TIMEOUT
int dht::read11(uint8_t pin)
{
    // READ VALUES
    int rv = _readSensor(pin, DHTLIB_DHT11_WAKEUP);
    if (rv != DHTLIB_OK)
    {
        humidity    = DHTLIB_INVALID_VALUE; // invalid value, or is NaN prefered?
        temperature = DHTLIB_INVALID_VALUE; // invalid value
        return rv;
    }

    // CONVERT AND STORE
    humidity    = bits[0];  // bits[1] == 0;
    temperature = bits[2];  // bits[3] == 0;

    // TEST CHECKSUM
    // bits[1] && bits[3] both 0
    uint8_t sum = bits[0] + bits[2];
    if (bits[4] != sum) return DHTLIB_ERROR_CHECKSUM;

    return DHTLIB_OK;
}


// return values:
// DHTLIB_OK
// DHTLIB_ERROR_CHECKSUM
// DHTLIB_ERROR_TIMEOUT
int dht::read(uint8_t pin)
{
    // READ VALUES
    int rv = _readSensor(pin, DHTLIB_DHT_WAKEUP);
    if (rv != DHTLIB_OK)
    {
        humidity    = DHTLIB_INVALID_VALUE;  // invalid value, or is NaN prefered?
        temperature = DHTLIB_INVALID_VALUE;  // invalid value
        return rv; // propagate error value
    }

    // CONVERT AND STORE
    humidity = word(bits[0], bits[1]) * 0.1;
    temperature = word(bits[2] & 0x7F, bits[3]) * 0.1;
    if (bits[2] & 0x80)  // negative temperature
    {
        temperature = -temperature;
    }

    // TEST CHECKSUM
    uint8_t sum = bits[0] + bits[1] + bits[2] + bits[3];
    if (bits[4] != sum)
    {
        return DHTLIB_ERROR_CHECKSUM;
    }
    return DHTLIB_OK;
}

/////////////////////////////////////////////////////
//
// PRIVATE
//

// return values:
// DHTLIB_OK
// DHTLIB_ERROR_TIMEOUT
int dht::_readSensor(uint8_t pin, uint8_t wakeupDelay)
{
    // INIT BUFFERVAR TO RECEIVE DATA
    uint8_t mask = 128;
    uint8_t idx = 0;

    // replace digitalRead() with Direct Port Reads.
    // reduces footprint ~100 bytes => portability issue?
    // direct port read is about 3x faster
   uint8_t bit = digitalPinToBitMask(pin);
   uint8_t port = digitalPinToPort(pin);
    volatile uint8_t *PIR = portInputRegister(port);

    // EMPTY BUFFER
    for (uint8_t i = 0; i < 5; i++) bits[i] = 0;

    // REQUEST SAMPLE
    pinMode(pin, OUTPUT);
    digitalWrite(pin, LOW); // T-be
    delay(wakeupDelay);
    digitalWrite(pin, HIGH);   // T-go
    delayMicroseconds(40);
    pinMode(pin, INPUT);

    // GET ACKNOWLEDGE or TIMEOUT
    uint16_t loopCntLOW = DHTLIB_TIMEOUT;
    while ((*PIR & bit) == LOW )  // T-rel
    {
        if (--loopCntLOW == 0) return DHTLIB_ERROR_TIMEOUT;
    }

    uint16_t loopCntHIGH = DHTLIB_TIMEOUT;
    while ((*PIR & bit) != LOW )  // T-reh
    {
        if (--loopCntHIGH == 0) return DHTLIB_ERROR_TIMEOUT;
    }

    // READ THE OUTPUT - 40 BITS => 5 BYTES
    for (uint8_t i = 40; i != 0; i--)
    {
        loopCntLOW = DHTLIB_TIMEOUT;
        while ((*PIR & bit) == LOW )
        {
            if (--loopCntLOW == 0) return DHTLIB_ERROR_TIMEOUT;
        }

        uint32_t t = micros();

        loopCntHIGH = DHTLIB_TIMEOUT;
        while ((*PIR & bit) != LOW )
        {
            if (--loopCntHIGH == 0) return DHTLIB_ERROR_TIMEOUT;
        }

        if ((micros() - t) > 40)
        {
            bits[idx] |= mask;
        }
        mask >>= 1;
        if (mask == 0)   // next byte?
        {
            mask = 128;
            idx++;
        }
    }
    pinMode(pin, OUTPUT);
    digitalWrite(pin, HIGH);

    return DHTLIB_OK;
}
//
// END OF FILE
//
7-Dans mes documents/arduino/libraries cree un dossier x10rf
8-Dans x10rf cree 2 fichier txt x10rfh.txt et un x10rfcpp.txt
9-Dans x10rfh.txt coller le script ci dessous puis enregistrer et le renommer en x10rf.h

Code : Tout sélectionner

/*
x10rf.h
Library for sending x10 messages by RF.
Created by Pieter Paul Baron (embedded [at] ppbaron.nl), November 2013.
Released into the public domain.

Library to send x10 messages via a cheap 433Mhz OOK device. No X10 Firecracker (CMA17A) necessary.
Decoding messages is not implemented.
This library can emulate x10 switches and security devices and also RFXMeter and RFXSensor devices manufactured by RFXCom. (www.rfxcom.com)

Tested on a TI Stellarpad (LM4F120H5QR) and Energia 0101E0010. This should also work on Arduino (small modifications) or other TI Launchpad devices.
*/

// ensure this library description is only included once
#ifndef x10rf_h
#define x10rf_h

#include "Arduino.h"
#include <stdlib.h>

class x10rf
{
  public:
    x10rf(uint8_t tx_pin, uint8_t led_pin, uint8_t rf_repeats);
	void begin();
    void RFXmeter(uint8_t rfxm_address, uint8_t rfxm_packet_type, long rfxm_value);
	void RFXsensor(uint8_t rfxs_address,uint8_t rfxs_type, char rfxs_packet_type, uint8_t rfxs_value);
	void x10Switch(char house_code, uint8_t unit_code, uint8_t command);
	void x10Security(uint8_t address, uint8_t command);
  private:
	//void init(byte tx_pin, byte rf_repeats);
	void SendX10RfByte(uint8_t data);
	void SendX10RfBit(unsigned int databit);
	void SendCommand(uint8_t *date, uint8_t size);
	void SEND_HIGH();
	void SEND_LOW();
    uint8_t _tx_pin;
    uint8_t _led_pin;	
	uint8_t _rf_repeats;
};
#endif
10-Dans x10rfcpp.txt coller le script ci dessous puis enregistrer et le renommer en x10rf.cpp

Code : Tout sélectionner

/*
x10rf.cpp 
Library for sending x10 messages by RF.
Created by Pieter Paul Baron (embedded [at] ppbaron.nl), November 2013.
Released into the public domain.

Library to send x10 messages via a cheap 433Mhz OOK device. No X10 Firecracker (CMA17A) necessary.
Decoding messages is not implemented.
This library can emulate x10 switches and security devices and also RFXMeter and RFXSensor devices manufactured by RFXCom. (www.rfxcom.com)

Tested on a TI Stellarpad (LM4F120H5QR) and Energia 0101E0010. This should also work on Arduino (small modifications) or other TI Launchpad devices.
*/

#include <stdlib.h>
#include "x10rf.h"

#define X10_RF_SB_LONG          8960 	// Start burts (leader) = 9ms
#define X10_RF_SB_SHORT         4500 	//Start silecence (leader) = 4,5 ms
#define X10_RF_BIT_LONG         1120 	// Bit 1 pulse length
#define X10_RF_BIT_SHORT         560 	// Bit 1 pulse length
#define X10_RF_GAP             40000 	// Length between commands

void x10rf::begin()
{
	pinMode(_tx_pin, OUTPUT);
	if (_led_pin > 0) pinMode(_led_pin, OUTPUT); 
} 

x10rf::x10rf(uint8_t tx_pin, uint8_t led_pin, uint8_t rf_repeats)
{
		_tx_pin = tx_pin;
		_led_pin = led_pin;		
		_rf_repeats = rf_repeats;
}

void x10rf::RFXmeter(uint8_t rfxm_address, uint8_t rfxm_packet_type, long rfxm_value){
	uint8_t x10buff[5]; // Set message buffer
	x10buff[0] = rfxm_address;
	x10buff[1] = (~x10buff[0] & 0xF0) + (x10buff[0] & 0xF); // Calculate byte1 (byte 1 complement upper nibble of byte0)
	if (rfxm_value > 0xFFFFFF) rfxm_value = 0; 	// We only have 3 byte for data. Is overflowed set to 0	
	// Packet type goed into MSB nibble of byte 5. Max 15 (B1111) allowed
	// Use switch case to filter invalid data types
	switch(rfxm_packet_type) {
		case 0x00: //Normal. Put counter values in byte 4,2 and 3
			x10buff[4] = (uint8_t) ((rfxm_value >> 16) & 0xff);
			x10buff[2] = (uint8_t) ((rfxm_value >> 8) & 0xff);
			x10buff[3] = (uint8_t) (rfxm_value & 0xff);
			break;
		case 0x01: // New interval time set. Byte 2 should be filled with interval
			switch(rfxm_value) {
				case 0x01: break;	// 30sec
				case 0x02: break;	// 01min
				case 0x04: break;	// 06min (RFXpower = 05min)
				case 0x08: break;	// 12min (RFXpower = 10min)
				case 0x10: break; 	// 15min
				case 0x20: break; 	// 30min
				case 0x40: break; 	// 45min
				case 0x80: break; 	// 60min
				default:
				rfxm_value = 0x01; // Set to 30 sec if no valid option is found
			}
			x10buff[2] = rfxm_value;
			break;
		case 0x02: // calibrate value in <counter value> in µsec.	
			x10buff[4] = (uint8_t) ((rfxm_value >> 16) & 0xff);
			x10buff[2] = (uint8_t) ((rfxm_value >> 8) & 0xff);
			x10buff[3] = (uint8_t) (rfxm_value & 0xff);		
			break; 
		case 0x03: break;// new address set 
		case 0x04: break; // counter value reset to zero 
		case 0x0B: // counter value set
			x10buff[4] = (uint8_t) ((rfxm_value >> 16) & 0xff);
			x10buff[2] = (uint8_t) ((rfxm_value >> 8) & 0xff);
			x10buff[3] = (uint8_t) (rfxm_value & 0xff);
			break; 
		case 0x0C: break; // set interval mode within 5 seconds
		case 0x0D: break; // calibration mode within 5 seconds
		case 0x0E: break; // set address mode within 5 seconds
		case 0x0F: // identification packet (byte 2 = address, byte 3 = interval)
			switch(rfxm_value) {
				case 0x01: break;	//30sec
				case 0x02: break;	//01min
				case 0x04: break;	//06min (RFXpower = 05min)
				case 0x08: break;	//12min (RFXpower = 10min)
				case 0x10: break; // 15min1
				case 0x20: break; // 30min
				case 0x40: break; // 45min
				case 0x80: break; // 60min
				default:
				rfxm_value = 0x01; // Set to 30 sec if no valid option is found
			}
			x10buff[2] = rfxm_address;
			x10buff[3] = rfxm_value;
			break;
		default: //Unknown packet type. Set packet type to zero and set counter to rfxm_value
			rfxm_packet_type = 0;
			x10buff[4] = (uint8_t) ((rfxm_value >> 16) & 0xff);
			x10buff[2] = (uint8_t) ((rfxm_value >> 8) & 0xff);
			x10buff[3] = (uint8_t) (rfxm_value & 0xff);
	}
	x10buff[5] = (rfxm_packet_type << 4); 		// Packet type goes into byte 5's upper nibble.
	// Calculate parity which
	uint8_t parity = ~(((x10buff[0] & 0XF0) >> 4) + (x10buff[0] & 0XF) + ((x10buff[1] & 0XF0) >> 4) + (x10buff[1] & 0XF) + ((x10buff[2] & 0XF0) >> 4) + (x10buff[2] & 0XF) + ((x10buff[3] & 0XF0) >> 4) + (x10buff[3] & 0XF) + ((x10buff[4] & 0XF0) >> 4) + (x10buff[4] & 0XF) + ((x10buff[5] & 0XF0) >> 4));
	x10buff[5] = (x10buff[5] & 0xf0) + (parity & 0XF);
	SendCommand(x10buff, sizeof(x10buff)); // Send byte to be broadcasted
}

void x10rf::RFXsensor(uint8_t rfxs_address,uint8_t rfxs_type, char rfxs_packet_type, uint8_t rfxs_value){
	uint8_t x10buff[3]; // Set message buffer 4 bytes
	x10buff[0] = (rfxs_address << 2);
	switch (rfxs_type) {
		case 't': break; 	// Temperature (default)
		case 'a': 			// A/D
			x10buff[0] = x10buff[0] + B01;
		break;
		case 'm':			// message
			x10buff[0] = x10buff[0] + B11;
		break;
		case 'v':			// voltage
			x10buff[0] = x10buff[0] + B10;
		break;
		}
	x10buff[1] = (~x10buff[0] & 0xF0) + (x10buff[0] & 0xF); // Calculate byte1 (byte 1 complement MSB nibble of byte0)
	x10buff[2] = rfxs_value;
		switch(rfxs_packet_type) {
			case 't': //temperature sensor (MSB = 0.5 degrees bit off)
				x10buff[3] = 0x00;
			break; 
			case 'T': //emperature sensor (MSB = 0.5 degrees bit on)  
				x10buff[3] = 0x80;
			break; 
			case 'h': //RFU (humidity sensor)  
				x10buff[3] = 0x20;
			break;
			case 'p': //RFU (pressure sensor)
				x10buff[3] = 0x40;
			break; 
			default:
				x10buff[3] = 0x00;
			}
	x10buff[3] << 4;
	uint8_t parity = ~(((x10buff[0] & 0XF0) >> 4) + (x10buff[0] & 0XF) + ((x10buff[1] & 0XF0) >> 4) + (x10buff[1] & 0XF) + ((x10buff[2] & 0XF0) >> 4) + (x10buff[2] & 0XF) + ((x10buff[3] & 0XF0) >> 4));
	x10buff[3] = (x10buff[3] & 0xf0) + (parity & 0XF);	
	SendCommand(x10buff, sizeof(x10buff));
}

void x10rf::x10Switch(char house_code, uint8_t unit_code, uint8_t command){
	uint8_t x10buff[3]; // Set message buffer 4 bytes
	uint8_t bTmp = 0; // Tmp byte
	switch(house_code) {
		case 'a': x10buff[0] = B0110; break;
		case 'b': x10buff[0] = B0111; break;
		case 'c': x10buff[0] = B0100; break;
		case 'd': x10buff[0] = B0101; break;
		case 'e': x10buff[0] = B1000; break;
		case 'f': x10buff[0] = B1001; break;
		case 'g': x10buff[0] = B1010; break;
		case 'h': x10buff[0] = B1011; break;
		case 'i': x10buff[0] = B1110; break;
		case 'j': x10buff[0] = B1111; break;
		case 'k': x10buff[0] = B1100; break;
		case 'l': x10buff[0] = B1101; break;		
		case 'm': x10buff[0] = B0000; break;
		case 'n': x10buff[0] = B0001; break;
		case 'o': x10buff[0] = B0010; break;
		case 'p': x10buff[0] = B0011; break;
		default: x10buff[0] = 0; break;
	}
	x10buff[0] = x10buff[0] << 4; // House code goes into the upper nibble

	switch(command) {
		case 0: x10buff[2] = (x10buff[2] | 0x20); break;
		case 1: x10buff[2] = (x10buff[2] & 0x20); break;
	}
	// Set unit number
	unit_code = unit_code - 1;
	bitWrite(x10buff[2],6,bitRead(unit_code,2));
	bitWrite(x10buff[2],3,bitRead(unit_code,1));
	bitWrite(x10buff[2],4,bitRead(unit_code,0));
	bitWrite(x10buff[0],2,bitRead(unit_code,3));
	// Set parity
	x10buff[1] = ~x10buff[0];
	x10buff[3] = ~x10buff[2];
	SendCommand(x10buff, sizeof(x10buff));
}

void x10rf::x10Security(uint8_t address, uint8_t command){
	uint8_t x10buff[3]; // Set message buffer 4 bytes
	x10buff[0] = address;
	x10buff[1] = (~x10buff[0] & 0xF) + (x10buff[0] & 0xF0); // Calculate byte1 (byte 1 complement 
	x10buff[2] = command;
	x10buff[3] = ~x10buff[2];
	// x10buff[4] = code; // Couldn't get 48 bit security working.
	// if((x10buff[4] % 2) == 0) { x10buff[5] = 0;} //Calc even parity
	// else { x10buff[5] = 0x80;}	
	SendCommand(x10buff, sizeof(x10buff));

}

void x10rf::SendCommand(uint8_t *data, uint8_t size){
	if (_led_pin > 0) digitalWrite(_led_pin, HIGH); 
	for (int i = 0; i < _rf_repeats; i++){
		SEND_HIGH();delayMicroseconds(X10_RF_SB_LONG); 
		SEND_LOW();delayMicroseconds(X10_RF_SB_SHORT); 
		for(int i=0; i <= size; i++) {
			SendX10RfByte(data[i]);
		}
	SendX10RfBit(1); 
	delayMicroseconds(X10_RF_GAP);
	}
	if (_led_pin > 0) digitalWrite(_led_pin, LOW); 
}

void x10rf::SendX10RfByte(uint8_t data){
	int i = 0;
	//Serial.println("\n");
	for (int i=7; i >= 0 ; i--){ // send bits from byte 
		SendX10RfBit((bitRead(data,i)==1));
		//Serial.print(bitRead(data,i));
	}
}

void x10rf::SendX10RfBit(unsigned int databit){
    SEND_HIGH();delayMicroseconds(X10_RF_BIT_SHORT);
    SEND_LOW();delayMicroseconds(X10_RF_BIT_SHORT);
    if (databit) delayMicroseconds(X10_RF_BIT_LONG);    
}

void x10rf::SEND_HIGH() {
	digitalWrite(_tx_pin, HIGH);
}

void x10rf::SEND_LOW(){
	digitalWrite(_tx_pin, LOW);
}
#################################################################################################
-Redémarrer le logiciel arduino
-Ouvrir votre script documents/arduino/gasMonitor/gasMonitor.ino
-Faire compiler
-Faire fichier/téléverser.
-Apparation d'un message téléversement terminé (Taille binaire du croquis : 6 120 octets (d'un max de 30 720 octets))
-Fermer
-Réaliser le cablage du boss http://www.equinoxefr.org/post/2015/01/ ... -domoticz/
Image (regarder le numéro des contacts pour le cablage du nano (D2, D5...)
-Brancher le 5volts
-Dans domoticz faire Réglages/paramètres/ Accepter de nouveaux dispositifs matériels/Appliquer les paramètres
-Dans domoticz faire Réglages/dispositif/inutilisé
-Activé dans les dispositif votre rfxmetercounter via la flèche verte et votre nouvelle sonde
-Dans mesure/Editer/counter et par la meme occasion le nommé "Impulsion_eau".
-Dans domoticz faire:
-Réglage/Paramètres/Mètres/compteur et passer le RFXMeter/Compteurs Diviseurs: Eau et gas a 1
-Réglage/matériel
-Créer un capteur virtuel / (compteur) ou (gas,lep1 smart meter gas a l'air plus sympas)
-Dans réglages/dispositif activer votre nouveau compteur via la flèche verte et nommé le Compteur_eau
-Dans Mesures editer votre Compteur_eau pour le passer en counter.
-Faire réglages / plus d'option / variable utilisateur
-Creer la variable " Erreur_de_comptage_compteur_d_eau" (sans les "")
=>entier / 0 /ajouter
-Allez dans réglage dispositif pour chopper vos idx
moi j'ai:
158 RFXtrx433e 0CFC 0 Impulsion_eau
159 Dummy 140EE 1 Compteur_eau
#################################################################################################
Plusieur Méthode
#################################################################################################
#################################################################################################
La 1: Avoir un graphique a barre avec conso par heure/jour/semaine ...(type rfx meter ou p1 smart meter gas)
#################################################################################################
Le script
-Lancer putty
-faire:

Code : Tout sélectionner

sudo nano /home/pi/domoticz/scripts/lua/script_device_Compteur_eau.lua
(vous remarqué que le script a le meme nom que le compteur virtuel)
coller une variante du script de "pwhooftman" (original ici http://www.domoticz.com/forum/viewtopic.php?f=14&t=1641

Code : Tout sélectionner

--|6969.690


----------------
--Zone a editer
----------------
local thisfilename = "/home/pi/domoticz/scripts/lua/script_device_Compteur_eau.lua"   --emplacement de ce fichier nommé avec le nom du capt virtuel
local Compt_virtuel_eau_id = 159   --idx du capteur virtuel
local Capt_impulsion = "Compteur_impulsion"   --nom du capteur physique rfxmeter
local cptmaxi = 5   --comptage maximum sur 30sec (voir script arduino)
userVariableerreurcompteurdeau = 'Erreur_de_comptage_compteur_d_eau'   --Uservariable trop de comptage
-----------------
--fin de la zone a editer
-----------------

commandArray = {}
--Si le compteur impulsion est mis a jour
if devicechanged[Capt_impulsion] then

--Si le capteur reel indique un nombre d'impulsion supérieur a 0 et inferieur au nombre maximum théorique d'impulsions
   if (((tonumber(otherdevices_svalues[Capt_impulsion])) > 0) and ((tonumber(otherdevices_svalues[Capt_impulsion])) < (tonumber(30 / cptmaxi) + 1))) then
--Ouvre ce fichier et lit la première ligne
   file = io.open(thisfilename, "rb")
   sContents = file:read("*l")
   file:close()

-- Analyser et mettre à jour le countvalue
   foo, snumber = sContents:match("([^,]+)|([^,]+)")
   local impulsionmill = ((tonumber(otherdevices_svalues[Capt_impulsion])) / 1000)
   local countvalue = snumber + tonumber(impulsionmill)
   local newline = foo .. "|" .. string.format("%.3f", tostring(countvalue))

-- Maj du compteur virtuel
   ts = Compt_virtuel_eau_id .. "|0|" .. string.format("%.3f", tostring(countvalue))
   commandArray['UpdateDevice'] = ts

-- Ecrit la nouvelle valeur
   local file = io.open(thisfilename, "r+")
   file:write(newline)
   file:close()
   print("Compteur eau entre 0 et 6 impulsions: " .. tonumber(impulsionmill) .. " L les dernieres 30sec" )
   
--Si le compteur a impuslion indique plus de 6 impulsions-- (30sec(temps entre deux communications)/5sec(temps entre deux impulsions)=6 maxi) (7,8,9,...)
    elseif ((tonumber(otherdevices_svalues[Capt_impulsion])) > (tonumber(30 / cptmaxi ))) then
	commandArray['Variable:'..userVariableerreurcompteurdeau] = (tonumber(uservariables[userVariableerreurcompteurdeau]) + 1)
	print("superieur a 6 impulsions = erreur de comptage uservariable actualisé")
end
	
end

return commandArray
-Faire un ctrl+o puis ctrl+x
-ensuite dans putty:

Code : Tout sélectionner

sudo chmod +x /home/pi/domoticz/scripts/lua/script_device_Compteur_eau.lua
puis

Code : Tout sélectionner

sudo reboot -h
Le graph s'actualise toutes les 5 min donc pas de stress

(j'ai juste testé avec un interrupteur le montage et le capteur virtuel)

#################################################################################################
La 2: Avoir un graphique a courbe avec conso comme le teleinfo (type ....)
#################################################################################################

Image

Je crois que c'est bon j'attend demain pour les screenshoot mais j'ai fini le premier script de ma life. :D
Merci a :ugeek: vil1driver :ugeek: de m'avoir expliqué les bases.

Alors il nous faut :
-Créer un capteur virtuel / Electrique (Instant + compteur)
-Dans réglages/dispositif activer votre nouveau compteur via la flèche verte et nommé le Compteur_eau_en_m3
-Faire réglages / plus d'option / variable utilisateur
-Creer la variable " Erreur_de_comptage_compteur_d_eau" (sans les "")
=>entier / 0 /ajouter
-Allez dans réglage dispositif pour chopper vos idx
moi j'ai:
158 RFXtrx433e 0CFC 0 Impulsion_eau
159 Dummy 140EE 1 Compteur_eau_en_m3
-Dans interrupteur ajout manuel:
Matériel: Dummy
Nom du périphérique: Maj_Compteur_eau
Type d'interrupteur: on/off
Type: x10
Code maison: a
Code d'unité:10

Vérifier que votre compteur virtuel d'énergie (oui en kwh (=m3) et watt (=litres des 5 dernières minutes)) indique bien aujourd'hui 0.00
sinon attendre (va comprendre charles...)

-Lancer putty
-faire:

Code : Tout sélectionner

sudo nano /home/pi/domoticz/scripts/lua/script_device_Compteur_eau_general.lua
Copier ce code et mettai le a jour:

Code : Tout sélectionner

--Passer du rfxmeter arduino au capteur virtuel pour suivie conso
----------------
--Zone a editer
----------------
--Capteur physique
local Capt_impulsion = 'Compteur_impulsion'   -- nom du capteur physique de consommation d'eau
local Capt_impulsion_id = 157  -- idx du capteur physique de consommation d'eau
--Capteur virtuel
local Compt_virtuel_eau = 'Compteur_eau_en_m3'   -- nom du compteur de consommation d'eau virtuel
local Compt_virtuel_eau_id = 159  -- idx du compteur de consommation d'eau virtuel
--Uservariable trop de comptage
userVariableerreurcompteurdeau = 'Erreur_de_comptage_compteur_d_eau'
--comptage maximum sur 30sec (voir script arduino)
local cptmaxi = 5
--Bouton poussoir de mise a jour
local MajCompteureau = 'Maj_Compteur_eau'
--mise a jour du compteur
local majcompteur = 69000   -- Indiquer ici votre index de compteur en Litres et fermer toute les arrivé d'eau puis activer le bouton maj compteur eau

-----------------
--fin de la zone a editer
-----------------

commandArray = {}
time=os.time()
minutes=tonumber(os.date('%M',time))
seconds=tonumber(os.date('%S',time))

-----------------
--Programme
-----------------
--si l'heure indique un multiple de 5 minutes remettre le cumul de l'instantané a 0

--Si le compteur impulsion est mis a jour
if devicechanged[Capt_impulsion] then

-----------------

     --Si le capteur reel indique un nombre d'impulsion égale a 0 et inferieur a 7 (0,1,2,3,4,5,6)
     if ((((tonumber(otherdevices_svalues[Capt_impulsion])) == 0) and (otherdevices[MajCompteureau]=='Off')) or ((tonumber(otherdevices_svalues[Capt_impulsion])) < (tonumber(30 / cptmaxi) + 1))) then
	  --multiplication des minutes en seconde ajout des secondes
	  local plage_horaire_sec = (minutes * 60) + seconds
	  --et que l'heure est compris entre un multiple de 5 minutes et de 5min30 
       if (((plage_horaire_sec > 0) and (plage_horaire_sec < 31)) or ((plage_horaire_sec > 299) and (plage_horaire_sec < 331)) or ((plage_horaire_sec > 599) and (plage_horaire_sec < 631)) or ((plage_horaire_sec > 899) and (plage_horaire_sec < 931)) or ((plage_horaire_sec > 1199) and (plage_horaire_sec < 1231)) or ((plage_horaire_sec > 1499) and (plage_horaire_sec < 1531)) or ((plage_horaire_sec > 1799) and (plage_horaire_sec < 1831)) or ((plage_horaire_sec > 2099) and (plage_horaire_sec < 2131)) or ((plage_horaire_sec > 2399) and (plage_horaire_sec < 2431)) or ((plage_horaire_sec > 2699) and (plage_horaire_sec < 2731)) or ((plage_horaire_sec > 2999) and (plage_horaire_sec < 3031)) or ((plage_horaire_sec > 3299) and (plage_horaire_sec < 3331)))then
	   --remettre le cumul de l'instantané a 0 + instantané recu
	   --Division du comptage
	   local impulsionmill = (tonumber(otherdevices_svalues[Capt_impulsion]))
	   --On recupère la valeur du cumul virtuel
	   impulsionvirt, cumulvirt = string.match(otherdevices_svalues[Compt_virtuel_eau], "(%d+%.*%d*);(%d+%.*%d*)")
       --Addition l'impulsion recu au cumul actuel
       newcumul = tonumber(impulsionmill) + (tonumber(cumulvirt))
       --ecrit dans le capteur virtuel la conso instantanee du capteur a impulsion et aussi le cumulé
       commandArray['UpdateDevice'] = Compt_virtuel_eau_id .. '|0|' .. tonumber(impulsionmill) .. ';' .. newcumul
	   print("Compteur eau entre 0 et 6 impulsions: avec raz instantané" )
	 
	 --ou si l'heure n'est pas compris entre un multiple de 5 minutes et de 5min30 
       elseif (((plage_horaire_sec > 30) and (plage_horaire_sec < 300)) or ((plage_horaire_sec > 330) and (plage_horaire_sec < 600)) or ((plage_horaire_sec > 630) and (plage_horaire_sec < 900)) or ((plage_horaire_sec > 930) and (plage_horaire_sec < 1200)) or ((plage_horaire_sec > 1230) and (plage_horaire_sec < 1500)) or ((plage_horaire_sec > 1530) and (plage_horaire_sec < 1800)) or ((plage_horaire_sec > 1830) and (plage_horaire_sec < 2100)) or ((plage_horaire_sec > 2130) and (plage_horaire_sec < 2400)) or ((plage_horaire_sec > 2430) and (plage_horaire_sec < 2700)) or ((plage_horaire_sec > 2730) and (plage_horaire_sec < 3000)) or ((plage_horaire_sec > 3030) and (plage_horaire_sec < 3300)) or ((plage_horaire_sec > 3330) and (plage_horaire_sec < 3600)))then	 
	 --cumule l'instantané jusqu'a ce qu'il soit pris en compte dans le graphique. (toutes les 5min)
	 --Division du comptage
	   local impulsionmill = (tonumber(otherdevices_svalues[Capt_impulsion]))
	 --On recupère la valeur du cumul virtuel
	   impulsionvirt, cumulvirt = string.match(otherdevices_svalues[Compt_virtuel_eau], "(%d+%.*%d*);(%d+%.*%d*)")
	 --Addition l'impulsion recu au cumul actuel
       newcumul = tonumber(impulsionmill) + tonumber(cumulvirt)
     --Addition le nombre d'impuslion jusqu'a prise en compte du graphique
	   instcumul = tonumber(impulsionmill) + tonumber(impulsionvirt)
     --ecrit dans le capteur virtuel la conso instantanee du capteur a impulsion et aussi le cumulé
       commandArray['UpdateDevice'] = Compt_virtuel_eau_id .. '|0|' .. tonumber(instcumul) .. ';' .. newcumul
	   print("Compteur eau entre 0 et 6 impulsions: avec cumul instantané" )
	   end
	   end
-----------------
--Si le capteur reel indique 0 impulsion et que le bouton mise a jour compteur est activer--
     elseif (((tonumber(otherdevices_svalues[Capt_impulsion])) == 0) and (otherdevices[MajCompteureau]=='On')) then
--ecrit dans le capteur virtuel une conso instantanee de 0 et la mise a jour si dessous
     commandArray['UpdateDevice'] = Compt_virtuel_eau_id .. '|0|' .. 0 .. ';' .. majcompteur
	 commandArray[MajCompteureau]='Off'
	print("Compteur eau a 0 impulsion+bp MAJ compteur: " .. majcompteur .. " mise a jour." )
-----------------

--Si le compteur a impuslion indique plus de 6 impulsions-- (30sec(temps entre deux communications)/5sec(temps entre deux impulsions)=6 maxi) (7,8,9,...)
     elseif ((tonumber(otherdevices_svalues[Capt_impulsion])) > (tonumber(30 / cptmaxi ))) then
	 --On recupère la valeur du cumul du capteur virtuel
	 impulsionvirt, cumulvirt = string.match(otherdevices_svalues[Compt_virtuel_eau], "(%d+%.*%d*);(%d+%.*%d*)")
--ecrit dans le capteur virtuel une conso instantanee de 0 et le dernier cumul en memoire du capteur virtuel
     commandArray['UpdateDevice'] = Compt_virtuel_eau_id .. '|0|' .. 0 .. ';' .. cumulvirt
	 commandArray['Variable:'..userVariableerreurcompteurdeau] = (tonumber(uservariables[userVariableerreurcompteurdeau]) + 1)
     print("superieur a 6 impulsions = erreur de comptage uservariable actualisé")
	 
-----------------
    end
-----------------

return commandArray
faire un ctrl+o /entree / ctrl+x

Code : Tout sélectionner

sudo chmod +x /home/pi/domoticz/scripts/lua/script_device_Compteur_eau_general.lua
Fermer tous les robinets de la maison et activer dans domoticz le bouton maj compteur eau
attendé que le rfx meter envoie 0 impulsion et votre compteur d'eau virtuel va ce mettre a jour (et le bp va repasser a off)



Si vous etes nombreux a preferer le systeme de courbe et si ca existe pas deja :oops: on pourrait demander a Gizmocuz de ne faire un capteur virtuel identique mais en remplacent les kwh par des m3 et les watt par des litres....



Encore merci a Equinoxe pour son site http://www.equinoxefr.org/post/2015/01/ ... -domoticz/
Modifié en dernier par mulot35 le 28 juil. 2015, 20:46, modifié 28 fois.
Raspi B+ avec Domoticz ,6 Chacon 2300W , 6 Sondes Oregon, 1 Sonde DIY Oregon ds18b20, Téléinfo sur photovoltaique, script backup ftp & anti offline.

mulot35
Messages : 200
Enregistré le : 20 déc. 2014, 00:27

Re: [Tuto diy] Compteur impuslsion eau/gas+rfxmeter maison 5€ (rfxcom) pour les nuls

Message par mulot35 »

Reserve
Raspi B+ avec Domoticz ,6 Chacon 2300W , 6 Sondes Oregon, 1 Sonde DIY Oregon ds18b20, Téléinfo sur photovoltaique, script backup ftp & anti offline.

mulot35
Messages : 200
Enregistré le : 20 déc. 2014, 00:27

Re: [Tuto diy] Compteur impuslsion eau/gas+rfxmeter maison 5€ (rfxcom) pour les nuls

Message par mulot35 »

reserve 2
Raspi B+ avec Domoticz ,6 Chacon 2300W , 6 Sondes Oregon, 1 Sonde DIY Oregon ds18b20, Téléinfo sur photovoltaique, script backup ftp & anti offline.

mulot35
Messages : 200
Enregistré le : 20 déc. 2014, 00:27

Re: [Tuto diy] Compteur impuslsion eau/gas+rfxmeter maison 5€ (rfxcom) pour les nuls

Message par mulot35 »

Alors première essais après 1 heure.
Il ne compte et n'affiche que part 10ène de litre.
Et le totalisateur a l'air bloqué a la première valeur recu tandis que la conso instantanée fonctionne.
je ne connais pas le rfxmeter d'origine alors j'attends vos avis conseils?
Raspi B+ avec Domoticz ,6 Chacon 2300W , 6 Sondes Oregon, 1 Sonde DIY Oregon ds18b20, Téléinfo sur photovoltaique, script backup ftp & anti offline.

deennoo
Messages : 4034
Enregistré le : 25 janv. 2015, 02:00

Re: [Tuto diy] Compteur impuslsion eau/gas+rfxmeter maison 5€ (rfxcom) pour les nuls

Message par deennoo »

mulot35 a écrit :Alors première essais après 1 heure.
Il ne compte et n'affiche que part 10ène de litre.
Et le totalisateur a l'air bloqué a la première valeur recu tandis que la conso instantanée fonctionne.
je ne connais pas le rfxmeter d'origine alors j'attends vos avis conseils?
J'ai essayer ce module a sa sortie et je n'en ai pas été satisfait : des blocages comme toi, avec en plus des freeze en emission de l arduino qui me bloquait le rfxtrx, que je n'ai pas reussit a resoudreje suis passer sur un autre System plus basique mais qui fonctionne très bien pour le gaz (un capteur d'ouverture de porte chinois démonter et rallonger et un script sur le PI
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr

mulot35
Messages : 200
Enregistré le : 20 déc. 2014, 00:27

Re: [Tuto diy] Compteur impulsion eau/gas+rfxmeter maison 5€ (rfxcom) pour les nuls

Message par mulot35 »

Ce que je trouve bizarre c'est que tout les rfx counter que je vois en photo sont inversé par rpport au mien.
Le miens:
Image

sur le web:
Image

et par rapport a ce que tu me dit pour l'instant aucun freeze sur mes 10 sondes oregon.(je viens de voir ton post https://www.domoticz.com/forum/viewtopi ... ter#p29790)
Au pire peut etre recupérer l'instantané par un script et le balancer dans un compteur...(mais je suis une burne en script)
Modifié en dernier par mulot35 le 19 juil. 2015, 22:20, modifié 1 fois.
Raspi B+ avec Domoticz ,6 Chacon 2300W , 6 Sondes Oregon, 1 Sonde DIY Oregon ds18b20, Téléinfo sur photovoltaique, script backup ftp & anti offline.

deennoo
Messages : 4034
Enregistré le : 25 janv. 2015, 02:00

Re: [Tuto diy] Compteur impulsion eau/gas+rfxmeter maison 5€ (rfxcom) pour les nuls

Message par deennoo »

C'est le faux rfxmeter qui freezait.

Pour le reste je ne peux pas d'aider sauf a te mettre le script que j'utilise pour le Gaz
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr

mulot35
Messages : 200
Enregistré le : 20 déc. 2014, 00:27

Re: [Tuto diy] Compteur impulsion eau/gas+rfxmeter maison 5€ (rfxcom) pour les nuls

Message par mulot35 »

J'te remerci mais je ne réussirai pas a le modifié.
j'ai trouvé un script plus simple au pire:
https://www.domotiga.nl/boards/2/topics/5871
je vais l'essayer un te c'est quatre.
Raspi B+ avec Domoticz ,6 Chacon 2300W , 6 Sondes Oregon, 1 Sonde DIY Oregon ds18b20, Téléinfo sur photovoltaique, script backup ftp & anti offline.

mulot35
Messages : 200
Enregistré le : 20 déc. 2014, 00:27

Re: [Tuto diy][en cours] Compteur impulsion eau/gas+rfxmeter maison 5€ (rfxcom) pour les nuls

Message par mulot35 »

oups
Raspi B+ avec Domoticz ,6 Chacon 2300W , 6 Sondes Oregon, 1 Sonde DIY Oregon ds18b20, Téléinfo sur photovoltaique, script backup ftp & anti offline.

scholes2763
Messages : 2
Enregistré le : 24 juil. 2015, 19:15

Re: [Tuto diy][en cours] Compteur impulsion eau/gas+rfxmeter maison 5€ (rfxcom) pour les nuls

Message par scholes2763 »

Bonjour à tous

Je suis un peu novice en programmation pour pas dire nul:

Est il possible d'avoir le script pour le capteur sans sonde dht22 ?

En vous remerciant d'avance pour votre coup de main

Répondre