Skip to content

Fix: Belgian Fluvius meters without gas-meter block all processing (v3.0.5) #76

@iepervti

Description

@iepervti

Beste Willem,

Gisteren kwamen ze hier (Belgie) een digitale watermeter plaatsen en ik merkte dat die technieker ook pingelde aan de digitale meter.

Ik veronderstel dat hij de firmware heeft geupdate, vlgs ik lees zou nu ook de laatste 13 maandpieken beschikbaar zijn, hier terug te vinden (startdatum, tijdstip van de hoogste piek, waarde van die piek in kW):
0-0:98.1.0(13)(1-0:1.6.0)(1-0:1.6.0)(250301000000W)(250212120000W)(07.370kW)(250401000000S)(250315060000W)(09.303kW)(250501000000S)(250417063000S)(08.365kW)(250601000000S)(250521080000S)(05.852kW)(250701000000S)(250625183000S)(06.138kW)(250801000000S)(250725110000S)(05.043kW)(250901000000S)(250804003000S)(06.241kW)(251001000000S)(250917090000S)(05.717kW)(251101000000W)(251027183000W)(08.193kW)(251201000000W)(251118093000W)(08.303kW)(260101000000W)(251223144500W)(10.538kW)(260201000000W)(260119220000W)(08.159kW)(260301000000W)(260209184500W)(08.926*kW)

Het gevolg was dat versie v3.0.2 vd DSMR-logger niet meer werkte, aangezien het telegram is veranderd.
Met veel hulp van de ai 'gemini', heb ik dit na wat uren kunnen oplossen.

In bijlage een patch-file : dsmr_fluvius_fix-belgium.patch

  1. Syntax-foutje in bestand DSMRloggerAPI.ino , lijn 5:
    Dit : 5 const char* PROG_VERSION "v3.0.5 (18-03-2023)"
    Naar: 5 const char* PROG_VERSION = "v3.0.5 (18-03-2023)";

  2. De telegram-length is te klein geworden, MAX_TLGRM_LENGTH :
    In DSMRloggerAPI.h, regel 58
    Dit : 58 #define MAX_TLGRM_LENGTH 1200
    Naar: 58 #define MAX_TLGRM_LENGTH 1800

    Overal waar '1200' hardcoded stond, heb ik dat op 'MAX_TLGRM_LENGTH' gezet

  3. Ook de MQTT-buffer moet worden aangepast, van 256 naar 1200.
    Daarvoor plaatste ik in bestand DSMRloggerAPI.ino, op regel 430 erbij, net onder #ifdef USE_MQTT :
    430 MQTTclient.setBufferSize(MAX_TLGRM_LENGTH);
    431 connectMQTT();

  4. Ik heb geen gasmeter wat leidt tot een 'Malformed Telegram Segment':
    0-1:24.2.1(632525252525W)(00000.000)
    !CB88
    Dit blokkeerde in handleSlimmeMeter.ino, de functie processSlimmemeter(). it only calls processTelegram() if slimmeMeter.parse() returns true.
    Because of the malformed gas line, it returns false, effectively silencing the logger even though electricity data is valid.
    Vanaf regel 91 stelde Gemini dit voor:
    Parser Robustness: Modify processSlimmemeter() to execute processTelegram() even if parse() returns false (or specifically ignore errors related to M-Bus/Gas).
    Dit : 91 if (slimmeMeter.parse(&DSMRdata, &DSMRerror)) // Parse succesful, print result

    Naar: 91 bool parseSuccess = slimmeMeter.parse(&DSMRdata, &DSMRerror);
    92
    93 if (!parseSuccess) // Parse succesful, print result
    94 {
    95 DebugTf("Parse error (ignored for MQTT): %s\r\n", DSMRerror.c_str());
    96 // We tellen de error wel, maar blokkeren de verwerking niet
    97 telegramErrors++;
    98 }
    99
    100 // Vanaf hier gaan we ALTIJD door, ook als parseSuccess false was
    101 if (telegramCount > (UINT32_MAX - 10))
    102 {
    103 delay(1000);
    104 ESP.reset();
    105 delay(1000);
    106 }
    107 digitalWrite(LED_BUILTIN, LED_OFF);
    108 if (DSMRdata.identification_present)
    109 {
    110 //--- this is a hack! The identification can have a backslash in it
    111 //--- that will ruin javascript processing :-(
    112 for (int i = 0; i < DSMRdata.identification.length(); i++)
    113 {
    114 if (DSMRdata.identification[i] == '\') DSMRdata.identification[i] = '=';
    115 yield();
    116 }
    117 }
    118
    119 if (DSMRdata.p1_version_be_present)
    120 {
    121 DSMRdata.p1_version = DSMRdata.p1_version_be;
    122 DSMRdata.p1_version_be_present = false;
    123 DSMRdata.p1_version_present = true;
    124 }
    125
    126 modifySmFaseInfo();
    127
    128 if (!DSMRdata.timestamp_present)
    129 {
    130 sprintf(cMsg, "%02d%02d%02d%02d%02d%02d\0\0"
    131 , (year() - 2000), month(), day()
    132 , hour(), minute(), second());
    133 if (DSTactive) strConcat(cMsg, 15, "S");
    134 else strConcat(cMsg, 15, "W");
    135 DSMRdata.timestamp = cMsg;
    136 DSMRdata.timestamp_present = true;
    137 }
    138
    139 //-- handle mbus delivered values
    140 gasDelivered = modifyMbusDelivered();
    141
    142 processTelegram();
    143 if (Verbose2)
    144 {
    145 DebugTln("showValues: ");
    146 DSMRdata.applyEach(showValues());
    147 }
    149 // Reset de meter voor het volgende telegram
    150 if (!parseSuccess) {
    151 slimmeMeter.enable(true);
    152 slimmeMeter.loop();
    153 }
    154
    155/* }
    156 else // Parser error, print error
    157 {
    158 telegramErrors++;
    159#ifdef USE_SYSLOGGER
    160 sysLog.writef("Parse error\r\n%s\r\n\r\n", DSMRerror.c_str());
    161#endif
    162 DebugTf("Parse error\r\n%s\r\n\r\n", DSMRerror.c_str());
    163 //--- set DTR to get a new telegram as soon as possible
    164 slimmeMeter.enable(true);
    165 slimmeMeter.loop();
    166 }
    167*/

Het compileren in flashen is geen lachertje met de esp8266, na veel pogingen is het toch gelukt.
Alles netjes uitgelegd op we website ! (ook al zag ik soms wat later ;-) )

  • rechtstreeks flashen met de esp op mijn bureau (met serial->usb)
  • flashen via de webpagina
  • debug-informatie opsnorren met telnet, als netwerk werkte, anders via de seriel-monitor (ter plaatse met laptop).
  • littlefs flashen via data-map (bestanden werden niet meer gevonden)

Dank voor het geweldige werk !

dsmr_fluvius_fix-belgium.patch

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions