suite le début de l'histoire
en 2018 @MicroQuettas avec d'autres complices on sculpté/codé un truc qui tourne pas mal .
j'ai adopter la version final? LkyRx_10d
, ajouter la partie MySensors et le bus RS485.
bien .... tout remonte sur le Controller, bref un bonheur .
Mais voila, SoftwareSerial (partie linky) et AltSoftSerial (bus RS485) , confie conflit , il y à des trous dans mes relevé
c'est partie pour la suppression de SoftwareSerial avec la version LkyRx_06.zip , la plus simple ( .... en cours)
le croquis ino
/***********************************************************************
Récepteur TIC Linky
Mode historique
V03 : External SoftwareSerial. Tested OK on 07/03/18.
V04 : Replaced available() by new(). Tested Ok on 08/03/18.
V05 : Internal SoftwareSerial. Cf special construction syntax.
V06 : Separate compilation version.
V10a : Parametric version, initial. Tested OK on 23/10/19.
V10b : fixed bug in ptecIsNew(). Tested OK on 24/10/19.
V10c : added LKYSIMINPUT mode. Tested OK (partial) on 31/10/19.
V10d : adapted to Arduino Uno and Mega. Tested Ok on 27/04/20.
****** https://forum.arduino.cc/t/decodeur-tic-linky/512858/118 ****
Configuration parameters are defined in LinkyHistTIC.h
***********************************************************************/
//-------------------------------------------------------------------------
//****** Arduino ?? - MySesnsors sur bus RS485 ********* 2022
//-------------------------------------------------------------------------
// Enable debug prints MySensors, Enable debug prints to serial monitor
// #define MY_DEBUG // mode standard terminal en 115200baud
// #define MY_DEBUG_LOCAL
#define MY_BAUD_RATE 9600 // pour vitesse du terminal debug??
//----------------- MySensors --------------------------
#define MY_NODE_ID 36 /*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_RADIO_RF24
#define MY_RS485 // Enable RS485 transport layer
#define MY_RS485_DE_PIN 2 // 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
#define DELAY_PREFIX 50
#define DELAY_PRESENTATION 100 // tempo du Wait
/***************************** Includes *******************************/
/***************************** Biblio *******************************/
#include <MySensors.h>
#include <string.h>
#include <Streaming.h>
#include "LinkyHistTIC.h"
/********************** MyS *******************************/
// const char char_PAPP[] PROGMEM = "PAPP";
#define CHILD_ID_OPTARIF 2 // tarif en cours(???4 car.)
#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_PAPP 21 //Puissance apparente (5car. unité=Volt.ampères)
#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"
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 );
/****************************** Defines *******************************/
boolean flag_first = true;
/****************************** Constants *****************************/
const uint8_t pin_LkyRx = 10;
const uint8_t pin_LkyTx = 11;
/* Tx !!! Not used but reserved Do not use for anything else */
/************************* Global variables ***************************/
/************************* Object instanciation ***********************/
LinkyHistTIC Linky(pin_LkyRx, pin_LkyTx);
/**************************** Routines ******************************/
/****************************** Setup *******************************/
void setup() {
Serial.begin(9600); /* Initialise serial link */
Linky.Init(); /* Initialise the Linky receiver */
// Serial << F("Bonjour") << endl;
}
/******************* Presenstation MyS ********************************/
void presentation() {
sendSketchInfo("Teleinfo", "Ver2.4"); // Send the sketch version info sur gateway and Controller
present (CHILD_ID_OPTARIF, S_INFO, F("OPTARIF"));
present (CHILD_ID_HCHC, S_POWER, F("HCHC"));
present (CHILD_ID_HCHP, S_POWER, F("HCHP"));
wait(DELAY_PRESENTATION);
present (CHILD_ID_PTEC, S_INFO, F("PTEC"));
present (CHILD_ID_IINST, S_MULTIMETER, F("IINST"));
present (CHILD_ID_PAPP, S_POWER, "PAPP");
}
/******************************* Loop *********************************/
void loop() {
uint8_t i;
Linky.Update();
// ----------- PAPP
if (Linky.pappIsNew()) {
// Serial << F("Puis. app. = ") << Linky.papp() << F(" VA") << endl;
send(msgVA.setSensor(CHILD_ID_PAPP).set(Linky.papp()));
}
//----------- BASE
#ifdef LKY_Base
if (Linky.baseIsNew())
{
// Serial << F("Index base = ") << Linky.base() << F(" Wh") << endl;
send(msgTEXT.setSensor(CHILD_ID_OPTARIF).set(Linky.base()));
}
#endif
//----------- HPHC
#ifdef LKY_HPHC
if (Linky.hchpIsNew())
{
//Serial << F("Index HP = ") << Linky.hchp() << F(" Wh") << endl;
send(msgVA.setSensor(CHILD_ID_HCHP).set(Linky.hchp()));
}
if (Linky.hchcIsNew()) {
//Serial << F("Index HC = ") << Linky.hchc() << F(" Wh") << endl;
send(msgVA.setSensor(CHILD_ID_HCHC).set(Linky.hchc()));
}
//------------------- Tarif en cours -------------
if (Linky.ptecIsNew()) {
//Serial << F("Tarif en cours : ");
if (Linky.ptec() == Linky.C_HPleines) {
//Serial << F("heures pleines") << endl;
send(msgTEXT.setSensor(CHILD_ID_PTEC).set("HPleines"));
}
else {
//Serial << F("heures creuses") << endl;
send(msgTEXT.setSensor(CHILD_ID_PTEC).set("HCreuses"));
}
}
#endif
//----------- IINST
#ifdef LKY_IMono
if (Linky.iinstIsNew()) {
//Serial << F("I instant. = ") << Linky.iinst() << F(" A") << endl;
send(msgCURRENT.setSensor(CHILD_ID_IINST).set(Linky.iinst()));
}
#endif
//----------- non utilisé
#ifdef LKY_ITri
for (i = Linky.C_Phase_1; i <= Linky.C_Phase_3; i++) {
if (Linky.iinstIsNew(i)) {
//Serial << F("I Phase ") << i+1 << F(" = ") \
<< Linky.iinst(i) << F(" A") << endl;
}
}
#endif
// Send prefix au 1er démarrage , la remonter des points sur le Controller
if (flag_first) {
send(msgTEXT.setSensor(CHILD_ID_OPTARIF).set("option"));
send(msgVA.setSensor(CHILD_ID_HCHC).set(char_WATT_HEURE));
wait(DELAY_PREFIX);
send(msgVA.setSensor(CHILD_ID_HCHP).set(char_WATT_HEURE));
send(msgTEXT.setSensor(CHILD_ID_PTEC).set("tarif en cour"));
wait(DELAY_PREFIX);
send(msgCURRENT.setSensor(CHILD_ID_IINST).set(char_AMPERE));
send(msgVA.setSensor(CHILD_ID_PAPP).set(char_VA));
wait(DELAY_PREFIX);
}
flag_first= false;
}
/************ Fin de LOOP *******************/
//------------------------ Fin Pgm ----------------------------