From d70092e52a1d46708102f5043318133582c3d12d Mon Sep 17 00:00:00 2001 From: Grzegorz Date: Fri, 11 Oct 2024 14:07:53 +0200 Subject: [PATCH 1/4] Add prohibit function for MiElHVAC Add Prohibit functions: * Power * Temperature * Mode and all combinations of this functions Updated VaneV names for better identify --- .../tasmota_xdrv_driver/xdrv_44_miel_hvac.ino | 80 +++++++++++++++++-- 1 file changed, 72 insertions(+), 8 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_44_miel_hvac.ino b/tasmota/tasmota_xdrv_driver/xdrv_44_miel_hvac.ino index 0d0661d6cfae..3b7e6da5d888 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_44_miel_hvac.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_44_miel_hvac.ino @@ -42,6 +42,7 @@ #define D_CMND_MIEL_HVAC_SETSWINGV "HVACSetSwingV" #define D_CMND_MIEL_HVAC_SETSWINGH "HVACSetSwingH" #define D_CMND_MIEL_HVAC_SETAIRDIRECTION "HVACSetAirDirection" +#define D_CMND_MIEL_HVAC_SETPROHIBIT "HVACSetProhibit" #define D_CMND_MIEL_HVAC_REMOTETEMP "HVACRemoteTemp" #include @@ -71,7 +72,8 @@ struct miel_hvac_data_settings { uint8_t temp; uint8_t fan; uint8_t vane; - uint8_t _pad2[2]; + uint8_t prohibit; + uint8_t _pad2[1]; uint8_t widevane; #define MIEL_HVAC_SETTTINGS_WIDEVANE_MASK \ 0x0f @@ -120,6 +122,7 @@ CTASSERT(offsetof(struct miel_hvac_data, data.settings.mode) == 4); CTASSERT(offsetof(struct miel_hvac_data, data.settings.temp) == 5); CTASSERT(offsetof(struct miel_hvac_data, data.settings.fan) == 6); CTASSERT(offsetof(struct miel_hvac_data, data.settings.vane) == 7); +CTASSERT(offsetof(struct miel_hvac_data, data.settings.prohibit) == 8); CTASSERT(offsetof(struct miel_hvac_data, data.settings.widevane) == 10); CTASSERT(offsetof(struct miel_hvac_data, data.settings.temp05) == 11); CTASSERT(offsetof(struct miel_hvac_data, data.settings.airdirection) == 14); @@ -155,7 +158,8 @@ struct miel_hvac_msg_update { #define MIEL_HVAC_UPDATE_F_TEMP (1 << 10) #define MIEL_HVAC_UPDATE_F_FAN (1 << 11) #define MIEL_HVAC_UPDATE_F_VANE (1 << 12) -#define MIEL_HVAC_UPDATE_F_AIRDIRECTION (1 << 13) +#define MIEL_HVAC_UPDATE_F_PROHIBIT (1 << 13) +#define MIEL_HVAC_UPDATE_F_AIRDIRECTION (1 << 14) uint8_t power; #define MIEL_HVAC_UPDATE_POWER_OFF 0x00 #define MIEL_HVAC_UPDATE_POWER_ON 0x01 @@ -190,7 +194,16 @@ struct miel_hvac_msg_update { #define MIEL_HVAC_UPDATE_VANE_4 0x04 #define MIEL_HVAC_UPDATE_VANE_5 0x05 #define MIEL_HVAC_UPDATE_VANE_SWING 0x07 - uint8_t _pad1[5]; + uint8_t prohibit; +#define MIEL_HVAC_UPDATE_PROHIBIT_OFF 0x00 +#define MIEL_HVAC_UPDATE_PROHIBIT_POWER 0x01 +#define MIEL_HVAC_UPDATE_PROHIBIT_MODE 0x02 +#define MIEL_HVAC_UPDATE_PROHIBIT_MODE_POWER 0x03 +#define MIEL_HVAC_UPDATE_PROHIBIT_TEMP 0x04 +#define MIEL_HVAC_UPDATE_PROHIBIT_TEMP_POWER 0x05 +#define MIEL_HVAC_UPDATE_PROHIBIT_TEMP_MODE 0x06 +#define MIEL_HVAC_UPDATE_PROHIBIT_ALL 0x07 + uint8_t _pad1[4]; uint8_t widevane; #define MIEL_HVAC_UPDATE_WIDEVANE_MASK 0x0f #define MIEL_HVAC_UPDATE_WIDEVANE_ISEE 0x00 @@ -217,6 +230,7 @@ CTASSERT(offsetof(struct miel_hvac_msg_update, mode) == MIEL_HVAC_OFFS(9)); CTASSERT(offsetof(struct miel_hvac_msg_update, temp) == MIEL_HVAC_OFFS(10)); CTASSERT(offsetof(struct miel_hvac_msg_update, fan) == MIEL_HVAC_OFFS(11)); CTASSERT(offsetof(struct miel_hvac_msg_update, vane) == MIEL_HVAC_OFFS(12)); +CTASSERT(offsetof(struct miel_hvac_msg_update, prohibit) == MIEL_HVAC_OFFS(13)); CTASSERT(offsetof(struct miel_hvac_msg_update, widevane) == MIEL_HVAC_OFFS(18)); CTASSERT(offsetof(struct miel_hvac_msg_update, temp05) == MIEL_HVAC_OFFS(19)); CTASSERT(offsetof(struct miel_hvac_msg_update, airdirection) == MIEL_HVAC_OFFS(20)); @@ -312,11 +326,11 @@ static const struct miel_hvac_map miel_hvac_fan_map[] = { static const struct miel_hvac_map miel_hvac_vane_map[] = { { MIEL_HVAC_UPDATE_VANE_AUTO, "auto" }, - { MIEL_HVAC_UPDATE_VANE_1, "1" }, - { MIEL_HVAC_UPDATE_VANE_2, "2" }, - { MIEL_HVAC_UPDATE_VANE_3, "3" }, - { MIEL_HVAC_UPDATE_VANE_4, "4" }, - { MIEL_HVAC_UPDATE_VANE_5, "5" }, + { MIEL_HVAC_UPDATE_VANE_1, "up" }, + { MIEL_HVAC_UPDATE_VANE_2, "up_middle" }, + { MIEL_HVAC_UPDATE_VANE_3, "center" }, + { MIEL_HVAC_UPDATE_VANE_4, "down_middle" }, + { MIEL_HVAC_UPDATE_VANE_5, "down" }, { MIEL_HVAC_UPDATE_VANE_SWING, "swing" }, }; @@ -331,6 +345,17 @@ static const struct miel_hvac_map miel_hvac_widevane_map[] = { { MIEL_HVAC_UPDATE_WIDEVANE_SWING, "swing" }, }; +static const struct miel_hvac_map miel_hvac_prohibit_map[] = { + { MIEL_HVAC_UPDATE_PROHIBIT_OFF, "off" }, + { MIEL_HVAC_UPDATE_PROHIBIT_POWER, "power" }, + { MIEL_HVAC_UPDATE_PROHIBIT_MODE, "mode" }, + { MIEL_HVAC_UPDATE_PROHIBIT_MODE_POWER, "mode_power" }, + { MIEL_HVAC_UPDATE_PROHIBIT_TEMP, "temp" }, + { MIEL_HVAC_UPDATE_PROHIBIT_TEMP_POWER, "temp_power" }, + { MIEL_HVAC_UPDATE_PROHIBIT_TEMP_MODE, "temp_mode" }, + { MIEL_HVAC_UPDATE_PROHIBIT_ALL, "all" }, +}; + static const struct miel_hvac_map miel_hvac_airdirection_map[] = { { MIEL_HVAC_UPDATE_AIRDIRECTION_EVEN, "even" }, { MIEL_HVAC_UPDATE_AIRDIRECTION_INDIRECT, "indirect" }, @@ -789,6 +814,29 @@ miel_hvac_cmnd_setvane(void) ResponseCmndChar_P(e->name); } +static void +miel_hvac_cmnd_setprohibit(void) +{ + struct miel_hvac_softc *sc = miel_hvac_sc; + struct miel_hvac_msg_update *update = &sc->sc_update; + const struct miel_hvac_map *e; + + if (XdrvMailbox.data_len == 0) + return; + + e = miel_hvac_map_byname(XdrvMailbox.data, + miel_hvac_prohibit_map, nitems(miel_hvac_prohibit_map)); + if (e == NULL) { + miel_hvac_respond_unsupported(); + return; + } + + update->flags |= htons(MIEL_HVAC_UPDATE_F_PROHIBIT); + update->prohibit = e->byte; + + ResponseCmndChar_P(e->name); +} + static void miel_hvac_cmnd_setwidevane(void) { @@ -1001,6 +1049,13 @@ miel_hvac_publish_settings(struct miel_hvac_softc *sc) name_swing_h == "isee" ? name : "OFF"); } + name = miel_hvac_map_byval(set->prohibit, + miel_hvac_prohibit_map, nitems(miel_hvac_prohibit_map)); + if (name != NULL) { + ResponseAppend_P(PSTR(",\"Prohibit\":\"%s\""), + name); + } + ResponseAppend_P(PSTR(",\"Bytes\":\"%s\""), ToHex_P((uint8_t *)&sc->sc_settings, sizeof(sc->sc_settings), hex, sizeof(hex))); @@ -1231,6 +1286,13 @@ miel_hvac_sensor(struct miel_hvac_softc *sc) name_swing_h == "isee" ? name : "OFF"); } + name = miel_hvac_map_byval(set->prohibit, + miel_hvac_prohibit_map, nitems(miel_hvac_prohibit_map)); + if (name != NULL) { + ResponseAppend_P(PSTR(",\"Prohibit\":\"%s\""), + name); + } + ResponseAppend_P(PSTR(",\"Bytes\":\"%s\""), ToHex_P((uint8_t *)&sc->sc_settings, sizeof(sc->sc_settings), hex, sizeof(hex))); @@ -1395,6 +1457,7 @@ static const char miel_hvac_cmnd_names[] PROGMEM = "|" D_CMND_MIEL_HVAC_SETSWINGV "|" D_CMND_MIEL_HVAC_SETSWINGH "|" D_CMND_MIEL_HVAC_SETAIRDIRECTION + "|" D_CMND_MIEL_HVAC_SETPROHIBIT "|" D_CMND_MIEL_HVAC_REMOTETEMP #ifdef MIEL_HVAC_DEBUG "|" "HVACRequest" @@ -1409,6 +1472,7 @@ static void (*const miel_hvac_cmnds[])(void) PROGMEM = { &miel_hvac_cmnd_setvane, &miel_hvac_cmnd_setwidevane, &miel_hvac_cmnd_setairdirection, + &miel_hvac_cmnd_setprohibit, &miel_hvac_cmnd_remotetemp, #ifdef MIEL_HVAC_DEBUG &miel_hvac_cmnd_request, From f0973c84d4915e776f715c0749a593efc6f55953 Mon Sep 17 00:00:00 2001 From: Grzegorz Date: Sun, 13 Oct 2024 15:17:40 +0200 Subject: [PATCH 2/4] Fixed Compressor and Operation for MiElHVAC Changed Widevane position name from ISEE to AUTO sam as in MELCLoud --- .../tasmota_xdrv_driver/xdrv_44_miel_hvac.ino | 74 +++++++++++++++---- 1 file changed, 60 insertions(+), 14 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_44_miel_hvac.ino b/tasmota/tasmota_xdrv_driver/xdrv_44_miel_hvac.ino index 3b7e6da5d888..88265f5e3a64 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_44_miel_hvac.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_44_miel_hvac.ino @@ -90,9 +90,16 @@ struct miel_hvac_data_roomtemp { }; struct miel_hvac_data_status { - uint8_t _pad1[2]; + uint8_t _pad1[3]; uint8_t compressor; +#define MIEL_HVAC_STATUS_COMPRESSOR_OFF 0x00 +#define MIEL_HVAC_STATUS_COMPRESSOR_ON 0x01 uint8_t operation; +#define MIEL_HVAC_STATUS_OPERATION_OFF 0x00 +#define MIEL_HVAC_STATUS_OPERATION_1 0x01 +#define MIEL_HVAC_STATUS_OPERATION_2 0x02 +#define MIEL_HVAC_STATUS_OPERATION_3 0x03 +#define MIEL_HVAC_STATUS_OPERATION_4 0x04 }; struct miel_hvac_data { @@ -130,6 +137,9 @@ CTASSERT(offsetof(struct miel_hvac_data, data.settings.airdirection) == 14); CTASSERT(offsetof(struct miel_hvac_data, data.roomtemp.temp) == 3); CTASSERT(offsetof(struct miel_hvac_data, data.roomtemp.temp05) == 6); +CTASSERT(offsetof(struct miel_hvac_data, data.status.compressor) == 4); +CTASSERT(offsetof(struct miel_hvac_data, data.status.operation) == 5); + /* to hvac */ #define MIEL_HVAC_H_TYPE_CONNECT 0x5a @@ -206,7 +216,7 @@ struct miel_hvac_msg_update { uint8_t _pad1[4]; uint8_t widevane; #define MIEL_HVAC_UPDATE_WIDEVANE_MASK 0x0f -#define MIEL_HVAC_UPDATE_WIDEVANE_ISEE 0x00 +#define MIEL_HVAC_UPDATE_WIDEVANE_AUTO 0x00 #define MIEL_HVAC_UPDATE_WIDEVANE_LL 0x01 #define MIEL_HVAC_UPDATE_WIDEVANE_L 0x02 #define MIEL_HVAC_UPDATE_WIDEVANE_C 0x03 @@ -304,6 +314,11 @@ struct miel_hvac_map { const char *name; }; +static const struct miel_hvac_map miel_hvac_power_map[] = { + { MIEL_HVAC_UPDATE_POWER_OFF, "off" }, + { MIEL_HVAC_UPDATE_POWER_ON, "on" }, +}; + static const struct miel_hvac_map miel_hvac_mode_map[] = { { MIEL_HVAC_UPDATE_MODE_HEAT, "heat" }, { MIEL_HVAC_UPDATE_MODE_DRY, "dry" }, @@ -335,7 +350,7 @@ static const struct miel_hvac_map miel_hvac_vane_map[] = { }; static const struct miel_hvac_map miel_hvac_widevane_map[] = { - { MIEL_HVAC_UPDATE_WIDEVANE_ISEE, "isee" }, + { MIEL_HVAC_UPDATE_WIDEVANE_AUTO, "auto" }, { MIEL_HVAC_UPDATE_WIDEVANE_LL, "left" }, { MIEL_HVAC_UPDATE_WIDEVANE_L, "left_middle" }, { MIEL_HVAC_UPDATE_WIDEVANE_C, "center" }, @@ -362,6 +377,19 @@ static const struct miel_hvac_map miel_hvac_airdirection_map[] = { { MIEL_HVAC_UPDATE_AIRDIRECTION_DIRECT, "direct" }, }; +static const struct miel_hvac_map miel_hvac_compressor_map[] = { + { MIEL_HVAC_STATUS_COMPRESSOR_OFF, "off" }, + { MIEL_HVAC_STATUS_COMPRESSOR_ON, "on" }, +}; + +static const struct miel_hvac_map miel_hvac_operation_map[] = { + { MIEL_HVAC_STATUS_OPERATION_OFF, "off" }, + { MIEL_HVAC_STATUS_OPERATION_1, "1" }, + { MIEL_HVAC_STATUS_OPERATION_2, "2" }, + { MIEL_HVAC_STATUS_OPERATION_3, "3" }, + { MIEL_HVAC_STATUS_OPERATION_4, "4" }, +}; + enum miel_hvac_parser_state { MIEL_HVAC_P_START, MIEL_HVAC_P_TYPE, @@ -997,8 +1025,12 @@ miel_hvac_publish_settings(struct miel_hvac_softc *sc) const char *name; const char *name_swing_h; - Response_P(PSTR("{\"" D_JSON_IRHVAC_POWER "\":\"%s\""), - set->power ? "ON" : "OFF"); + name = miel_hvac_map_byval(set->power, + miel_hvac_power_map, nitems(miel_hvac_power_map)); + if (name != NULL) { + Response_P(PSTR("{\"" D_JSON_IRHVAC_POWER "\":\"%s\""), + name); + } name = miel_hvac_map_byval( set->mode & MIEL_HVAC_SETTINGS_MODE_MASK, @@ -1046,7 +1078,7 @@ miel_hvac_publish_settings(struct miel_hvac_softc *sc) miel_hvac_airdirection_map, nitems(miel_hvac_airdirection_map)); if (name != NULL) { ResponseAppend_P(PSTR(",\"AirDirection\":\"%s\""), - name_swing_h == "isee" ? name : "OFF"); + name_swing_h == "auto" ? name : "OFF"); } name = miel_hvac_map_byval(set->prohibit, @@ -1236,8 +1268,13 @@ miel_hvac_sensor(struct miel_hvac_softc *sc) const char *name_swing_h; ResponseAppend_P(PSTR("," "\"MiElHVAC\":{")); - ResponseAppend_P(PSTR("\"Power\":\"%s\""), - set->power ? "ON" : "OFF"); + + name = miel_hvac_map_byval(set->power, + miel_hvac_power_map, nitems(miel_hvac_power_map)); + if (name != NULL) { + ResponseAppend_P(PSTR("\"Power\":\"%s\""), + name); + } name = miel_hvac_map_byval( set->mode & MIEL_HVAC_SETTINGS_MODE_MASK, @@ -1283,7 +1320,7 @@ miel_hvac_sensor(struct miel_hvac_softc *sc) miel_hvac_airdirection_map, nitems(miel_hvac_airdirection_map)); if (name != NULL) { ResponseAppend_P(PSTR(",\"AirDirection\":\"%s\""), - name_swing_h == "isee" ? name : "OFF"); + name_swing_h == "auto" ? name : "off"); } name = miel_hvac_map_byval(set->prohibit, @@ -1317,13 +1354,22 @@ miel_hvac_sensor(struct miel_hvac_softc *sc) } if (sc->sc_status.type != 0) { - const struct miel_hvac_data_status *s = + const struct miel_hvac_data_status *status = &sc->sc_status.data.status; - ResponseAppend_P(PSTR(",\"Operation\":\"%s\""), - s->operation ? "ON" : "OFF"); - ResponseAppend_P(PSTR(",\"Compressor\":\"%s\""), - s->compressor ? "ON" : "OFF"); + name = miel_hvac_map_byval(status->compressor, + miel_hvac_compressor_map, nitems(miel_hvac_compressor_map)); + if (name != NULL) { + ResponseAppend_P(PSTR(",\"Compressor\":\"%s\""), + name); + } + + name = miel_hvac_map_byval(status->operation, + miel_hvac_operation_map, nitems(miel_hvac_operation_map)); + if (name != NULL) { + ResponseAppend_P(PSTR(",\"Operation\":\"%s\""), + name); + } } if (sc->sc_temp.type != 0) { From a684e93107e7640ef7aee6c5da4df2c72622676c Mon Sep 17 00:00:00 2001 From: Grzegorz Date: Mon, 14 Oct 2024 18:04:42 +0200 Subject: [PATCH 3/4] Revert "Fixed Compressor and Operation for MiElHVAC" This reverts commit f0973c84d4915e776f715c0749a593efc6f55953. --- .../tasmota_xdrv_driver/xdrv_44_miel_hvac.ino | 74 ++++--------------- 1 file changed, 14 insertions(+), 60 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_44_miel_hvac.ino b/tasmota/tasmota_xdrv_driver/xdrv_44_miel_hvac.ino index 88265f5e3a64..3b7e6da5d888 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_44_miel_hvac.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_44_miel_hvac.ino @@ -90,16 +90,9 @@ struct miel_hvac_data_roomtemp { }; struct miel_hvac_data_status { - uint8_t _pad1[3]; + uint8_t _pad1[2]; uint8_t compressor; -#define MIEL_HVAC_STATUS_COMPRESSOR_OFF 0x00 -#define MIEL_HVAC_STATUS_COMPRESSOR_ON 0x01 uint8_t operation; -#define MIEL_HVAC_STATUS_OPERATION_OFF 0x00 -#define MIEL_HVAC_STATUS_OPERATION_1 0x01 -#define MIEL_HVAC_STATUS_OPERATION_2 0x02 -#define MIEL_HVAC_STATUS_OPERATION_3 0x03 -#define MIEL_HVAC_STATUS_OPERATION_4 0x04 }; struct miel_hvac_data { @@ -137,9 +130,6 @@ CTASSERT(offsetof(struct miel_hvac_data, data.settings.airdirection) == 14); CTASSERT(offsetof(struct miel_hvac_data, data.roomtemp.temp) == 3); CTASSERT(offsetof(struct miel_hvac_data, data.roomtemp.temp05) == 6); -CTASSERT(offsetof(struct miel_hvac_data, data.status.compressor) == 4); -CTASSERT(offsetof(struct miel_hvac_data, data.status.operation) == 5); - /* to hvac */ #define MIEL_HVAC_H_TYPE_CONNECT 0x5a @@ -216,7 +206,7 @@ struct miel_hvac_msg_update { uint8_t _pad1[4]; uint8_t widevane; #define MIEL_HVAC_UPDATE_WIDEVANE_MASK 0x0f -#define MIEL_HVAC_UPDATE_WIDEVANE_AUTO 0x00 +#define MIEL_HVAC_UPDATE_WIDEVANE_ISEE 0x00 #define MIEL_HVAC_UPDATE_WIDEVANE_LL 0x01 #define MIEL_HVAC_UPDATE_WIDEVANE_L 0x02 #define MIEL_HVAC_UPDATE_WIDEVANE_C 0x03 @@ -314,11 +304,6 @@ struct miel_hvac_map { const char *name; }; -static const struct miel_hvac_map miel_hvac_power_map[] = { - { MIEL_HVAC_UPDATE_POWER_OFF, "off" }, - { MIEL_HVAC_UPDATE_POWER_ON, "on" }, -}; - static const struct miel_hvac_map miel_hvac_mode_map[] = { { MIEL_HVAC_UPDATE_MODE_HEAT, "heat" }, { MIEL_HVAC_UPDATE_MODE_DRY, "dry" }, @@ -350,7 +335,7 @@ static const struct miel_hvac_map miel_hvac_vane_map[] = { }; static const struct miel_hvac_map miel_hvac_widevane_map[] = { - { MIEL_HVAC_UPDATE_WIDEVANE_AUTO, "auto" }, + { MIEL_HVAC_UPDATE_WIDEVANE_ISEE, "isee" }, { MIEL_HVAC_UPDATE_WIDEVANE_LL, "left" }, { MIEL_HVAC_UPDATE_WIDEVANE_L, "left_middle" }, { MIEL_HVAC_UPDATE_WIDEVANE_C, "center" }, @@ -377,19 +362,6 @@ static const struct miel_hvac_map miel_hvac_airdirection_map[] = { { MIEL_HVAC_UPDATE_AIRDIRECTION_DIRECT, "direct" }, }; -static const struct miel_hvac_map miel_hvac_compressor_map[] = { - { MIEL_HVAC_STATUS_COMPRESSOR_OFF, "off" }, - { MIEL_HVAC_STATUS_COMPRESSOR_ON, "on" }, -}; - -static const struct miel_hvac_map miel_hvac_operation_map[] = { - { MIEL_HVAC_STATUS_OPERATION_OFF, "off" }, - { MIEL_HVAC_STATUS_OPERATION_1, "1" }, - { MIEL_HVAC_STATUS_OPERATION_2, "2" }, - { MIEL_HVAC_STATUS_OPERATION_3, "3" }, - { MIEL_HVAC_STATUS_OPERATION_4, "4" }, -}; - enum miel_hvac_parser_state { MIEL_HVAC_P_START, MIEL_HVAC_P_TYPE, @@ -1025,12 +997,8 @@ miel_hvac_publish_settings(struct miel_hvac_softc *sc) const char *name; const char *name_swing_h; - name = miel_hvac_map_byval(set->power, - miel_hvac_power_map, nitems(miel_hvac_power_map)); - if (name != NULL) { - Response_P(PSTR("{\"" D_JSON_IRHVAC_POWER "\":\"%s\""), - name); - } + Response_P(PSTR("{\"" D_JSON_IRHVAC_POWER "\":\"%s\""), + set->power ? "ON" : "OFF"); name = miel_hvac_map_byval( set->mode & MIEL_HVAC_SETTINGS_MODE_MASK, @@ -1078,7 +1046,7 @@ miel_hvac_publish_settings(struct miel_hvac_softc *sc) miel_hvac_airdirection_map, nitems(miel_hvac_airdirection_map)); if (name != NULL) { ResponseAppend_P(PSTR(",\"AirDirection\":\"%s\""), - name_swing_h == "auto" ? name : "OFF"); + name_swing_h == "isee" ? name : "OFF"); } name = miel_hvac_map_byval(set->prohibit, @@ -1268,13 +1236,8 @@ miel_hvac_sensor(struct miel_hvac_softc *sc) const char *name_swing_h; ResponseAppend_P(PSTR("," "\"MiElHVAC\":{")); - - name = miel_hvac_map_byval(set->power, - miel_hvac_power_map, nitems(miel_hvac_power_map)); - if (name != NULL) { - ResponseAppend_P(PSTR("\"Power\":\"%s\""), - name); - } + ResponseAppend_P(PSTR("\"Power\":\"%s\""), + set->power ? "ON" : "OFF"); name = miel_hvac_map_byval( set->mode & MIEL_HVAC_SETTINGS_MODE_MASK, @@ -1320,7 +1283,7 @@ miel_hvac_sensor(struct miel_hvac_softc *sc) miel_hvac_airdirection_map, nitems(miel_hvac_airdirection_map)); if (name != NULL) { ResponseAppend_P(PSTR(",\"AirDirection\":\"%s\""), - name_swing_h == "auto" ? name : "off"); + name_swing_h == "isee" ? name : "OFF"); } name = miel_hvac_map_byval(set->prohibit, @@ -1354,22 +1317,13 @@ miel_hvac_sensor(struct miel_hvac_softc *sc) } if (sc->sc_status.type != 0) { - const struct miel_hvac_data_status *status = + const struct miel_hvac_data_status *s = &sc->sc_status.data.status; - name = miel_hvac_map_byval(status->compressor, - miel_hvac_compressor_map, nitems(miel_hvac_compressor_map)); - if (name != NULL) { - ResponseAppend_P(PSTR(",\"Compressor\":\"%s\""), - name); - } - - name = miel_hvac_map_byval(status->operation, - miel_hvac_operation_map, nitems(miel_hvac_operation_map)); - if (name != NULL) { - ResponseAppend_P(PSTR(",\"Operation\":\"%s\""), - name); - } + ResponseAppend_P(PSTR(",\"Operation\":\"%s\""), + s->operation ? "ON" : "OFF"); + ResponseAppend_P(PSTR(",\"Compressor\":\"%s\""), + s->compressor ? "ON" : "OFF"); } if (sc->sc_temp.type != 0) { From 4ee660471fe4f8761b8c102b63b89a0fff88e7c2 Mon Sep 17 00:00:00 2001 From: Grzegorz Date: Mon, 14 Oct 2024 18:14:47 +0200 Subject: [PATCH 4/4] New feature for MiElHVAC * Added Compressor map * Added Operation Power in Watts * Added Operation Energy in kWh * Changed Widevane position name from ISEE to AUTO, displays sam as in * Changed all map value to lover case MELCloud --- .../tasmota_xdrv_driver/xdrv_44_miel_hvac.ino | 74 +++++++++++++++---- 1 file changed, 60 insertions(+), 14 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_44_miel_hvac.ino b/tasmota/tasmota_xdrv_driver/xdrv_44_miel_hvac.ino index 3b7e6da5d888..1d9cd0cedac7 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_44_miel_hvac.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_44_miel_hvac.ino @@ -91,8 +91,14 @@ struct miel_hvac_data_roomtemp { struct miel_hvac_data_status { uint8_t _pad1[2]; + uint8_t _pad2[1]; uint8_t compressor; - uint8_t operation; +#define MIEL_HVAC_STATUS_COMPRESSOR_OFF 0x00 +#define MIEL_HVAC_STATUS_COMPRESSOR_ON 0x01 + uint8_t operationpower; + uint8_t operationpower1; + uint8_t operationenergy; + uint8_t operationenergy1; }; struct miel_hvac_data { @@ -130,6 +136,12 @@ CTASSERT(offsetof(struct miel_hvac_data, data.settings.airdirection) == 14); CTASSERT(offsetof(struct miel_hvac_data, data.roomtemp.temp) == 3); CTASSERT(offsetof(struct miel_hvac_data, data.roomtemp.temp05) == 6); +CTASSERT(offsetof(struct miel_hvac_data, data.status.compressor) == 4); +CTASSERT(offsetof(struct miel_hvac_data, data.status.operationpower) == 5); +CTASSERT(offsetof(struct miel_hvac_data, data.status.operationpower1) == 6); +CTASSERT(offsetof(struct miel_hvac_data, data.status.operationenergy) == 7); +CTASSERT(offsetof(struct miel_hvac_data, data.status.operationenergy1) == 8); + /* to hvac */ #define MIEL_HVAC_H_TYPE_CONNECT 0x5a @@ -206,7 +218,7 @@ struct miel_hvac_msg_update { uint8_t _pad1[4]; uint8_t widevane; #define MIEL_HVAC_UPDATE_WIDEVANE_MASK 0x0f -#define MIEL_HVAC_UPDATE_WIDEVANE_ISEE 0x00 +#define MIEL_HVAC_UPDATE_WIDEVANE_AUTO 0x00 #define MIEL_HVAC_UPDATE_WIDEVANE_LL 0x01 #define MIEL_HVAC_UPDATE_WIDEVANE_L 0x02 #define MIEL_HVAC_UPDATE_WIDEVANE_C 0x03 @@ -304,6 +316,11 @@ struct miel_hvac_map { const char *name; }; +static const struct miel_hvac_map miel_hvac_power_map[] = { + { MIEL_HVAC_UPDATE_POWER_OFF, "off" }, + { MIEL_HVAC_UPDATE_POWER_ON, "on" }, +}; + static const struct miel_hvac_map miel_hvac_mode_map[] = { { MIEL_HVAC_UPDATE_MODE_HEAT, "heat" }, { MIEL_HVAC_UPDATE_MODE_DRY, "dry" }, @@ -335,7 +352,7 @@ static const struct miel_hvac_map miel_hvac_vane_map[] = { }; static const struct miel_hvac_map miel_hvac_widevane_map[] = { - { MIEL_HVAC_UPDATE_WIDEVANE_ISEE, "isee" }, + { MIEL_HVAC_UPDATE_WIDEVANE_AUTO, "auto" }, { MIEL_HVAC_UPDATE_WIDEVANE_LL, "left" }, { MIEL_HVAC_UPDATE_WIDEVANE_L, "left_middle" }, { MIEL_HVAC_UPDATE_WIDEVANE_C, "center" }, @@ -362,6 +379,11 @@ static const struct miel_hvac_map miel_hvac_airdirection_map[] = { { MIEL_HVAC_UPDATE_AIRDIRECTION_DIRECT, "direct" }, }; +static const struct miel_hvac_map miel_hvac_compressor_map[] = { + { MIEL_HVAC_STATUS_COMPRESSOR_OFF, "off" }, + { MIEL_HVAC_STATUS_COMPRESSOR_ON, "on" }, +}; + enum miel_hvac_parser_state { MIEL_HVAC_P_START, MIEL_HVAC_P_TYPE, @@ -997,8 +1019,12 @@ miel_hvac_publish_settings(struct miel_hvac_softc *sc) const char *name; const char *name_swing_h; - Response_P(PSTR("{\"" D_JSON_IRHVAC_POWER "\":\"%s\""), - set->power ? "ON" : "OFF"); + name = miel_hvac_map_byval(set->power, + miel_hvac_power_map, nitems(miel_hvac_power_map)); + if (name != NULL) { + Response_P(PSTR("{\"" D_JSON_IRHVAC_POWER "\":\"%s\""), + name); + } name = miel_hvac_map_byval( set->mode & MIEL_HVAC_SETTINGS_MODE_MASK, @@ -1046,7 +1072,7 @@ miel_hvac_publish_settings(struct miel_hvac_softc *sc) miel_hvac_airdirection_map, nitems(miel_hvac_airdirection_map)); if (name != NULL) { ResponseAppend_P(PSTR(",\"AirDirection\":\"%s\""), - name_swing_h == "isee" ? name : "OFF"); + name_swing_h == "auto" ? name : "OFF"); } name = miel_hvac_map_byval(set->prohibit, @@ -1236,8 +1262,13 @@ miel_hvac_sensor(struct miel_hvac_softc *sc) const char *name_swing_h; ResponseAppend_P(PSTR("," "\"MiElHVAC\":{")); - ResponseAppend_P(PSTR("\"Power\":\"%s\""), - set->power ? "ON" : "OFF"); + + name = miel_hvac_map_byval(set->power, + miel_hvac_power_map, nitems(miel_hvac_power_map)); + if (name != NULL) { + ResponseAppend_P(PSTR("\"Power\":\"%s\""), + name); + } name = miel_hvac_map_byval( set->mode & MIEL_HVAC_SETTINGS_MODE_MASK, @@ -1283,7 +1314,7 @@ miel_hvac_sensor(struct miel_hvac_softc *sc) miel_hvac_airdirection_map, nitems(miel_hvac_airdirection_map)); if (name != NULL) { ResponseAppend_P(PSTR(",\"AirDirection\":\"%s\""), - name_swing_h == "isee" ? name : "OFF"); + name_swing_h == "auto" ? name : "off"); } name = miel_hvac_map_byval(set->prohibit, @@ -1317,13 +1348,28 @@ miel_hvac_sensor(struct miel_hvac_softc *sc) } if (sc->sc_status.type != 0) { - const struct miel_hvac_data_status *s = + const struct miel_hvac_data_status *status = &sc->sc_status.data.status; - ResponseAppend_P(PSTR(",\"Operation\":\"%s\""), - s->operation ? "ON" : "OFF"); - ResponseAppend_P(PSTR(",\"Compressor\":\"%s\""), - s->compressor ? "ON" : "OFF"); + name = miel_hvac_map_byval(status->compressor, + miel_hvac_compressor_map, nitems(miel_hvac_compressor_map)); + if (name != NULL) { + ResponseAppend_P(PSTR(",\"Compressor\":\"%s\""), + name); + } + + uint16_t combined_power = ((uint16_t)status->operationpower << 8) | (uint16_t)status->operationpower1; + char operationpower[33]; + dtostrfd((float)combined_power, 0, operationpower); + ResponseAppend_P(PSTR(",\"OperationPower\":\"%s\""), + operationpower); + + uint16_t combined_energy = ((uint16_t)status->operationenergy << 8) | (uint16_t)status->operationenergy1; + float operationenergy_in_kWh = (float)combined_energy / 10.0; + char operationenergy[33]; + dtostrfd((float)operationenergy_in_kWh, 1, operationenergy); + ResponseAppend_P(PSTR(",\"OperationEnergy\":\"%s\""), + operationenergy); } if (sc->sc_temp.type != 0) {