String STGE = "012A4401";
/*
0 1 2 A 4 4 0 1
0000 0001 0010 1010 0100 0100 0000 0001
^ contact C1 C2 bit 0
^^^ organe de coupure bit 1,2,3
^ ouverture du capot coté ENEDIS bit 4
^ toujours 0 bit 5
^ surtension bit 6
^ Avis de dépassement bit 7
^ producteur/consommateur bit 8
^ sens de l'énergie soutire ou export bit 9
^^ ^^ Tarif fourniture en cours bit 10,11,12,13
^^ Tarif revente en cours bit 14,15
^ qualité horodatage bit 16
^ mode TIC, bit 17
^ Non utilisé bit 18
^ ^ Comm Euridis bit 19,20
^^ Status CPL bit 21,22
^ Syncro CPL bit 23
^^ Couleur du jour bit 24,25
^^ Couleur demain bit 26,27
^^ Préavis pointe mobiles
^^ Pointe mobile en lien avec étiquettes DPM1 FPM1 DPM2 FPM2 DPM3 FPM3
0000 1111 0010 1010 0101 0100 1000 0000
0 F 2 A 5 4 0 0
*/
uint32_t statusReg=0;
byte contact = 0;
byte depassement = 0;
byte indexActif = 0;
byte colDuJour = 0;
byte colDemain = 0;
#define UNKN 0b00
#define BLEU 0b01
#define BLAN 0b10
#define ROUG 0b11
char tarifTempo[6][9] = {"Bleu HC","Bleu HP","Blanc HC","Blanc HP","Rouge HC","Rouge HP"};
char couleur[4][5] = {"UNKN","BLEU","BLAN","ROUG"};
String STGE_2Couleurs = ""; // Tempo lendemain et ce jour sur 1 lettre (code hexa 0 à F soit 4 bits)
String STGE_DEMAIN = ""; // F1ATB ne garde qua la couleur de demain 0b0000 = 0 = unconnu / 0b0100 = 4 = Bleu / 0b1000 = 8 = Blanc / 0b1100 = C = Rouge
void setup() {
// supposant que le linky soit avec un fournisseur en tarif tempo
Serial.begin(115200);
Serial.println("\n");
STGE = "012A4401";
STGE = "0F2A5480"; // test contact C1-C2 / dépassement puissance / tarif Rouge HP / Tempo rouge ce jour et demain
Serial.printf("Pour le contenu STGE : %s\n\n",STGE.c_str());
statusReg = strtoul(STGE.c_str(),NULL,16); // converti la chaine d'un texte hexa en numérique
byte ContactC1C2 = (strtoul(STGE.c_str(),NULL,16)) & 0b1;
Serial.printf("C1-C2 : %d\n", ContactC1C2);
STGE_2Couleurs = String((statusReg >> 24) & 0x0F, HEX); // Tempo lendemain et ce jour sur 1 lettre (code hexa 0 à F soit 4 bits)
STGE_2Couleurs.toUpperCase();
STGE_DEMAIN = String(strtoul(STGE_2Couleurs.c_str(), NULL, 16) & 0b1100, HEX); // F1ATB ne garde qua la couleur de demain 0b0000 = 0 = unconnu / 0b0100 = 4 = Bleu / 0b1000 = 8 = Blanc / 0b1100 = C = Rouge
STGE_DEMAIN.toUpperCase();
Serial.println(STGE_2Couleurs);
Serial.println(STGE_DEMAIN);
Serial.print("Contenu du registre STGE en bit : \n");
for (int i=32; i>0; i=i-4) {
String S = "0000" + String((statusReg >> i-4) & 0xF, BIN);
S = S.substring(S.length() - 4);
Serial.printf("%s ",S);
}
Serial.println();
Serial.println(" | | | | | | | ^ contact C1 C2 bit 0");
Serial.println(" | | | | | | |^^^ organe de coupure bit 1,2,3");
Serial.println(" | | | | | | -----");
Serial.println(" | | | | | | ^ ouverture du capot coté ENEDIS bit 4");
Serial.println(" | | | | | | ^ toujours 0 bit 5");
Serial.println(" | | | | | | ^ surtension bit 6");
Serial.println(" | | | | | |^ Avis de dépassement bit 7");
Serial.println(" | | | | | ----------");
Serial.println(" | | | | | ^ producteur/consommateur bit 8");
Serial.println(" | | | | | ^ sens de l'énergie soutire ou export bit 9");
Serial.println(" | | | | ^^ ^^------------ Tarif fourniture en cours bit 10,11,12,13");
Serial.println(" | | | |^^ Tarif revente en cours bit 14,15");
Serial.println(" | | | --------------------");
Serial.println(" | | | ^ qualité horodatage bit 16");
Serial.println(" | | | ^ mode TIC, bit 17");
Serial.println(" | | | ^ Non utilisé bit 18");
Serial.println(" | | ^ ^ ---------------------- Comm Euridis bit 19,20");
Serial.println(" | | ^^ Status CPL bit 21,22");
Serial.println(" | |^ Syncro CPL bit 23");
Serial.println(" ------------------------------");
Serial.println(" | ^^ Couleur du jour bit 24,25");
Serial.println(" |^^ Couleur demain bit 26,27");
Serial.println(" -----------------------------------");
Serial.println(" ^^ Préavis pointe mobiles bit 28,29");
Serial.println("^^ Pointe mobile en lien avec étiquettes DPM1 FPM1 DPM2 FPM2 DPM3 FPM3");
colDuJour = (statusReg >> 24) & 0b11; // les bits 24 et 25 donne la couleur du jour
Serial.print("bits couleur du jour : ");
Serial.println(colDuJour,BIN);
Serial.printf("Couleur du jour : %s\n\n",couleur[colDuJour]);
colDemain = (statusReg >> 26) & 0b11; // les bits 26 et 27 donne la couleur de demain
Serial.print("bits couleur de demain : ");
Serial.println(colDemain,BIN);
Serial.printf("Couleur de demain : %s\n\n", couleur[colDemain]);
contact = statusReg & 0b1; // le premier bit du registre donne l'état du contact sec (période creuse / période pleine)
Serial.printf("Le contact C1 C2 est : %s\n\n", (contact == 1 ? "ouvert" : "fermé")); // a vérifier sur situation réélle
depassement = (statusReg >> 7) & 0b1; // le bit 7 du registre donne l'information du dépassement de la puissance souscrite
Serial.printf("En ce moment, la puissance soutirée%sdépasse%sle contrat souscrit\n\n",(depassement ? " ": " ne "),(depassement ? " ": " pas "));
indexActif = (statusReg >> 10) & 0b1111; // les bits 10, 11, 12 et 13 donne l'index actif (comptage energie)
// 0b0000 = Index 1 = tempo heure creuse tarif bleu
// 0b0001 = Index 2 = tempo heure pleine tarif bleu
// 0b0010 = Index 3 = tempo heure creuse tarif blanc
// 0b0011 = Index 4 = tempo heure pleine tarif blanc
// 0b0100 = Index 5 = tempo heure creuse tarif rouge
// 0b0101 = Index 6 = tempo heure pleine tarif rouge
Serial.print("bits index actif : ");Serial.println(indexActif, BIN);
Serial.printf("Tarif en cours : %s\n",tarifTempo[indexActif]);
}
void loop() {
// put your main code here, to run repeatedly:
delay(10); // this speeds up the simulation
}