linky_tic/tic.h
2025-04-26 23:55:28 +02:00

170 lines
7.8 KiB
C

#ifndef TIC_DEF
#define TIC_DEF
#include <Arduino.h>
#include <PubSubClient.h>
#define TIC
#define TIC_SPEED 9600 //9600 bps en mode standard ou 1500 bps pour le mode historique
#define DEBUG_SPEED 115200 //vitesse port débug
#define HTTP_PORT 80 //port
// Définition des constantes pour les délimiteurs de trame TIC
//Uniquement le mode standard est supporté
//CF document ENEDIS
#define STX 0x02 // Début de la trame : 0x02 (<STX>)
#define ETX 0x03 // Fin de la trame : 0x03 (<ETX>) End Of Text
#define EOT 0x04 // Fin de transmission
#define LF 0x0A /// Code ASCII pour <LF>, début de groupe d'information
#define CR 0x0D // Fin de groupe d'information
#define HT 0x09 // Séparateur dans le groupe
#define SP 0x20 // Séparateur dans le groupe
#define NONUTILE "NONUTILE" // Indicateur pour les champs non utilisés
// Constantes pour la taille des étiquettes et le nombre d'étiquettes
#define MAX_CHAR_ETIQUETTE 9 //CF doc ENEDIS
#define NB_ETIQUETTE 45
// Structure pour stocker les détails d'un groupe TIC
struct GroupDetail {
String globale;
String name; // Nom de l'étiquette
String value; // Valeur associée à l'étiquette
String horodate; // Horodatage de la valeur
bool updated;
bool checkok; //status of checksum
};
// Structure pour les bits de statut du registre
struct RegistreStatusBits {
uint32_t contactsec : 1; //bit 0 - État du contact sec
uint32_t organeCoupure : 3; //bit 1 / 3 - État de l'organe de coupure
uint32_t cache : 1; //bit 4 - Cache
uint32_t : 1; //bit 5
uint32_t surtension : 1; //bit 6 - Indicateur de surtension
uint32_t depassementPuissance : 1; //bit 7 - Indicateur de dépassement de puissance
uint32_t consoProd : 1; //bit 8 - Indicateur de consommation/production
uint32_t senseActiveEnergy : 1; //bit 9 - Sens de l'énergie active
uint32_t tarifIndexConso : 4; //bit 10/13 - Index tarifaire de consommation
uint32_t tarifIndexProd : 2; //bit 14/15 - Index tarifaire de production
uint32_t horlogeState : 1; //bit 16 - État de l'horloge
uint32_t ticState : 1; //bit 17 - État du TIC
uint32_t : 1; //bit 18
uint32_t comEuridis : 2; //bit 19/20 - Communication Euridis
uint32_t cplState : 2; //bit 21/22 - État du CPL
uint32_t cplSynchro : 1; //bit 23 - Synchronisation CPL
uint32_t tempo : 2; //bit 24/25 - Couleur du jour Tempo
uint32_t tempoNextDay : 2; //bit 26/27 - Couleur du jour Tempo suivant
uint32_t preavisPM : 2; //bit 28/29 - Préavis pointe mobile
uint32_t PM : 2; //bit 30/31 - Pointe mobile
};
// Structure pour les bits de statut des relais
struct RelaisStatusBits {
uint8_t relaisSec : 1; //bit 1 - État du relais sec
uint8_t relais1 : 1; //bit 2 - État du relais 1
uint8_t relais2 : 1; //bit 3
uint8_t relais3 : 1; //bit 4
uint8_t relais4 : 1; //bit 5
uint8_t relais5 : 1; //bit 6
uint8_t relais6 : 1; //bit 7
uint8_t relais7 : 1; //bit 8 - État du relais 7
};
// Structure pour les bits d'actions du calendrier
struct ActionsCalendrierBits {
uint8_t index : 4; // Index de l'action
uint8_t relais1 : 1; //bit 4 - État du relais 1
uint8_t relais2 : 1; //bit 8-----
uint8_t relais3 : 1; //bit 8-----
uint8_t relais4 : 1; //bit 8-----
uint8_t relais5 : 1; //bit 7-----
uint8_t relais6 : 1; //bit 6-----
uint8_t relais7 : 1; //bit 10 - État du relais 7
uint8_t : 3; //bit 11-13
uint16_t relaisSec : 2; ///État du relais sec
};
// Union pour gérer les actions du calendrier
union ActionCalendrier {
uint16_t ui;
ActionsCalendrierBits bits;
};
// Structure pour une action programmée
struct Action {
char startTime[4]; // Heure de début de l'action
ActionCalendrier action; // Action associée
};
// Union pour gérer le statut des relais
union RelaisStatus {
uint8_t ui;
RelaisStatusBits bits;
};
// Union pour gérer le statut du registre
union RegistreStatus {
uint32_t uli;
RegistreStatusBits bits;
};
const static String SelectedEtiquette[NB_ETIQUETTE] = {
"ADSC", // Adresse du compteur
"DATE", // Date et heure courantes
"NGTF", // Numéro de gestionnaire de réseau de transport
"LTARF", // Libellé du tarif en cours
"EAST", // Énergie active soutirée totale
"EASF01", "EASF02", "EASF03", "EASF04", // Énergie active soutirée par période tarifaire
"EASD01", "EASD02", "EASD03", "EASD04", // Énergie active soutirée par période tarifaire (distribuée)
"EAIT", // Énergie active injectée totale
"ERQ1", "ERQ2", "ERQ3", "ERQ4", // Énergie réactive par quadrant
"IRMS1", "IRMS2", "IRMS3", // Courant efficace par phase
"URMS1", "URMS2", "URMS3", // Tension efficace par phase
"PCOUP", // Puissance de coupure
"SINSTS", "SINSTS1", "SINSTS2", "SINSTS3", // Puissance apparente soutirée totale et par phase
"SINSTI", // Puissance apparente injectée
"STGE", // État du registre de statuts
"DPM1", "FPM1", "DPM2", "FPM2", "DPM3", "FPM3", // Début et fin de pointe mobile
"RELAIS", // État des relais
"NTARF", // Nom du tarif en cours
"NJOURF", "NJOURF+1", "PJOURF+1", // Couleur du jour et du lendemain
"MSG1", "MSG2", // Messages d'information
"PPOINTE" // Préavis de pointe mobile
};
// Tableau pour stocker les valeurs des groupes TIC identifiés
extern struct GroupDetail TicValues[NB_ETIQUETTE]; //records the values of the identified group
// Constantes pour la définition des statuts
const static String kContactStatus[2] = { "closed", "open" }; //relais et contacteurs
const static String kCoupure[7] = { "closed",
"open_overpower",
"open_overvoltage",
"open_shedding",
"open_euridis",
"open_overheat-with-overcurrent",
"open_overheat-without-overcurrent" };
const static String kOverVoltage[2] = { "no_overvoltage", "overvoltage" };
const static String kOverPower[2] = { "no_overpower", "overpower" };
const static String kProducer[2] = { "consummer", "producer" };
const static String kActivePower[2] = { "positive", "negative" };
const static String kHour[2] = { "ok", "degraded" };
const static String kTicMode[2] = { "historique", "standard" };
const static String kEuridis[4] = { "deactivated", "activated_without_security", "!!!", "activated_with_security" };
const static String kCpl[4] = { "new_unlock", "new_lock", "!!!", "registered" };
const static String kCplSynchro[2] = { "not_synchro", "synchro" };
const static String kTempoColor[4] = { "no", "blue", "white", "red" };
const static String kPointeMobile[4] = { "no", "PM1", "PM2", "PM3" };
// Prototypes des fonctions pour lire les données TIC et les convertir en JSON
void readTicPort();
String ticValuesAsJson();
String ticBasicValuesAsJson();
void mqttPublish(PubSubClient *mqttclient);
void mqttForcePublish(PubSubClient *mqttclient);
unsigned char calcCheckSum(const String &data);//(GroupDetail *data);
#endif