Skip to content

Commit

Permalink
Merge pull request #32 from slacky1965/development
Browse files Browse the repository at this point in the history
Development
  • Loading branch information
slacky1965 authored Dec 22, 2024
2 parents b15224e + 8ec9538 commit aadaa69
Show file tree
Hide file tree
Showing 27 changed files with 979 additions and 269 deletions.
14 changes: 11 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"_TZE204_u9bfwha0"
"_TZE204_aoclfnxz"
"_TZE204_edl8pz1k"
"_TZE204_tagezcph"

<img src="https://raw.githubusercontent.com/slacky1965/tuya_thermostat_zrd/refs/heads/main/doc/images/TYBAC-006.png"/>

Expand Down Expand Up @@ -41,12 +42,12 @@
Создаем файл в директории z2m, например с именем `local_ota_index.json`. Добавляем в него вот такую запись

```
[
[
{
"url": "images/1141-d3a3-1111114b-tuya_thermostat_zrd.zigbee",
"force": true
}
]
]
```
Далее добавляем это все в конфиг z2m (configuration.yaml). Должно получиться что-то в этом роде.

Expand Down Expand Up @@ -124,6 +125,8 @@ P.S. В реальной работе не проверялось, требуе

- [@immortal_serg](https://t.me/immortal_serg) за предоставленный термостат _TZE204_edl8pz1k.

- [@chernyshevruslan](https://t.me/chernyshevruslan) за предоставленные термостаты _TZE204_tagezcph в двух разных исполнениях.

- [https://github.com/doctor64](https://github.com/doctor64) [@doctor_64](https://t.me/doctor_64) - за желание всегда помочь и направить в правильное русло.

- [https://github.com/devbis](https://github.com/devbis) [@Belokobylskiy](https://t.me/Belokobylskiy) - за идеи и написание скриптов на Питоне.
Expand Down Expand Up @@ -153,6 +156,11 @@ P.S. В реальной работе не проверялось, требуе
- Изменены коверторы z2m, теперь это всего два файла.
> Один для термостата с оригинальной прошивкой, второй для уже термостата с кастомной прошивкой. Что-то менять в них не нужно.

- 1.0.05
- Добавлен термостат с сигнатурой `_TZE204_tagezcph`
> Проверяли два термостата, один с поворотной ручкой внизу поередине, второй внизу справа.
- Отредактированы внутренние имена переменных, связанных с номером модели.
> Раньше счет шел от 0. Сейчас от 1. Сделано просто для удобства, чтобы самому не запустаться. Например, раньше было type0, теперь это type1 и т.д.
- Обновлены конверторы.

Binary file modified bin/1141-d3a3-1111114b-tuya_thermostat_zrd.zigbee
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
2 changes: 1 addition & 1 deletion project.mk
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ OBJS += \
$(OUT_PATH)/$(SRC_PATH)/common/main.o \
$(OUT_PATH)/$(SRC_PATH)/zcl/zcl_thermostat_ui_cfg.o \
$(OUT_PATH)/$(SRC_PATH)/zcl/zcl_app_thermostat.o \
$(OUT_PATH)/$(SRC_PATH)/app_level.o \
$(OUT_PATH)/$(SRC_PATH)/app_tuya_datapoint.o \
$(OUT_PATH)/$(SRC_PATH)/app_uart_tuya.o \
$(OUT_PATH)/$(SRC_PATH)/app_uart.o \
$(OUT_PATH)/$(SRC_PATH)/app_thermostat.o \
$(OUT_PATH)/$(SRC_PATH)/app_thermostat_model1.o \
$(OUT_PATH)/$(SRC_PATH)/app_thermostat_model2.o \
$(OUT_PATH)/$(SRC_PATH)/app_thermostat_model3.o \
$(OUT_PATH)/$(SRC_PATH)/app_reporting.o \
$(OUT_PATH)/$(SRC_PATH)/app_endpoint_cfg.o \
$(OUT_PATH)/$(SRC_PATH)/app_utility.o \
Expand Down
71 changes: 61 additions & 10 deletions src/app_endpoint_cfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,18 @@ const uint16_t app_ep1_outClusterList[] = {
#define APP_EP1_IN_CLUSTER_NUM (sizeof(app_ep1_inClusterList)/sizeof(app_ep1_inClusterList[0]))
#define APP_EP1_OUT_CLUSTER_NUM (sizeof(app_ep1_outClusterList)/sizeof(app_ep1_outClusterList[0]))

const uint16_t app_ep2_inClusterList[] = {
#ifdef ZCL_LEVEL_CTRL
ZCL_CLUSTER_GEN_LEVEL_CONTROL,
#endif
};

const uint16_t app_ep2_outClusterList[] = {
};

#define APP_EP2_IN_CLUSTER_NUM (sizeof(app_ep2_inClusterList)/sizeof(app_ep2_inClusterList[0]))
#define APP_EP2_OUT_CLUSTER_NUM (sizeof(app_ep2_outClusterList)/sizeof(app_ep2_outClusterList[0]))

/**
* @brief Definition for simple description for HA profile
*/
Expand All @@ -89,6 +101,18 @@ const af_simple_descriptor_t app_ep1Desc = {
};


const af_simple_descriptor_t app_ep2Desc = {
HA_PROFILE_ID, /* Application profile identifier */
HA_DEV_THERMOSTAT, /* Application device identifier */
APP_ENDPOINT2, /* Endpoint */
2, /* Application device version */
0, /* Reserved */
APP_EP2_IN_CLUSTER_NUM, /* Application input cluster count */
APP_EP2_OUT_CLUSTER_NUM, /* Application output cluster count */
(uint16_t *)app_ep2_inClusterList, /* Application input cluster list */
(uint16_t *)app_ep2_outClusterList, /* Application output cluster list */
};


/* Basic */
zcl_basicAttr_t g_zcl_basicAttrs =
Expand Down Expand Up @@ -185,21 +209,36 @@ const zclAttrInfo_t scene_attr1Tbl[] = {
#ifdef ZCL_LEVEL_CTRL
/* Level */
zcl_levelAttr_t g_zcl_levelAttrs = {
.currentLevel = 9,
.minLevel = 1,
.maxLevel = 9,
.currentLevelA = 6,
.currentLevelB = 6,
.minLevelA = 0,
.maxLevelA = 8,
.minLevelB = 0,
.maxLevelB = 8,
};

const zclAttrInfo_t level_attrTbl[] =
const zclAttrInfo_t levelA_attrTbl[] =
{
{ ZCL_ATTRID_LEVEL_CURRENT_LEVEL, ZCL_UINT8, RR, (uint8_t*)&g_zcl_levelAttrs.currentLevelA },
{ ZCL_ATTRID_LEVEL_MIN_LEVEL, ZCL_UINT8, R, (uint8_t*)&g_zcl_levelAttrs.minLevelA },
{ ZCL_ATTRID_LEVEL_MAX_LEVEL, ZCL_UINT8, R, (uint8_t*)&g_zcl_levelAttrs.maxLevelA },

{ ZCL_ATTRID_GLOBAL_CLUSTER_REVISION, ZCL_UINT16, R, (u8*)&zcl_attr_global_clusterRevision},
};

#define ZCL_LEVEL_A_ATTR_NUM sizeof(levelA_attrTbl) / sizeof(zclAttrInfo_t)

const zclAttrInfo_t levelB_attrTbl[] =
{
{ ZCL_ATTRID_LEVEL_CURRENT_LEVEL, ZCL_UINT8, RR, (uint8_t*)&g_zcl_levelAttrs.currentLevel },
{ ZCL_ATTRID_LEVEL_MIN_LEVEL, ZCL_UINT8, R, (uint8_t*)&g_zcl_levelAttrs.minLevel },
{ ZCL_ATTRID_LEVEL_MAX_LEVEL, ZCL_UINT8, R, (uint8_t*)&g_zcl_levelAttrs.maxLevel },
{ ZCL_ATTRID_LEVEL_CURRENT_LEVEL, ZCL_UINT8, RR, (uint8_t*)&g_zcl_levelAttrs.currentLevelB },
{ ZCL_ATTRID_LEVEL_MIN_LEVEL, ZCL_UINT8, R, (uint8_t*)&g_zcl_levelAttrs.minLevelB },
{ ZCL_ATTRID_LEVEL_MAX_LEVEL, ZCL_UINT8, R, (uint8_t*)&g_zcl_levelAttrs.maxLevelB },

{ ZCL_ATTRID_GLOBAL_CLUSTER_REVISION, ZCL_UINT16, R, (u8*)&zcl_attr_global_clusterRevision},
};

#define ZCL_LEVEL_ATTR_NUM sizeof(level_attrTbl) / sizeof(zclAttrInfo_t)
#define ZCL_LEVEL_B_ATTR_NUM sizeof(levelB_attrTbl) / sizeof(zclAttrInfo_t)

#endif

zcl_timeAttr_t g_zcl_timeAttrs = {
Expand Down Expand Up @@ -242,6 +281,8 @@ zcl_thermostatAttr_t g_zcl_thermostatAttrs = {
.startOfWeek = DAY_MON, // 1 - Monday
.weeklyTransNum = 3, // 1 - Mon-Fri, 2 - Sat, 3 - Sun
.dailyTransNum = 4,
.ecoMode = 0, // 0 - off, 1 - on
.ecoModeTemperature = 2000, // 20°C * 100
};


Expand All @@ -256,7 +297,7 @@ const zclAttrInfo_t thermostat_attrTbl[] = {
{ ZCL_ATTRID_HVAC_THERMOSTAT_OCCUPIED_HEATING_SETPOINT, ZCL_INT16, RRW, (uint8_t*)&g_zcl_thermostatAttrs.occupiedHeatingSetpoint },
{ ZCL_ATTRID_HVAC_THERMOSTAT_CTRL_SEQUENCE_OF_OPERATION, ZCL_ENUM8, R, (uint8_t*)&g_zcl_thermostatAttrs.controlSequenceOfOperation },
{ ZCL_ATTRID_HVAC_THERMOSTAT_SYS_MODE, ZCL_ENUM8, RRW, (uint8_t*)&g_zcl_thermostatAttrs.systemMode },
{ZCL_ATTRID_HVAC_THERMOSTAT_PROGRAMMING_OPERATION_MODE, ZCL_BITMAP8, RRW, (uint8_t*)&g_zcl_thermostatAttrs.manual_progMode },
{ ZCL_ATTRID_HVAC_THERMOSTAT_PROGRAMMING_OPERATION_MODE, ZCL_BITMAP8, RRW, (uint8_t*)&g_zcl_thermostatAttrs.manual_progMode },
{ ZCL_ATTRID_HVAC_THERMOSTAT_RUNNING_STATE, ZCL_BITMAP16, RR, (uint8_t*)&g_zcl_thermostatAttrs.runningState },
{ ZCL_ATTRID_HVAC_THERMOSTAT_MIN_SETPOINT_DEAD_BAND, ZCL_INT8, RRW, (uint8_t*)&g_zcl_thermostatAttrs.dead_band },
{ ZCL_ATTRID_HVAC_THERMOSTAT_START_OF_WEEK, ZCL_ENUM8, R, (uint8_t*)&g_zcl_thermostatAttrs.startOfWeek },
Expand All @@ -265,6 +306,8 @@ const zclAttrInfo_t thermostat_attrTbl[] = {
{ ZCL_ATTRID_HVAC_THERMOSTAT_CUSTOM_SENSOR_USED, ZCL_ENUM8, RRW, (uint8_t*)&g_zcl_thermostatAttrs.sensor_used },
{ ZCL_ATTRID_HVAC_THERMOSTAT_CUSTOM_FROST_PROTECT, ZCL_INT16, RRW, (uint8_t*)&g_zcl_thermostatAttrs.frostProtect },
{ ZCL_ATTRID_HVAC_THERMOSTAT_CUSTOM_HEAT_PROTECT, ZCL_INT16, RRW, (uint8_t*)&g_zcl_thermostatAttrs.heatProtect },
{ ZCL_ATTRID_HVAC_THERMOSTAT_CUSTOM_ECO_MODE, ZCL_ENUM8, RRW, (uint8_t*)&g_zcl_thermostatAttrs.ecoMode },
{ ZCL_ATTRID_HVAC_THERMOSTAT_CUSTOM_ECO_MODE_TEMPERATURE, ZCL_INT16, RRW, (uint8_t*)&g_zcl_thermostatAttrs.ecoModeTemperature },

{ ZCL_ATTRID_GLOBAL_CLUSTER_REVISION, ZCL_UINT16, R, (uint8_t*)&zcl_attr_global_clusterRevision },
};
Expand Down Expand Up @@ -295,7 +338,7 @@ const zcl_specClusterInfo_t g_appEp1ClusterList[] = {
{ZCL_CLUSTER_GEN_SCENES, MANUFACTURER_CODE_NONE, ZCL_SCENE_1ATTR_NUM, scene_attr1Tbl, zcl_scene_register, app_sceneCb},
#endif
#ifdef ZCL_LEVEL_CTRL
{ZCL_CLUSTER_GEN_LEVEL_CONTROL, MANUFACTURER_CODE_NONE, ZCL_LEVEL_ATTR_NUM, level_attrTbl, zcl_level_register, app_displayLevelCb},
{ZCL_CLUSTER_GEN_LEVEL_CONTROL, MANUFACTURER_CODE_NONE, ZCL_LEVEL_A_ATTR_NUM, levelA_attrTbl, zcl_level_register, app_displayLevelCb},
#endif
{ZCL_CLUSTER_GEN_TIME, MANUFACTURER_CODE_NONE, ZCL_TIME_ATTR_NUM, time_attrTbl, zcl_time_register, app_timeCb},
#ifdef ZCL_THERMOSTAT
Expand All @@ -306,3 +349,11 @@ const zcl_specClusterInfo_t g_appEp1ClusterList[] = {

uint8_t APP_EP1_CB_CLUSTER_NUM = (sizeof(g_appEp1ClusterList)/sizeof(g_appEp1ClusterList[0]));

const zcl_specClusterInfo_t g_appEp2ClusterList[] = {
#ifdef ZCL_LEVEL_CTRL
{ZCL_CLUSTER_GEN_LEVEL_CONTROL, MANUFACTURER_CODE_NONE, ZCL_LEVEL_B_ATTR_NUM, levelB_attrTbl, zcl_level_register, app_displayLevelCb},
#endif
};

uint8_t APP_EP2_CB_CLUSTER_NUM = (sizeof(g_appEp2ClusterList)/sizeof(g_appEp2ClusterList[0]));

60 changes: 0 additions & 60 deletions src/app_level.c

This file was deleted.

12 changes: 10 additions & 2 deletions src/app_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -111,12 +111,14 @@ void user_app_init(void)

/* register endPoint */
af_endpointRegister(APP_ENDPOINT1, (af_simple_descriptor_t *)&app_ep1Desc, zcl_rx_handler, NULL);
af_endpointRegister(APP_ENDPOINT2, (af_simple_descriptor_t *)&app_ep2Desc, zcl_rx_handler, NULL);

zcl_reportingTabInit();
thermostat_settings_restore();

/* Register ZCL specific cluster information */
zcl_register(APP_ENDPOINT1, APP_EP1_CB_CLUSTER_NUM, (zcl_specClusterInfo_t *)g_appEp1ClusterList);
zcl_register(APP_ENDPOINT2, APP_EP2_CB_CLUSTER_NUM, (zcl_specClusterInfo_t *)g_appEp2ClusterList);

#if ZCL_GP_SUPPORT
/* Initialize GP */
Expand Down Expand Up @@ -231,8 +233,14 @@ void user_init(bool isRetention) {
// ZCL_ATTRID_HVAC_TEMPERATURE_DISPLAY_MODE, 0, 3600, (uint8_t *)&reportableChange);
bdb_defaultReportingCfg(APP_ENDPOINT1, HA_PROFILE_ID, ZCL_CLUSTER_HAVC_USER_INTERFACE_CONFIG,
ZCL_ATTRID_HVAC_KEYPAD_LOCKOUT, 0, 3600, (uint8_t *)&reportableChange);
// bdb_defaultReportingCfg(APP_ENDPOINT1, HA_PROFILE_ID, ZCL_CLUSTER_GEN_LEVEL_CONTROL,
// ZCL_ATTRID_LEVEL_CURRENT_LEVEL, 0, 3600, (uint8_t *)&reportableChange);
bdb_defaultReportingCfg(APP_ENDPOINT1, HA_PROFILE_ID, ZCL_CLUSTER_GEN_LEVEL_CONTROL,
ZCL_ATTRID_LEVEL_CURRENT_LEVEL, 0, 3600, (uint8_t *)&reportableChange);
bdb_defaultReportingCfg(APP_ENDPOINT2, HA_PROFILE_ID, ZCL_CLUSTER_GEN_LEVEL_CONTROL,
ZCL_ATTRID_LEVEL_CURRENT_LEVEL, 0, 3600, (uint8_t *)&reportableChange);
bdb_defaultReportingCfg(APP_ENDPOINT1, HA_PROFILE_ID, ZCL_CLUSTER_HAVC_THERMOSTAT,
ZCL_ATTRID_HVAC_THERMOSTAT_CUSTOM_ECO_MODE, 0, 3600, (uint8_t *)&reportableChange);
bdb_defaultReportingCfg(APP_ENDPOINT1, HA_PROFILE_ID, ZCL_CLUSTER_HAVC_THERMOSTAT,
ZCL_ATTRID_HVAC_THERMOSTAT_CUSTOM_ECO_MODE_TEMPERATURE, 0, 3600, (uint8_t *)&reportableChange);

/* custom reporting application (non SDK) */
app_reporting_init();
Expand Down
10 changes: 4 additions & 6 deletions src/app_thermostat.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@ void remote_cmd_sys_mode(void *args) {

uint8_t *mode = (uint8_t*)args;

if(data_point_model[DP_IDX_ONOFF].id == 0) return;

if (*mode != SYS_MODE_OFF && *mode != SYS_MODE_HEAT) {
return;
}
Expand Down Expand Up @@ -614,7 +612,7 @@ void local_cmd_onoff_state(void *args) {
uint8_t sys_mode;

if (*onoff == DEV_POWER_OFF) {
#if UART_PRINTF_MODE && DEBUG_CMD
#if UART_PRINTF_MODE /* && DEBUG_CMD*/
printf("Power OFF\r\n");
#endif
sys_mode = SYS_MODE_OFF;
Expand All @@ -626,7 +624,7 @@ void local_cmd_onoff_state(void *args) {
run_state_bit.set = OFF;
local_cmd_set_run_state(&run_state_bit);
} else {
#if UART_PRINTF_MODE && DEBUG_CMD
#if UART_PRINTF_MODE /*&& DEBUG_CMD*/
printf("Power ON\r\n");
#endif
sys_mode = SYS_MODE_HEAT;
Expand Down Expand Up @@ -655,8 +653,8 @@ void local_cmd_onoff_state(void *args) {

/*****************************************************************************************************/

#if UART_PRINTF_MODE && DEBUG_SAVE
static void print_setting_sr(thermostat_settings_t *thermostat_settings, bool save) {
#if UART_PRINTF_MODE && DEBUG_SAVE

printf("Settings %s\r\n", save?"saved":"restored");

Expand All @@ -670,8 +668,8 @@ static void print_setting_sr(thermostat_settings_t *thermostat_settings, bool sa
printf("frostProtect: %d\r\n", thermostat_settings->frostProtect);
printf("heatProtect: %d\r\n", thermostat_settings->heatProtect);
printf("keypadLockout: %d\r\n", thermostat_settings->keypadLockout);
}
#endif
}


nv_sts_t thermostat_settings_save() {
Expand Down
Loading

0 comments on commit aadaa69

Please sign in to comment.