-
Notifications
You must be signed in to change notification settings - Fork 26
Description
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
-
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)"; -
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 1800Overal waar '1200' hardcoded stond, heb ik dat op 'MAX_TLGRM_LENGTH' gezet
-
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(); -
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 resultNaar: 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 !