custom channels HASS discovery, not enabled, p1

This commit is contained in:
openshwprojects
2023-05-01 15:49:49 +02:00
parent 22aa45fd66
commit fa592bc5a0
4 changed files with 220 additions and 15 deletions

View File

@@ -1577,6 +1577,12 @@ void doHomeAssistantDiscovery(const char* topic, http_request_t* request) {
struct cJSON_Hooks hooks;
bool discoveryQueued = false;
int type;
// warning - this is 32 bit
int flagsChannelPublished;
int ch;
// no channels published yet
flagsChannelPublished = 0;
if (topic == 0 || *topic == 0) {
topic = "homeassistant";
@@ -1598,6 +1604,8 @@ void doHomeAssistantDiscovery(const char* topic, http_request_t* request) {
if (relayCount > 0) {
for (i = 0; i < CHANNEL_MAX; i++) {
if (h_isChannelRelay(i)) {
// 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)) {
dev_info = hass_init_relay_device_info(i, LIGHT_ON_OFF);
}
@@ -1615,6 +1623,8 @@ void doHomeAssistantDiscovery(const char* topic, http_request_t* request) {
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);
MQTT_QueuePublish(topic, dev_info->channel, hass_build_discovery_json(dev_info), OBK_PUBLISH_FLAG_RETAIN);
hass_free_device_info(dev_info);
@@ -1671,11 +1681,11 @@ void doHomeAssistantDiscovery(const char* topic, http_request_t* request) {
#endif
if (measuringBattery == true) {
dev_info = hass_init_sensor_device_info(BATTERY_SENSOR, 0);
dev_info = hass_init_sensor_device_info(BATTERY_SENSOR, 0, -1, -1);
MQTT_QueuePublish(topic, dev_info->channel, hass_build_discovery_json(dev_info), OBK_PUBLISH_FLAG_RETAIN);
hass_free_device_info(dev_info);
dev_info = hass_init_sensor_device_info(BATTERY_VOLTAGE_SENSOR, 0);
dev_info = hass_init_sensor_device_info(BATTERY_VOLTAGE_SENSOR, 0, -1, -1);
MQTT_QueuePublish(topic, dev_info->channel, hass_build_discovery_json(dev_info), OBK_PUBLISH_FLAG_RETAIN);
hass_free_device_info(dev_info);
@@ -1684,22 +1694,34 @@ void doHomeAssistantDiscovery(const char* topic, http_request_t* request) {
for (i = 0; i < PLATFORM_GPIO_MAX; i++) {
if (IS_PIN_DHT_ROLE(g_cfg.pins.roles[i]) || IS_PIN_TEMP_HUM_SENSOR_ROLE(g_cfg.pins.roles[i])) {
dev_info = hass_init_sensor_device_info(TEMPERATURE_SENSOR, PIN_GetPinChannelForPinIndex(i));
ch = PIN_GetPinChannelForPinIndex(i);
// TODO: flags are 32 bit and there are 64 max channels
BIT_SET(flagsChannelPublished, ch);
dev_info = hass_init_sensor_device_info(TEMPERATURE_SENSOR, ch, 2, 1);
MQTT_QueuePublish(topic, dev_info->channel, hass_build_discovery_json(dev_info), OBK_PUBLISH_FLAG_RETAIN);
hass_free_device_info(dev_info);
dev_info = hass_init_sensor_device_info(HUMIDITY_SENSOR, PIN_GetPinChannel2ForPinIndex(i));
ch = PIN_GetPinChannel2ForPinIndex(i);
// TODO: flags are 32 bit and there are 64 max channels
BIT_SET(flagsChannelPublished, ch);
dev_info = hass_init_sensor_device_info(HUMIDITY_SENSOR, ch, -1, -1);
MQTT_QueuePublish(topic, dev_info->channel, hass_build_discovery_json(dev_info), OBK_PUBLISH_FLAG_RETAIN);
hass_free_device_info(dev_info);
discoveryQueued = true;
}
else if (IS_PIN_AIR_SENSOR_ROLE(g_cfg.pins.roles[i])) {
dev_info = hass_init_sensor_device_info(CO2_SENSOR, PIN_GetPinChannelForPinIndex(i));
ch = PIN_GetPinChannelForPinIndex(i);
// TODO: flags are 32 bit and there are 64 max channels
BIT_SET(flagsChannelPublished, ch);
dev_info = hass_init_sensor_device_info(CO2_SENSOR, ch, -1, -1);
MQTT_QueuePublish(topic, dev_info->channel, hass_build_discovery_json(dev_info), OBK_PUBLISH_FLAG_RETAIN);
hass_free_device_info(dev_info);
dev_info = hass_init_sensor_device_info(TVOC_SENSOR, PIN_GetPinChannel2ForPinIndex(i));
ch = PIN_GetPinChannel2ForPinIndex(i);
// TODO: flags are 32 bit and there are 64 max channels
BIT_SET(flagsChannelPublished, ch);
dev_info = hass_init_sensor_device_info(TVOC_SENSOR, ch, -1, -1);
MQTT_QueuePublish(topic, dev_info->channel, hass_build_discovery_json(dev_info), OBK_PUBLISH_FLAG_RETAIN);
hass_free_device_info(dev_info);
@@ -1709,6 +1731,10 @@ void doHomeAssistantDiscovery(const char* topic, http_request_t* request) {
#if WINDOWS
for (i = 0; i < CHANNEL_MAX; i++) {
type = g_cfg.pins.channelTypes[i];
// TODO: flags are 32 bit and there are 64 max channels
if (BIT_CHECK(flagsChannelPublished, i)) {
continue;
}
switch (type)
{
case ChType_OpenClosed:
@@ -1720,9 +1746,27 @@ void doHomeAssistantDiscovery(const char* topic, http_request_t* request) {
discoveryQueued = true;
}
break;
case ChType_Voltage_div10:
{
dev_info = hass_init_sensor_device_info(VOLTAGE_SENSOR, i, 2, 1);
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_Temperature:
{
dev_info = hass_init_sensor_device_info(TEMPERATURE_SENSOR, i);
dev_info = hass_init_sensor_device_info(TEMPERATURE_SENSOR, i, -1, -1);
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_Temperature_div10:
{
dev_info = hass_init_sensor_device_info(TEMPERATURE_SENSOR, i, 2, 1);
MQTT_QueuePublish(topic, dev_info->channel, hass_build_discovery_json(dev_info), OBK_PUBLISH_FLAG_RETAIN);
hass_free_device_info(dev_info);
@@ -1731,7 +1775,61 @@ void doHomeAssistantDiscovery(const char* topic, http_request_t* request) {
break;
case ChType_Humidity:
{
dev_info = hass_init_sensor_device_info(HUMIDITY_SENSOR, i);
dev_info = hass_init_sensor_device_info(HUMIDITY_SENSOR, i, -1, -1);
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_Humidity_div10:
{
dev_info = hass_init_sensor_device_info(HUMIDITY_SENSOR, i, 2, 1);
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_Current_div100:
{
dev_info = hass_init_sensor_device_info(CURRENT_SENSOR, i, 3, 2);
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);
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_div10:
{
dev_info = hass_init_sensor_device_info(POWER_SENSOR, i, 2, 1);
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_PowerFactor_div1000:
{
dev_info = hass_init_sensor_device_info(POWERFACTOR_SENSOR, i, 4, 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_Frequency_div100:
{
dev_info = hass_init_sensor_device_info(FREQUENCY_SENSOR, i, 3, 2);
MQTT_QueuePublish(topic, dev_info->channel, hass_build_discovery_json(dev_info), OBK_PUBLISH_FLAG_RETAIN);
hass_free_device_info(dev_info);