Victor-Mo / IRT-ESP

Nefit / Buderus iRT protocol encoder / decoder for ESP8266
GNU Lesser General Public License v3.0
23 stars 6 forks source link

Multiple iRT dialects? #4

Closed Chreetz closed 3 years ago

Chreetz commented 4 years ago

Hi Victor,

Great work reverse engineering the iRT protocol!

Unaware of your work I tried to reverse engineer it myself, but without success. However, it seems my UBA and Thermostat are somewhat different than yours. My boiler is a Nefit Ecomline Classic HRC30, thermostat is Moduline 30.

What is working is Hot Water on/off and Heating on/off. Current flowtemperature shows a logical value, but this value is nowhere to be found in the Thermostat menus. Selected temp, boiler, return, all stay at 0. Al thermostat values remain undefined. Maybe a different iRT dialect?

I will try to reverse engineer some more datagram types. Would you be interested in a dump of my datagrams? (https://github.com/Chreetz/iRT-dump)

Regards, Chris

Victor-Mo commented 4 years ago

@Chreetz

Hi Chris,

Sorry for the late reply. To be honest I really do not if there are different dialects. What I did see is that there is a difference between thermostats. It looks like the Moduline 300 requests more information than any of the other thermostats (moduline IV / Moduline 30).

If I look at the hex data it looks pretty much like the data I have seen from other thermostats. I have marked in the attached picture a number of messages (from your data) : hex_data_dump_marked

0xA4 - Current output water temperature in Celsius. 0x90 - Maximum heating water temperate. 0x8A - Reports the temperature of the external temperature sensor of the boiler. 0x07 - Start the burner and set burner power. 0xA3 - Display code (-H, =H)

The external temperature sensor (the 0x8A msg) does not report in celsius. I think it is the raw A/D converter output of the external NTC resistor. But i do not have an external sensor. I did do a test with 2 different resistor values ( see: Wiki )

If you need any additional information, just let me know.

Regards,

Victor

Chreetz commented 4 years ago

Hi Victor, Thanks - I'm sorry for my late response too. Guess I missed the github alert. I'm still trying to understand the way VSC and Platform.IO work. It was easy to setup, build and upload. But things like the way the webfiles end up on the device still puzzles me. Chris

Chreetz commented 4 years ago

Hi, There is still a thing that puzzles me.

The situation now: -The EMS Dashboard indicates a Current Flow Temp of 14 degrees -The Moduline 30 displays 25 degrees as setpoint <- calculated by Moduline -The Moduline 30 displays 22 degrees as measured (aanvoer?) <- Measured value from the boiler -The Moduline 30 displays 21 degrees as outside temp <- Measured value from the boiler

Where is the 22 degrees in the communication?

System Logging set to Raw mode

-> (00:52:54.669) irt_raw: 05: 90 E9 4C 72 A1 (00:52:54.670) irt_raw: 04: 01 11 E5 9C (00:52:54.670) irt_raw: 04: 07 CC 7C 6F (00:53:00.171) irt_raw: 05: 90 F8 DD 26 A1 (00:53:00.172) irt_raw: 05: 82 12 1D D2 00 (00:53:00.172) irt_raw: 05: A3 03 A5 03 07 (00:53:00.172) irt_raw: 05: 8A 77 47 61 8C (00:53:00.173) irt_raw: 05: 84 20 C7 F3 55 Publishing boiler data via MQTT (00:53:04.893) irt_raw: 05: 90 35 BA 20 A1 (00:53:04.893) irt_raw: 04: 73 52 25 43 (00:53:04.894) irt_raw: 04: 78 04 00 70 (00:53:04.894) irt_raw: 04: 04 00 0B 28 01:11 04:00 05:04 07:CC 73:52 78:04 | 81:45 82:00 84:55 8A:8C 90:A1 93:00 A3:07 A4:0E C9:00 DE:8C 0y (00:53:09.914) irt_raw: 05: 90 68 B6 AA A1 (00:53:09.915) irt_raw: 05: 82 5D BD FE 00 (00:53:09.915) irt_raw: 05: A3 19 7F 74 07 (00:53:09.915) irt_raw: 05: 8A DE 53 7A 8C (00:53:09.915) irt_raw: 05: 84 0A D5 EF 55 Publishing boiler data via MQTT (00:53:15.095) irt_raw: 05: 90 AC 3E 29 A1 (00:53:15.096) irt_raw: 04: 73 52 25 43 (00:53:15.096) irt_raw: 04: 78 05 04 62 (00:53:15.096) irt_raw: 04: 05 04 28 AD 01:11 04:00 05:04 07:CC 73:52 78:05 | 81:45 82:00 84:55 8A:8C 90:A1 93:00 A3:07 A4:0E C9:00 DE:8C 0y (00:53:21.036) irt_raw: 05: 90 4E 5D 61 A1 (00:53:21.037) irt_raw: 05: 82 4B C5 2B 00 (00:53:21.037) irt_raw: 05: A3 93 9B C2 07 (00:53:21.037) irt_raw: 05: 8A 85 F1 76 8C (00:53:21.037) irt_raw: 05: 84 52 DC 7B 55 Publishing boiler data via MQTT (00:53:25.757) irt_raw: 05: 90 44 4B 2D A1 (00:53:25.757) irt_raw: 05: C9 81 40 CB 00 (00:53:25.757) irt_raw: 05: DE 65 05 00 8C (00:53:31.218) irt_raw: 05: 90 BE 80 C7 A1 (00:53:31.218) irt_raw: 05: 82 AC 25 57 00 (00:53:31.218) irt_raw: 05: A3 8C 3A 4A 07 (00:53:31.219) irt_raw: 05: 8A F8 DD 3C 8C (00:53:31.219) irt_raw: 05: 84 12 1D D4 55 Publishing boiler data via MQTT (00:53:36.079) irt_raw: 05: 90 03 A5 30 A1 (00:53:36.079) irt_raw: 05: 81 77 47 6A 45 (00:53:36.080) irt_raw: 05: 93 20 C7 E4 00 (00:53:36.080) irt_raw: 05: A4 35 BA 14 0E Publishing boiler data via MQTT (00:53:41.061) irt_raw: 05: 90 85 D8 C8 A1 (00:53:41.061) irt_raw: 05: 82 E2 D2 3C 00 (00:53:41.061) irt_raw: 05: A3 18 98 C1 07 (00:53:41.062) irt_raw: 05: 8A 4E 5D 7B 8C (00:53:41.062) irt_raw: 05: 84 4B C5 2D 55 Publishing boiler data via MQTT (00:53:45.882) irt_raw: 05: 90 93 9B F1 A1 (00:53:45.882) irt_raw: 04: 73 52 25 43 (00:53:45.883) irt_raw: 04: 78 01 FF AD (00:53:45.883) irt_raw: 04: 73 52 25 43 (00:53:45.883) irt_raw: 04: 78 07 FF A1 01:11 04:00 05:04 07:CC 73:52 78:07 | 81:45 82:00 84:55 8A:8C 90:A1 93:00 A3:07 A4:0E C9:00 DE:8C 0y (00:53:50.903) irt_raw: 05: 90 85 F1 6C A1 (00:53:50.904) irt_raw: 05: 82 52 DC 7D 00 (00:53:50.904) irt_raw: 05: A3 44 4B 1E 07 (00:53:50.904) irt_raw: 05: 8A 81 40 88 8C (00:53:50.904) irt_raw: 05: 84 65 05 5A 55 Publishing boiler data via MQTT (00:53:56.444) irt_raw: 05: 90 BE 80 C7 A1 (00:53:56.444) irt_raw: 04: 01 11 8B 3D (00:53:56.445) irt_raw: 04: 07 CC 0D B2 (00:54:01.886) irt_raw: 05: 90 FC 44 78 A1 (00:54:01.886) irt_raw: 05: 82 E9 34 99 00 (00:54:01.886) irt_raw: 05: A3 DF 09 20 07 (00:54:01.887) irt_raw: 05: 8A F4 14 2B 8C (00:54:01.887) irt_raw: 05: 84 02 D7 F7 55 Publishing boiler data via MQTT (00:54:06.627) irt_raw: 05: 90 6B 98 14 A1 (00:54:06.628) irt_raw: 04: 73 52 25 43 (00:54:06.628) irt_raw: 04: 78 04 00 70 (00:54:06.628) irt_raw: 04: 04 00 12 4C 01:11 04:00 05:04 07:CC 73:52 78:04 | 81:45 82:00 84:55 8A:8C 90:A1 93:00 A3:07 A4:0E C9:00 DE:8C 0y (00:54:12.549) irt_raw: 05: 90 A8 A6 73 A1 (00:54:12.549) irt_raw: 05: 82 93 B4 5F 00 (00:54:12.549) irt_raw: 05: A3 BB 9E 86 07 (00:54:12.550) irt_raw: 05: 8A DF 3A C5 8C (00:54:12.550) irt_raw: 05: 84 9B CB AC 55 Publishing boiler data via MQTT (00:54:17.289) irt_raw: 05: 90 6C 4E 69 A1 (00:54:17.290) irt_raw: 04: 73 52 25 43 (00:54:17.290) irt_raw: 04: 78 05 04 62 (00:54:17.290) irt_raw: 04: 05 04 74 C4 01:11 04:00 05:04 07:CC 73:52 78:05 | 81:45 82:00 84:55 8A:8C 90:A1 93:00 A3:07 A4:0E C9:00 DE:8C 0y (00:54:22.250) irt_raw: 05: 90 18 98 F2 A1 (00:54:22.251) irt_raw: 05: 82 4E 5D 73 00 (00:54:22.251) irt_raw: 05: A3 4B C5 0A 07 (00:54:22.251) irt_raw: 05: 8A 93 9B EB 8C (00:54:22.251) irt_raw: 05: 84 85 F1 78 55 Publishing boiler data via MQTT (00:54:27.391) irt_raw: 05: 90 52 DC 6F A1 (00:54:27.391) irt_raw: 05: C9 44 4B 74 00 (00:54:27.391) irt_raw: 05: DE 81 40 DC 8C (00:54:32.391) irt_raw: 05: 90 65 05 4E A1 (00:54:32.392) irt_raw: 05: 82 BE 80 D5 00 (00:54:32.392) irt_raw: 05: A3 AC 25 76 07 (00:54:32.392) irt_raw: 05: 8A 8C 3A 63 8C (00:54:32.393) irt_raw: 05: 84 F8 DD 32 55 Publishing boiler data via MQTT (00:54:37.292) irt_raw: 05: 90 12 1D C0 A1 (00:54:37.293) irt_raw: 05: 81 03 A5 21 45 (00:54:37.293) irt_raw: 05: 93 77 47 78 00 (00:54:37.293) irt_raw: 05: A4 20 C7 D3 0E Publishing boiler data via MQTT (00:54:42.274) irt_raw: 05: 90 35 BA 20 A1 (00:54:42.274) irt_raw: 05: 82 85 D8 DA 00 (00:54:42.275) irt_raw: 05: A3 E2 D2 1D 07 (00:54:42.275) irt_raw: 05: 8A 18 98 E8 8C (00:54:42.275) irt_raw: 05: 84 4E 5D 75 55 Publishing boiler data via MQTT (00:54:47.556) irt_raw: 05: 90 4B C5 39 A1 (00:54:47.556) irt_raw: 04: 73 52 25 43 (00:54:47.557) irt_raw: 04: 78 01 FF AD (00:54:47.557) irt_raw: 04: 73 52 25 43 (00:54:47.557) irt_raw: 04: 78 07 FF A1 01:11 04:00 05:04 07:CC 73:52 78:07 | 81:45 82:00 84:55 8A:8C 90:A1 93:00 A3:07 A4:0E C9:00 DE:8C 0y (00:54:52.538) irt_raw: 05: 90 93 9B F1 A1 (00:54:52.538) irt_raw: 05: 82 85 F1 7E 00 (00:54:52.538) irt_raw: 05: A3 52 DC 5C 07 (00:54:52.539) irt_raw: 05: 8A 44 4B 37 8C (00:54:52.539) irt_raw: 05: 84 81 40 86 55 Publishing boiler data via MQTT (00:54:57.178) irt_raw: 05: 90 65 05 4E A1 (00:54:57.179) irt_raw: 04: 01 11 DF 74 (00:54:57.179) irt_raw: 04: 07 CC CD 99 (00:55:03.120) irt_raw: 05: 90 F4 2D D5 A1 (00:55:03.120) irt_raw: 05: 82 72 E1 C9 00 (00:55:03.120) irt_raw: 05: A3 97 4C BD 07 (00:55:03.121) irt_raw: 05: 8A 73 C8 67 8C (00:55:03.121) irt_raw: 05: 84 27 42 DB 55 Publishing boiler data via MQTT (00:55:07.860) irt_raw: 05: 90 81 72 5A A1 (00:55:07.861) irt_raw: 04: 73 52 25 43 (00:55:07.861) irt_raw: 04: 78 04 00 70 (00:55:07.861) irt_raw: 04: 04 00 CF 13 01:11 04:00 05:04 07:CC 73:52 78:04 | 81:45 82:00 84:55 8A:8C 90:A1 93:00 A3:07 A4:0E C9:00 DE:8C 0y (00:55:12.861) irt_raw: 05: 90 52 DC 6F A1 (00:55:12.861) irt_raw: 05: 82 44 4B 3F 00 (00:55:12.862) irt_raw: 05: A3 81 40 A1 07 (00:55:12.862) irt_raw: 05: 8A 65 05 54 8C (00:55:12.862) irt_raw: 05: 84 BE 80 D3 55 Publishing boiler data via MQTT (00:55:17.562) irt_raw: 05: 90 AC 25 45 A1 (00:55:17.562) irt_raw: 04: 73 52 25 43 (00:55:17.563) irt_raw: 04: 78 05 04 62 (00:55:17.563) irt_raw: 04: 05 04 49 30 01:11 04:00 05:04 07:CC 73:52 78:05 | 81:45 82:00 84:55 8A:8C 90:A1 93:00 A3:07

Victor-Mo commented 4 years ago

Hi Chreetz,

There are a number of steps in the way the web files are added to the firmware. From the directory './tools/webfilesbuilder' The gulp.js script is run (node node_modules/gulp/bin/gulp.js) (see also: https://emsesp.github.io/docs/#/Building-firmware ).

The gulp.js script will process the html and javascript from './src/websrc/' . It will concatenate, gzip and convert them to 'c' header files (.h). The output can be found in './src/webh/'.

These header files are then included bij ./src/myESP.h and build into the firmware.

The 'A4 35 BA 14 0E' message reports a outgoing water temperature of 14 (0x0E) degrees. This seems to be a bit low. I always have found this value a bit low, also on my system, maybe the Moduline adds a offset of 8 ? With an outside temperature of 21 degrees an water temperature of 22 degrees makes more sense. Also the moduline is requesting the boiler to limit the water temperature to 17 (0x11) degrees (01 11 DF 74). This also seems to have an offset of 8 with the setpoint of 25 degrees.

The outside temperature is reported through the 0x8A message (8A 65 05 54 8C) It reports the raw measured value of the outside temperature NTC resistor. I still need to add a conversion table to convert raw measured values to degrees. But at least I now know the raw value of 0x8C means 21 degrees ! (I do not have an outside temperature).

Victor-Mo commented 4 years ago

I just did a test on my boiler and I can confirm there is a 8 degree offset, i will fix that in a next version.

Chreetz commented 4 years ago

Hi Victor,

Thanks for your explanation.

The thing that puzzled me the most in the build process is I assumed the webfiles are stored in the spiffs filesystem. So it is not the webpages are translated into consts...

As for the temperature: I don't think it is a fixed offset. At higher temperatures the values seem to match although the Moduline is behind than the iRT. When the temp stabilizes at 72 the values match. Looks like: EMS_Boiler.curFlowTemp = (data[4] * 8.6) + 100;

And for the outside Temperature: Since it's been quite warm lately I have some value/temp pairs, but I think we need temperatures aound 5 degrees or less to create a workable translation function:

iRT vs Moduline 148 = 18 graden 137 = 22 graden 114 = 31 graden

I recorded a start (boot) of the system. There are some F0 messages (which are not stored?):

(17:02:48.024) irt_crcErr3: 0C: 01 01 FE 90 90 93 93 9B 9B F1 73 73 (17:02:50.784) irt_crcErr1: 03: 01 01 FE (17:02:51.444) irt_crcErr1: 03: 01 01 FE (17:02:52.103) irt_crcErr1: 03: 01 01 FE (17:02:52.763) irt_crcErr1: 03: 01 01 FE (17:02:53.423) irt_crcErr1: 03: 01 01 FE (17:02:54.083) irt_crcErr1: 03: 01 01 FE (17:02:54.743) irt_crcErr1: 03: 01 01 FE (17:02:59.682) irt_raw: 05: 90 00 DC CB A1 (17:02:59.682) irt_raw: 05: 82 19 66 31 00 (17:02:59.682) irt_raw: 05: A3 6F 49 40 06 (17:02:59.683) irt_raw: 05: 8A DF 21 A9 92 (17:02:59.683) irt_raw: 05: 84 2B C1 FD 55 01:15 04:00 05:04 07:CC 73:52 78:05 | 81:45 82:00 84:55 8A:92 90:A1 93:00 A3:06 A4:0F C9:00 DE:8C 0U (17:03:04.500) irt_raw: 05: 90 40 9A 4A A1 (17:03:04.500) irt_raw: 05: 81 A8 A6 62 45 (17:03:04.501) irt_raw: 05: 93 93 B4 4E 00 (17:03:04.501) irt_raw: 05: A4 BB 9E 81 0F Publishing boiler data via MQTT (17:03:05.663) irt_raw: 05: F0 1F FE 1D 82 (17:03:05.663) irt_raw: 05: F0 1F FF 19 D3 (17:03:05.663) irt_raw: 05: F0 82 C5 D2 01 (17:03:05.664) irt_raw: 05: F0 82 C6 DE F1 (17:03:05.664) irt_raw: 05: F0 01 FA 31 BC (17:03:05.664) irt_raw: 05: F0 01 FB 35 02 (17:03:17.374) irt_raw: 05: F0 1F FE 1D 82 (17:03:17.374) irt_raw: 05: F0 1F FF 19 D3 (17:03:17.375) irt_raw: 05: F0 82 CC F6 01 (17:03:17.375) irt_raw: 05: F0 82 CD F2 20 (17:03:17.375) irt_raw: 05: F0 01 21 76 34 (17:03:21.912) irt_raw: 05: 90 9B CB B8 A1 (17:03:21.912) irt_raw: 05: 82 6C 4E 7B 00 (17:03:21.912) irt_raw: 05: A3 DB 8A 16 03 (17:03:21.913) irt_raw: 05: 8A FB 8E 6F 92 (17:03:21.913) irt_raw: 05: 84 FF F4 98 55 01:15 04:00 05:04 07:CC 73:52 78:05 | 81:45 82:00 84:55 8A:92 90:A1 93:00 A3:03 A4:0F C9:00 DE:8C 0H

Best, Chris

Victor-Mo commented 4 years ago

I have added logging of the 0xF0 messages to the status logging (log s) in the latest v1.9.10 build. I have added a conversion for the reporting of the temperatures. The outside temp. should also be correct.

Victor-Mo commented 3 years ago

Closing the issue, feel free to reopen if necessary.