bonsoir
programme fonctionnelle , envoie des messages sur changement de la valeur.
la partie Tempo on oublie (non fonctionnelle )
simplification du croquis, passage Mode simple , compteur Mono et Historique.
le programme (pour Mega2560)
/*
*
* Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
* Copyright (C) 2013-2018 Sensnology AB
* Full contributor list: https://github.com/mysensors/MySensors/graphs/contributors
*
* 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.
*
*/
//--------------------------------------------------------------------
// _| | | ` \ -_) -_) _ \ | -_) | | -_)
// _| \_,_| _|_|_| \___| \___| ___/ _| \___| \_,_| \___|
//--------------------------------------------------------------------
// sur une base de FB
// https://community.ch2i.eu/topic/1373/teleinfo-et-mysensors
// https://forum.mysensors.org/topic/12060/send_frequency_full-wait
// https://forum.arduino.cc/t/teleinfo-et-strcmp/1055294/
//-------------------------------------------------------------------------
//****** Arduino Mega2560 - MySesnsors sur bus RS485 ********* nov.2022
//-------------------------------------------------------------------------
// Enable debug prints MySensors, Enable debug prints to serial monitor
// #define MY_DEBUG // terminal en 115200baud
// #define MY_DEBUG_LOCAL
//----------------- MySensors --------------------------
#define MY_NODE_ID 35 /*Node en ID static*/
// #define MY_TRANSPORT_WAIT_READY_MS 3000 //Timeout (ms) pour mis en Com.(0 pour aucun)
/* nécessaire lorsque pas connecté à la passerelle, pour des test*/
//.......... RS485 ..........................
#define MY_RS485 // Enable RS485 transport layer
#define MY_RS485_DE_PIN 3 // Define this to enables Cmd DE-pin management on defined pin
#define MY_RS485_BAUD_RATE 9600 // Set RS485 baud rate to use (9600 mode standard)
#define MY_RS485_HWSERIAL Serial3 // choix du port RX-Tx sur Mega2560
// ------------teleinfo -------------
#define VERSION "v2.0.1"
#define DELAY_PREFIX 50
#define DELAY_SEND 500
#define DELAY_PRESENTATION 100 // tempo du Wait
//------------- MyS-----------------
//#define MY_LEDS_BLINKING_FEATURE // Flash leds on rx/tx/err
//#define MY_DEFAULT_LED_BLINK_PERIOD 300 // Set blinking period
// #define MY_DEFAULT_RX_LED_PIN 5 // Receive led pin
// #define MY_DEFAULT_TX_LED_PIN 6 // the PCB, on board LED
// #define MY_DEFAULT_ERR_LED_PIN 7 // Error led pin
//------------- Biblio -------------
#include <MySensors.h>
#include "LibTeleinfoLite.h"
unsigned long lastTime_full = 0;
unsigned long lastTime_tic = 0;
unsigned long startTime; // Date démarrage
_Mode_e mode_tic;
boolean flag_first = true;
boolean flag_full_tic = true;
boolean flag_tic = true;
TInfo tinfo;
// --------- MySensors -----------
#define char_AMPERE "A"
#define char_VOLT "V"
#define char_WATT "W"
#define char_WATT_HEURE "Wh"
#define char_VA "VA"
#define char_KVA "kVA"
#define char_VAR_HEURE "VArh"
#define char_MIN "min"
//------------- Mode Historique ------------------------
///----- valeur =-1 pour la remonter sur le Controller (le 1er remonter des points "ID" )
// const char char_ADCO[] PROGMEM = "ADCO"; long valADCO=-1; long svalADCO=-1; //ID
const char char_OPTARIF[] PROGMEM = "OPTARIF"; char* valOPTARIF; char* svalOPTARIF; //ID
const char char_ISOUSC[] PROGMEM = "ISOUSC"; long valISOUSC=-1; long svalISOUSC=-1; //ID
const char char_HCHC[] PROGMEM = "HCHC"; long valHCHC=-1; long svalHCHC=-1; //ID
const char char_HCHP[] PROGMEM = "HCHP"; long valHCHP=-1; long svalHCHP=-1; //ID
const char char_PTEC[] PROGMEM = "PTEC"; char* valPTEC; char* svalPTEC; //ID
const char char_IINST[] PROGMEM = "IINST"; long valIINST=-1; long svalIINST=-1; //ID
const char char_IMAX[] PROGMEM = "IMAX"; long valIMAX=-1; long svalIMAX=-1;
const char char_PAPP[] PROGMEM = "PAPP"; long valPAPP=-1; long svalPAPP=-1;
const char char_HHPHC[] PROGMEM = "HHPHC"; char* valHHPHC; char* svalHHPHC;
const char char_MOTDETAT[] PROGMEM = "MOTDETAT"; char* valMOTDETAT; char* svalMOTDETAT;
const char char_START[] PROGMEM = "START";
//en partie erraser .... mode Mono Historique
//--------- Define----------- 11 valeurs remonter du linky (monoHistorique)--------------
//#define CHILD_ID_ADCO 1 // N°d'identification du compteur (12 caractères)
#define CHILD_ID_OPTARIF 2 // Option tarifaire, type d'abonnement (4 car.)
#define CHILD_ID_ISOUSC 3 // Intensité souscrite (2 car. unité = ampères)
#define CHILD_ID_HCHC 5 //Index heures creuses si option (9car.unité=Wh)
#define CHILD_ID_HCHP 6 //Index heures pleines si option heures creuses (9car.unité=Wh)
#define CHILD_ID_PTEC 16 //Période tarifaire en cours (4car.)
#define CHILD_ID_IINST 18 //Intensité instantanée (3car. unité=ampères)
#define CHILD_ID_IMAX 20 //Intensité maximale (3car. unité=ampères)
#define CHILD_ID_PAPP 21 //Puissance apparente (5car. unité=Volt.ampères)
#define CHILD_ID_HHPHC 22 //Groupe horaire si option creuses ou tempo (1car.)
#define CHILD_ID_MOTDETAT 23 //Mot d'état (autocontrôle) (6car.)
#define CHILD_ID_START 99 //etat du node
//-------------- Mode Standard ---------------------
// errase for test ****
//----------------------------------------------------
MyMessage msgTEXT( 0, V_TEXT); // S_INFO
MyMessage msgCURRENT( 0, V_CURRENT ); // S_MULTIMETER
MyMessage msgVOLTAGE( 0, V_VOLTAGE ); // S_MULTIMETER
MyMessage msgWATT( 0, V_WATT ); // S_POWER
MyMessage msgKWH( 0, V_KWH ); // S_POWER
MyMessage msgVA( 0, V_VA ); // S_POWER
MyMessage msgPrefix( 0, V_UNIT_PREFIX );
// ---------------------- freeMemory -----------------------------------
// errase
// ----------------- freeMemory ----------------------------------
// errase
// ----------- change_etat_led_teleinfo --------------------------
// errase
// ---------------- send_teleinfo_historique -------------------------
// strcmp :Compare lexicographiquement deux chaînes d'octets.
//crée un message, puis avant de l'envoyer,définissez l' attribut du capteur,puis définissez la valeur et envoyez.
//exemple : send(msgPir.setSensor(Number).set(State?"1":"0"));
void send_teleinfo_historique(char *name, char *value ) {
//------------- modif pour CDV ---------------------
// if (strcmp_P(name, char_ADCO ) == 0) {
// valADCO = atol(value); if (valADCO != svalADCO) {
// send(msgTEXT.setSensor(CHILD_ID_ADCO).set(valADCO));}
// svalADCO = valADCO; return;}
if (strcmp_P(name, char_OPTARIF ) == 0) {
valOPTARIF = (value) ; if (valOPTARIF != svalOPTARIF) {
send(msgTEXT.setSensor(CHILD_ID_OPTARIF).set(valOPTARIF));}
svalOPTARIF = valOPTARIF; return;}
if (strcmp_P(name, char_ISOUSC ) == 0) {
valISOUSC=atol(value); if (valISOUSC != svalISOUSC) {
send(msgCURRENT.setSensor(CHILD_ID_ISOUSC).set(valISOUSC));}
svalISOUSC = valISOUSC; return;}
if (strcmp_P(name, char_HCHC) == 0) {
valHCHC=atol(value); if (valHCHC != svalHCHC) {
send(msgKWH.setSensor(CHILD_ID_HCHC).set(valHCHC));}
svalHCHC = valHCHC; return;}
if (strcmp_P(name, char_HCHP ) == 0) {
valHCHP=atol(value); if (valHCHP != svalHCHP) {
send(msgKWH.setSensor(CHILD_ID_HCHP).set(valHCHP));}
svalHCHP = valHCHP; return;}
if (strcmp_P(name, char_PTEC ) == 0) {
valPTEC=(value); if (valPTEC != svalPTEC) {
send(msgTEXT.setSensor(CHILD_ID_PTEC).set(valPTEC));}
svalPTEC = valPTEC; return;}
if (strcmp_P(name, char_IINST ) == 0) {
valIINST=atol(value); if (valIINST != svalIINST) {
send(msgCURRENT.setSensor(CHILD_ID_IINST).set(valIINST));}
svalIINST = valIINST; return;}
if (strcmp_P(name, char_IMAX ) == 0) {
valIMAX=atol(value); if (valIMAX != svalIMAX) {
send(msgCURRENT.setSensor(CHILD_ID_IMAX).set(valIMAX));}
svalIMAX = valIMAX; return;}
if (strcmp_P(name, char_PAPP) == 0) {
valPAPP=atol(value); if (valPAPP != svalPAPP ) {
send(msgVA.setSensor(CHILD_ID_PAPP).set(valPAPP));}
svalPAPP = valPAPP; return; }
if (strcmp_P(name, char_HHPHC ) == 0) {
valHHPHC=(value); if (valHHPHC != svalHHPHC) {
send(msgTEXT.setSensor(CHILD_ID_HHPHC).set(valHHPHC));}
svalHHPHC = valHHPHC; return;}
if (strcmp_P(name, char_MOTDETAT ) == 0) {
valMOTDETAT=(value); if (valMOTDETAT != svalMOTDETAT) {
send(msgTEXT.setSensor(CHILD_ID_MOTDETAT).set(valMOTDETAT));}
svalMOTDETAT = valMOTDETAT; return;}
//...... errase une partie ---- version Mono Historique seulement --------------------
}
// ----------------- send_teleinfo_standard ------------------------------
// errase
// -------------- send_teleinfo ----------------------------
void send_teleinfo(char *etiq, char *val ) {
// if (mode_tic == TINFO_MODE_HISTORIQUE)
send_teleinfo_historique(etiq, val );
}
// -------------- init_speed_TIC ----------------------------
_Mode_e init_speed_TIC() {
// boolean flag_timeout = false;
// boolean flag_found_speed = false;
// uint32_t currentTime = millis();
unsigned step = 0;
_Mode_e mode;
// Test en mode historique
// Recherche des éléments de début, milieu et fin de trame (0x0A, 0x20, 0x20, 0x0D)
Serial1.begin(1200); // mode historique
// while (!flag_timeout && !flag_found_speed)
{
if (Serial1.available()>0) {
char in = (char)Serial1.read() & 127; // seulement sur 7 bits
// début trame
if (in == 0x0A) {
step = 1;
}
// premier milieu de trame
if (step == 1 && in == 0x20) {
step = 2;
}
// deuxième milieu de trame
if (step == 2 && in == 0x20) {
step = 3;
}
// fin trame
if (step == 3 && in == 0x0D) {
// flag_found_speed = true;
step = 0;
}
}
// if (currentTime + 10000 < millis()) flag_timeout = true; // 10s de timeout
}
}
// ------------------ UpdatedFrame -------------------
void UpdatedFrame(ValueList *vl_tic) {
if (flag_full_tic) {
send(msgTEXT.setSensor(CHILD_ID_START).set(startTime));
flag_full_tic = false;
}
}
//-------- This is called when a new time value was received ---------
// errase
//--------------------------------------------------------------------
void before() {
mode_tic = init_speed_TIC();
tinfo.init(mode_tic);
}
//-------------------------- SETUP ------------------------------------------
void setup() {
//affiche_freeMemory();
}
//-------------------------- Presenstation MyS ------------------------------------------
void presentation() {
sendSketchInfo("Teleinfo", VERSION); // Send the sketch version info sur gateway and Controller
requestTime(); // Récupere l'heure de la gateway du controller
present( CHILD_ID_START, S_INFO, F("START"));
if (mode_tic == TINFO_MODE_HISTORIQUE) {
// present (CHILD_ID_ADCO, S_INFO, F("ADCO"));
present (CHILD_ID_OPTARIF, S_INFO, F("OPTARIF"));
present (CHILD_ID_ISOUSC, S_MULTIMETER, F("ISOUSC"));
present (CHILD_ID_HCHC, S_POWER, F("HCHC"));
wait(DELAY_PRESENTATION);
present (CHILD_ID_HCHP, S_POWER, F("HCHP"));
present (CHILD_ID_PTEC, S_INFO, F("PTEC"));
present (CHILD_ID_IINST, S_MULTIMETER, F("IINST"));
present (CHILD_ID_IMAX, S_MULTIMETER, F("IMAX"));
wait(DELAY_PRESENTATION);
present (CHILD_ID_PAPP, S_POWER, F("PAPP"));
present (CHILD_ID_HHPHC, S_INFO, F("HHPHC"));
present (CHILD_ID_MOTDETAT, S_INFO, F("MOTDETAT"));
// ...mode HistoMono
}
}
//----------------------- LOOP ---------------------------------------------
void loop() {
if (flag_first) {
// Send prefix au démarrage
// errase for test
send(msgTEXT.setSensor(CHILD_ID_START).set(startTime));
flag_first= false;
}
if (Serial1.available()) tinfo.process(Serial1.read());
}
//----------------------------------------------------------------------------------------
// -------------------------------- Fin du Pgm --------------------------------------------