From 223b59a228621bf95624fa164e1ff14e18c12100 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 14 Mar 2023 15:49:11 +0100 Subject: [PATCH] Found last unkown status frame is also aircon. --- components/truma_inetbox/TrumaiNetBoxApp.cpp | 11 +- components/truma_inetbox/TrumaiNetBoxApp.h | 207 +++++++++++-------- 2 files changed, 125 insertions(+), 93 deletions(-) diff --git a/components/truma_inetbox/TrumaiNetBoxApp.cpp b/components/truma_inetbox/TrumaiNetBoxApp.cpp index eda0567..7857175 100644 --- a/components/truma_inetbox/TrumaiNetBoxApp.cpp +++ b/components/truma_inetbox/TrumaiNetBoxApp.cpp @@ -403,14 +403,21 @@ const u_int8_t *TrumaiNetBoxApp::lin_multiframe_recieved(const u_int8_t *message ESP_LOGI(TAG, "StatusFrameAirconInit"); // Example: // SID<---------PREAMBLE---------->|<---MSG_HEAD---->| - // BB.00.1F.00.1E.00.00.22.FF.FF.FF.54.01.16.3F.00.E2.00.00.71.01.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00 + // BB.00.1F.00.1E.00.00.22.FF.FF.FF.54.01.16.3F.00.E2.00.00.71.01.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00 return response; - } else if (header->message_type == STATUS_FRAME_AIRCON2 && header->message_length == sizeof(StatusFrameAircon2)) { + } else if (header->message_type == STATUS_FRAME_AIRCON_2 && header->message_length == sizeof(StatusFrameAircon2)) { ESP_LOGI(TAG, "StatusFrameAircon2"); // Example: // SID<---------PREAMBLE---------->|<---MSG_HEAD---->| // BB.00.1F.00.1E.00.00.22.FF.FF.FF.54.01.12.37.00.BF.01.00.01.00.00.00.00.00.00.00.00.00.00.00.49.0B.40.0B return response; + } else if (header->message_type == STATUS_FRAME_AIRCON_INIT_2 && + header->message_length == sizeof(StatusFrameAirconInit2)) { + ESP_LOGI(TAG, "StatusFrameAirconInit2"); + // Example: + // SID<---------PREAMBLE---------->|<---MSG_HEAD---->| + // BB.00.1F.00.1E.00.00.22.FF.FF.FF.54.01.14.41.00.53.01.00.01.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00 + return response; } else if (header->message_type == STATUS_FRAME_TIMER && header->message_length == sizeof(StatusFrameTimer)) { ESP_LOGI(TAG, "StatusFrameTimer"); // EXAMPLE: diff --git a/components/truma_inetbox/TrumaiNetBoxApp.h b/components/truma_inetbox/TrumaiNetBoxApp.h index 4c56e8c..2d352a9 100644 --- a/components/truma_inetbox/TrumaiNetBoxApp.h +++ b/components/truma_inetbox/TrumaiNetBoxApp.h @@ -34,14 +34,14 @@ namespace truma_inetbox { #define STATUS_FRAME_HEATER 0x33 #define STATUS_FRAME_AIRCON_RESPONSE (STATUS_FRAME_AIRCON - 1) #define STATUS_FRAME_AIRCON 0x35 -#define STATUS_FRAME_AIRCON2_RESPONSE (STATUS_FRAME_AIRCON2 - 1) -#define STATUS_FRAME_AIRCON2 0x37 +#define STATUS_FRAME_AIRCON_2_RESPONSE (STATUS_FRAME_AIRCON_2 - 1) +#define STATUS_FRAME_AIRCON_2 0x37 #define STATUS_FRAME_TIMER_RESPONSE (STATUS_FRAME_TIMER - 1) #define STATUS_FRAME_TIMER 0x3D #define STATUS_FRAME_AIRCON_INIT_RESPONSE (STATUS_FRAME_AIRCON_INIT - 1) #define STATUS_FRAME_AIRCON_INIT 0x3F -// Error response - unknown function -#define STATUS_FRAME_UNKNOWN_40 0x40 +#define STATUS_FRAME_AIRCON_INIT_2_RESPONSE (STATUS_FRAME_AIRCON_INIT_2 - 1) +#define STATUS_FRAME_AIRCON_INIT_2 0x41 enum class HeatingMode : u_int16_t { HEATING_MODE_OFF = 0x0, @@ -226,71 +226,6 @@ struct StatusFrameHeaterResponse { // NOLINT(altera-struct-pack-align) EnergyMix energy_mix_b; } __attribute__((packed)); -// Length 18 (0x12) -// TODO -struct StatusFrameAircon { // NOLINT(altera-struct-pack-align) - // Mode? 00 - OFF, 04 - AC Ventilation, 05 - AC Cooling - u_int8_t unknown_01; - // 0x00 - u_int8_t unknown_02; - // 0x71 - u_int8_t unknown_03; - // 0x01 - u_int8_t unknown_04; - TargetTemp target_temp_room; - // 0x00 - u_int8_t unknown_07; - // 0x00 - u_int8_t unknown_08; - // No idea why two current_temp - TargetTemp current_temp_aircon; - // 0x00 - u_int8_t unknown_11; - // 0x00 - u_int8_t unknown_12; - // 0x00 - u_int8_t unknown_13; - // 0x00 - u_int8_t unknown_14; - // 0x00 - u_int8_t unknown_15; - // 0x00 - u_int8_t unknown_16; - TargetTemp current_temp_room; -} __attribute__((packed)); - -// TODO -struct StatusFrameAirconResponse { // NOLINT(altera-struct-pack-align) - // Mode? 00 - OFF, 04 - AC Ventilation, 05 - AC Cooling - u_int8_t unknown_01; - // 0x00 - u_int8_t unknown_02; - // 0x71 - u_int8_t unknown_03; - // 0x01 - u_int8_t unknown_04; - TargetTemp target_temp_room; - // 0x00 - u_int8_t unknown_07; - // 0x00 - u_int8_t unknown_08; - // No idea why two current_temp - TargetTemp current_temp_aircon; - // 0x00 - u_int8_t unknown_11; - // 0x00 - u_int8_t unknown_12; - // 0x00 - u_int8_t unknown_13; - // 0x00 - u_int8_t unknown_14; - // 0x00 - u_int8_t unknown_15; - // 0x00 - u_int8_t unknown_16; - TargetTemp current_temp_room; -} __attribute__((packed)); - // Length 24 (0x18) struct StatusFrameTimer { // NOLINT(altera-struct-pack-align) TargetTemp timer_target_temp_room; @@ -406,36 +341,73 @@ struct StatusFrameDevice { // NOLINT(altera-struct-pack-align) u_int8_t unknown_3; } __attribute__((packed)); -// Length 22 (0x16) +// Length 18 (0x12) // TODO -struct StatusFrameAirconInit { // NOLINT(altera-struct-pack-align) - u_int8_t unknown_01; // 0x00 - u_int8_t unknown_02; // 0x00 +struct StatusFrameAircon { // NOLINT(altera-struct-pack-align) + // Mode? 00 - OFF, 04 - AC Ventilation, 05 - AC Cooling + u_int8_t unknown_01; + // 0x00 + u_int8_t unknown_02; // 0x71 u_int8_t unknown_03; // 0x01 u_int8_t unknown_04; - u_int8_t unknown_05; // 0x00 - u_int8_t unknown_06; // 0x00 - u_int8_t unknown_07; // 0x00 - u_int8_t unknown_08; // 0x00 - u_int8_t unknown_09; // 0x00 - u_int8_t unknown_10; // 0x00 - u_int8_t unknown_11; // 0x00 - u_int8_t unknown_12; // 0x00 - u_int8_t unknown_13; // 0x00 - u_int8_t unknown_14; // 0x00 - u_int8_t unknown_15; // 0x00 - u_int8_t unknown_16; // 0x00 - u_int8_t unknown_17; // 0x00 - u_int8_t unknown_18; // 0x00 - u_int8_t unknown_19; // 0x00 - u_int8_t unknown_20; // 0x00 - u_int8_t unknown_21; // 0x00 - u_int8_t unknown_22; // 0x00 + TargetTemp target_temp_room; + // 0x00 + u_int8_t unknown_07; + // 0x00 + u_int8_t unknown_08; + // No idea why two current_temp + TargetTemp current_temp_aircon; + // 0x00 + u_int8_t unknown_11; + // 0x00 + u_int8_t unknown_12; + // 0x00 + u_int8_t unknown_13; + // 0x00 + u_int8_t unknown_14; + // 0x00 + u_int8_t unknown_15; + // 0x00 + u_int8_t unknown_16; + TargetTemp current_temp_room; +} __attribute__((packed)); + +// TODO +struct StatusFrameAirconResponse { // NOLINT(altera-struct-pack-align) + // Mode? 00 - OFF, 04 - AC Ventilation, 05 - AC Cooling + u_int8_t unknown_01; + // 0x00 + u_int8_t unknown_02; + // 0x71 + u_int8_t unknown_03; + // 0x01 + u_int8_t unknown_04; + TargetTemp target_temp_room; + // 0x00 + u_int8_t unknown_07; + // 0x00 + u_int8_t unknown_08; + // No idea why two current_temp + TargetTemp current_temp_aircon; + // 0x00 + u_int8_t unknown_11; + // 0x00 + u_int8_t unknown_12; + // 0x00 + u_int8_t unknown_13; + // 0x00 + u_int8_t unknown_14; + // 0x00 + u_int8_t unknown_15; + // 0x00 + u_int8_t unknown_16; + TargetTemp current_temp_room; } __attribute__((packed)); // Length 18 (0x12) +// TODO struct StatusFrameAircon2 { // NOLINT(altera-struct-pack-align) u_int8_t unknown_01; // 0x01 u_int8_t unknown_02; // 0x00 @@ -455,6 +427,58 @@ struct StatusFrameAircon2 { // NOLINT(altera-struct-pack-align) TargetTemp target_temp; } __attribute__((packed)); +// Length 22 (0x16) +// TODO +struct StatusFrameAirconInit { // NOLINT(altera-struct-pack-align) + u_int8_t unknown_01; // 0x00 + u_int8_t unknown_02; // 0x00 + u_int8_t unknown_03; // 0x71 + u_int8_t unknown_04; // 0x01 + u_int8_t unknown_05; // 0x00 + u_int8_t unknown_06; // 0x00 + u_int8_t unknown_07; // 0x00 + u_int8_t unknown_08; // 0x00 + u_int8_t unknown_09; // 0x00 + u_int8_t unknown_10; // 0x00 + u_int8_t unknown_11; // 0x00 + u_int8_t unknown_12; // 0x00 + u_int8_t unknown_13; // 0x00 + u_int8_t unknown_14; // 0x00 + u_int8_t unknown_15; // 0x00 + u_int8_t unknown_16; // 0x00 + u_int8_t unknown_17; // 0x00 + u_int8_t unknown_18; // 0x00 + u_int8_t unknown_19; // 0x00 + u_int8_t unknown_20; // 0x00 + u_int8_t unknown_21; // 0x00 + u_int8_t unknown_22; // 0x00 +} __attribute__((packed)); + +// Length 20 (0x14) +// TODO +struct StatusFrameAirconInit2 { // NOLINT(altera-struct-pack-align) + u_int8_t unknown_01; // 0x01 + u_int8_t unknown_02; // 0x00 + u_int8_t unknown_03; // 0x01 + u_int8_t unknown_04; // 0x00 + u_int8_t unknown_05; // 0x00 + u_int8_t unknown_06; // 0x00 + u_int8_t unknown_07; // 0x00 + u_int8_t unknown_08; // 0x00 + u_int8_t unknown_09; // 0x00 + u_int8_t unknown_10; // 0x00 + u_int8_t unknown_11; // 0x00 + u_int8_t unknown_12; // 0x00 + u_int8_t unknown_13; // 0x00 + u_int8_t unknown_14; // 0x00 + u_int8_t unknown_15; // 0x00 + u_int8_t unknown_16; // 0x00 + u_int8_t unknown_17; // 0x00 + u_int8_t unknown_18; // 0x00 + u_int8_t unknown_19; // 0x00 + u_int8_t unknown_20; // 0x00 +} __attribute__((packed)); + union StatusFrame { // NOLINT(altera-struct-pack-align) u_int8_t raw[41]; struct inner { // NOLINT(altera-struct-pack-align) @@ -472,6 +496,7 @@ union StatusFrame { // NOLINT(altera-struct-pack-align) StatusFrameAirconResponse airconResponse; StatusFrameAirconInit airconInit; StatusFrameAircon2 aircon2; + StatusFrameAirconInit2 airconInit2; } __attribute__((packed)); } inner; } __attribute__((packed));