TuyaMCU Hass Discovery/custom channel types should cover now Toggles, Voltage/Current/Power, and humidity/temperature

This commit is contained in:
openshwprojects
2023-05-01 20:07:30 +02:00
parent dfc12fa76d
commit 83871bf889
6 changed files with 219 additions and 14 deletions

View File

@ -65,9 +65,16 @@ void hass_populate_unique_id(ENTITY_TYPE type, int index, char* uniq_id) {
case BATTERY_SENSOR:
sprintf(uniq_id, "%s_%s_%d", longDeviceName, "battery", index);
break;
case VOLTAGE_SENSOR:
case BATTERY_VOLTAGE_SENSOR:
sprintf(uniq_id, "%s_%s_%d", longDeviceName, "voltage", index);
break;
case CURRENT_SENSOR:
sprintf(uniq_id, "%s_%s_%d", longDeviceName, "current", index);
break;
default:
sprintf(uniq_id, "%s_%s_%d", longDeviceName, "sensor", index);
break;
}
}
@ -95,11 +102,12 @@ void hass_populate_device_config_channel(ENTITY_TYPE type, char* uniq_id, HassDe
case LIGHT_RGBCW:
sprintf(info->channel, "light/%s/config", uniq_id);
break;
case RELAY:
sprintf(info->channel, "switch/%s/config", uniq_id);
break;
case BINARY_SENSOR:
sprintf(info->channel, "binary_sensor/%s/config", uniq_id);
break;
case CO2_SENSOR:
case TVOC_SENSOR:
case POWER_SENSOR:
@ -109,9 +117,9 @@ void hass_populate_device_config_channel(ENTITY_TYPE type, char* uniq_id, HassDe
case HUMIDITY_SENSOR:
sprintf(info->channel, "sensor/%s/config", uniq_id);
break;
case BINARY_SENSOR:
sprintf(info->channel, "binary_sensor/%s/config", uniq_id);
default:
sprintf(info->channel, "sensor/%s/config", uniq_id);
break;
}
}
@ -323,8 +331,17 @@ HassDeviceInfo* hass_init_light_device_info(ENTITY_TYPE type) {
/// @brief Initializes HomeAssistant binary sensor device discovery storage.
/// @param index
/// @return
HassDeviceInfo* hass_init_binary_sensor_device_info(int index) {
HassDeviceInfo* info = hass_init_device_info(BINARY_SENSOR, index, "1", "0");
HassDeviceInfo* hass_init_binary_sensor_device_info(int index, bool bInverse) {
const char *payload_on;
const char *payload_off;
if (bInverse) {
payload_on = "1";
payload_off = "0";
} else {
payload_off = "1";
payload_on = "0";
}
HassDeviceInfo* info = hass_init_device_info(BINARY_SENSOR, index, payload_on, payload_off);
sprintf(g_hassBuffer, "~/%i/get", index);
cJSON_AddStringToObject(info->root, "stat_t", g_hassBuffer); //state_topic

View File

@ -84,7 +84,7 @@ void hass_print_unique_id(http_request_t* request, const char* fmt, ENTITY_TYPE
HassDeviceInfo* hass_init_relay_device_info(int index, ENTITY_TYPE type);
HassDeviceInfo* hass_init_light_device_info(ENTITY_TYPE type);
HassDeviceInfo* hass_init_power_sensor_device_info(int index);
HassDeviceInfo* hass_init_binary_sensor_device_info(int index);
HassDeviceInfo* hass_init_binary_sensor_device_info(int index, bool bInverse);
HassDeviceInfo* hass_init_sensor_device_info(ENTITY_TYPE type, int channel, int decPlaces, int decOffset);
const char* hass_build_discovery_json(HassDeviceInfo* info);
void hass_free_device_info(HassDeviceInfo* info);

View File

@ -1601,9 +1601,9 @@ void doHomeAssistantDiscovery(const char* topic, http_request_t* request) {
hooks.free_fn = os_free;
cJSON_InitHooks(&hooks);
if (relayCount > 0) {
//if (relayCount > 0) {
for (i = 0; i < CHANNEL_MAX; i++) {
if (h_isChannelRelay(i)) {
if (h_isChannelRelay(i) || g_cfg.pins.channelTypes[i] == ChType_Toggle) {
// TODO: flags are 32 bit and there are 64 max channels
BIT_SET(flagsChannelPublished, i);
if (CFG_HasFlag(OBK_FLAG_MQTT_HASS_ADD_RELAYS_AS_LIGHTS)) {
@ -1618,14 +1618,14 @@ void doHomeAssistantDiscovery(const char* topic, http_request_t* request) {
discoveryQueued = true;
}
}
}
//}
if (dInputCount > 0) {
for (i = 0; i < CHANNEL_MAX; i++) {
if (h_isChannelDigitalInput(i)) {
// TODO: flags are 32 bit and there are 64 max channels
BIT_SET(flagsChannelPublished, i);
dev_info = hass_init_binary_sensor_device_info(i);
dev_info = hass_init_binary_sensor_device_info(i, false);
MQTT_QueuePublish(topic, dev_info->channel, hass_build_discovery_json(dev_info), OBK_PUBLISH_FLAG_RETAIN);
hass_free_device_info(dev_info);
dev_info = NULL;
@ -1739,7 +1739,16 @@ void doHomeAssistantDiscovery(const char* topic, http_request_t* request) {
{
case ChType_OpenClosed:
{
dev_info = hass_init_binary_sensor_device_info(i);
dev_info = hass_init_binary_sensor_device_info(i, false);
MQTT_QueuePublish(topic, dev_info->channel, hass_build_discovery_json(dev_info), OBK_PUBLISH_FLAG_RETAIN);
hass_free_device_info(dev_info);
discoveryQueued = true;
}
break;
case ChType_OpenClosed_Inv:
{
dev_info = hass_init_binary_sensor_device_info(i, true);
MQTT_QueuePublish(topic, dev_info->channel, hass_build_discovery_json(dev_info), OBK_PUBLISH_FLAG_RETAIN);
hass_free_device_info(dev_info);
@ -1800,6 +1809,15 @@ void doHomeAssistantDiscovery(const char* topic, http_request_t* request) {
discoveryQueued = true;
}
break;
case ChType_Current_div1000:
{
dev_info = hass_init_sensor_device_info(CURRENT_SENSOR, i, 3, 3);
MQTT_QueuePublish(topic, dev_info->channel, hass_build_discovery_json(dev_info), OBK_PUBLISH_FLAG_RETAIN);
hass_free_device_info(dev_info);
discoveryQueued = true;
}
break;
case ChType_Power:
{
dev_info = hass_init_sensor_device_info(POWER_SENSOR, i, -1, -1);