diff --git a/src/httpserver/hass.c b/src/httpserver/hass.c index 34b96d1bd..0eb765b16 100644 --- a/src/httpserver/hass.c +++ b/src/httpserver/hass.c @@ -428,12 +428,14 @@ HassDeviceInfo* hass_init_light_singleColor_onChannels(int toggle, int dimmer, i clientId = CFG_GetMQTTClientId(); dev_info = hass_init_device_info(LIGHT_PWM, toggle, "1", "0"); - cJSON_AddStringToObject(dev_info->root, "stat_t", "~/led_enableAll/get"); //state_topic - sprintf(g_hassBuffer, "cmnd/%s/led_enableAll", clientId); + sprintf(g_hassBuffer, "~/%i/get", toggle); + cJSON_AddStringToObject(dev_info->root, "stat_t", g_hassBuffer); //state_topic + sprintf(g_hassBuffer, "~/%i/set", toggle); cJSON_AddStringToObject(dev_info->root, "cmd_t", g_hassBuffer); //command_topic - cJSON_AddStringToObject(dev_info->root, "bri_stat_t", "~/led_dimmer/get"); //brightness_state_topic - sprintf(g_hassBuffer, "cmnd/%s/led_dimmer", clientId); + sprintf(g_hassBuffer, "~/%i/get", dimmer); + cJSON_AddStringToObject(dev_info->root, "bri_stat_t", g_hassBuffer); //brightness_state_topic + sprintf(g_hassBuffer, "~/%i/set", dimmer); cJSON_AddStringToObject(dev_info->root, "bri_cmd_t", g_hassBuffer); //brightness_command_topic cJSON_AddNumberToObject(dev_info->root, "bri_scl", brightness_scale); //brightness_scale diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c index 252437580..40bed845d 100644 --- a/src/httpserver/http_fns.c +++ b/src/httpserver/http_fns.c @@ -1602,6 +1602,55 @@ void doHomeAssistantDiscovery(const char* topic, http_request_t* request) { hooks.free_fn = os_free; cJSON_InitHooks(&hooks); + + // try to pair toggles with dimmers + while (true) { + // find first dimmer + dimmer = -1; + for (i = 0; i < CHANNEL_MAX; i++) { + type = g_cfg.pins.channelTypes[i]; + if (BIT_CHECK(flagsChannelPublished, i)) { + continue; + } + if (type == ChType_Dimmer) { + brightness_scale = 100; + dimmer = i; + break; + } + if (type == ChType_Dimmer1000) { + brightness_scale = 1000; + dimmer = i; + break; + } + if (type == ChType_Dimmer256) { + brightness_scale = 256; + dimmer = i; + break; + } + } + // find first togle + toggle = -1; + for (i = 0; i < CHANNEL_MAX; i++) { + type = g_cfg.pins.channelTypes[i]; + if (BIT_CHECK(flagsChannelPublished, i)) { + continue; + } + if (type == ChType_Toggle) { + toggle = i; + break; + } + } + // if nothing found, stop + if (toggle == -1 || dimmer == -1) { + break; + } + + BIT_SET(flagsChannelPublished, toggle); + BIT_SET(flagsChannelPublished, dimmer); + dev_info = hass_init_light_singleColor_onChannels(toggle, dimmer, brightness_scale); + MQTT_QueuePublish(topic, dev_info->channel, hass_build_discovery_json(dev_info), OBK_PUBLISH_FLAG_RETAIN); + hass_free_device_info(dev_info); + } //if (relayCount > 0) { for (i = 0; i < CHANNEL_MAX; i++) { if (h_isChannelRelay(i) || g_cfg.pins.channelTypes[i] == ChType_Toggle) { @@ -1729,52 +1778,6 @@ void doHomeAssistantDiscovery(const char* topic, http_request_t* request) { discoveryQueued = true; } } - // try to pair toggles with dimmers - while (true) { - // find first dimmer - dimmer = -1; - for (i = 0; i < CHANNEL_MAX; i++) { - type = g_cfg.pins.channelTypes[i]; - if (BIT_CHECK(flagsChannelPublished, i)) { - continue; - } - if (type == ChType_Dimmer) { - brightness_scale = 100; - dimmer = i; - break; - } - if (type == ChType_Dimmer1000) { - brightness_scale = 1000; - dimmer = i; - break; - } - if (type == ChType_Dimmer256) { - brightness_scale = 256; - dimmer = i; - break; - } - } - // find first togle - toggle = -1; - for (i = 0; i < CHANNEL_MAX; i++) { - type = g_cfg.pins.channelTypes[i]; - if (BIT_CHECK(flagsChannelPublished, i)) { - continue; - } - if (type == ChType_Toggle) { - toggle = i; - break; - } - } - // if nothing found, stop - if (toggle == -1 || dimmer == -1) { - break; - } - - dev_info = hass_init_light_singleColor_onChannels(toggle, dimmer, brightness_scale); - MQTT_QueuePublish(topic, dev_info->channel, hass_build_discovery_json(dev_info), OBK_PUBLISH_FLAG_RETAIN); - hass_free_device_info(dev_info); - } for (i = 0; i < CHANNEL_MAX; i++) { type = g_cfg.pins.channelTypes[i]; diff --git a/src/selftest/selftest_hass_discovery_ext.c b/src/selftest/selftest_hass_discovery_ext.c index 4ef4d7a15..4f949402b 100644 --- a/src/selftest/selftest_hass_discovery_ext.c +++ b/src/selftest/selftest_hass_discovery_ext.c @@ -270,8 +270,17 @@ void Test_HassDiscovery_Channel_DimmerLightDetection() { SELFTEST_ASSERT_JSON_VALUE_STRING("dev", "mdl", PLATFORM_MCU_NAME); SELFTEST_ASSERT_JSON_VALUE_STRING(0, "~", mqttName); //SELFTEST_ASSERT_JSON_VALUE_STRING(0, "unit_of_meas", "C"); + // state topic (toggle) SELFTEST_ASSERT_JSON_VALUE_STRING(0, "stat_t", "~/4/get"); SELFTEST_ASSERT_JSON_VALUE_STRING(0, "cmd_t", "~/4/set"); + // brightness topic (dimmer) +#if 0 + // cause error + SELFTEST_ASSERT_JSON_VALUE_STRING(0, "bri_stat_t", "~/4/get"); +#else + SELFTEST_ASSERT_JSON_VALUE_STRING(0, "bri_stat_t", "~/5/get"); +#endif + SELFTEST_ASSERT_JSON_VALUE_STRING(0, "bri_cmd_t", "~/5/set"); SELFTEST_ASSERT_JSON_VALUE_STRING(0, "pl_on", "1"); SELFTEST_ASSERT_JSON_VALUE_STRING(0, "pl_off", "0"); }