From 7fa99f8078c89a3279a140197992e339b9356dc1 Mon Sep 17 00:00:00 2001 From: abmantis Date: Wed, 13 Feb 2019 01:32:06 +0000 Subject: [PATCH 1/6] add unique id and device support for better HA UI integration --- code/espurna/homeassistant.ino | 46 ++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/code/espurna/homeassistant.ino b/code/espurna/homeassistant.ino index a212fa52..3dc2ecca 100644 --- a/code/espurna/homeassistant.ino +++ b/code/espurna/homeassistant.ino @@ -31,17 +31,19 @@ String _haFixName(String name) { #if SENSOR_SUPPORT -void _haSendMagnitude(unsigned char i, JsonObject& config) { +void _haSendMagnitude(unsigned char i, const JsonObject& deviceConfig, JsonObject& config) { unsigned char type = magnitudeType(i); config["name"] = _haFixName(getSetting("hostname") + String(" ") + magnitudeTopic(type)); config.set("platform", "mqtt"); config["state_topic"] = mqttTopic(magnitudeTopicIndex(i).c_str(), false); config["unit_of_measurement"] = magnitudeUnits(type); + config["uniq_id"] = getIdentifier() + "_" + type + "_" + String(i); + config["device"] = deviceConfig; } -void _haSendMagnitudes() { +void _haSendMagnitudes(const JsonObject& deviceConfig) { for (unsigned char i=0; i 1) { @@ -82,6 +84,9 @@ void _haSendSwitch(unsigned char i, JsonObject& config) { config.set("name", _haFixName(name)); config.set("platform", "mqtt"); + config["uniq_id"] = getIdentifier() + "_switch_" + String(i); + config["device"] = deviceConfig; + if (relayCount()) { config["state_topic"] = mqttTopic(MQTT_TOPIC_RELAY, i, false); config["command_topic"] = mqttTopic(MQTT_TOPIC_RELAY, i, true); @@ -115,7 +120,7 @@ void _haSendSwitch(unsigned char i, JsonObject& config) { } -void _haSendSwitches() { +void _haSendSwitches(const JsonObject& deviceConfig) { #if (LIGHT_PROVIDER != LIGHT_PROVIDER_NONE) || (defined(ITEAD_SLAMPHER)) String type = String("light"); @@ -134,7 +139,7 @@ void _haSendSwitches() { if (_haEnabled) { DynamicJsonBuffer jsonBuffer; JsonObject& config = jsonBuffer.createObject(); - _haSendSwitch(i, config); + _haSendSwitch(i, deviceConfig, config); config.printTo(output); jsonBuffer.clear(); } @@ -150,6 +155,10 @@ void _haSendSwitches() { void _haDumpConfig(std::function printer, bool wrapJson = false) { + DynamicJsonBuffer deviceConfigJsonBuffer; + JsonObject& deviceConfig = deviceConfigJsonBuffer.createObject(); + _haGetDeviceConfig(deviceConfig); + #if (LIGHT_PROVIDER != LIGHT_PROVIDER_NONE) || (defined(ITEAD_SLAMPHER)) String type = String("light"); #else @@ -160,7 +169,7 @@ void _haDumpConfig(std::function printer, bool wrapJson = false) DynamicJsonBuffer jsonBuffer; JsonObject& config = jsonBuffer.createObject(); - _haSendSwitch(i, config); + _haSendSwitch(i, deviceConfig, config); String output; output.reserve(config.measureLength() + 32); @@ -202,7 +211,7 @@ void _haDumpConfig(std::function printer, bool wrapJson = false) DynamicJsonBuffer jsonBuffer; JsonObject& config = jsonBuffer.createObject(); - _haSendMagnitude(i, config); + _haSendMagnitude(i, deviceConfig, config); String output; output.reserve(config.measureLength() + 32); @@ -242,6 +251,15 @@ void _haDumpConfig(std::function printer, bool wrapJson = false) #endif + deviceConfigJsonBuffer.clear(); +} + +void _haGetDeviceConfig(JsonObject& config) { + String identifier = getIdentifier(); + + config.createNestedArray("identifiers").add(identifier); + config["name"] = _haFixName(getSetting("hostname")); + config["manufacturer"] = "Espurna"; } void _haSend() { @@ -254,12 +272,18 @@ void _haSend() { DEBUG_MSG_P(PSTR("[HA] Sending autodiscovery MQTT message\n")); + // Get common device config + DynamicJsonBuffer jsonBuffer; + JsonObject& deviceConfig = jsonBuffer.createObject(); + _haGetDeviceConfig(deviceConfig); + // Send messages - _haSendSwitches(); + _haSendSwitches(deviceConfig); #if SENSOR_SUPPORT - _haSendMagnitudes(); + _haSendMagnitudes(deviceConfig); #endif - + + jsonBuffer.clear(); _haSendFlag = false; } From 2b50e0dac92a338f1073565b401b54b8a39381e7 Mon Sep 17 00:00:00 2001 From: abmantis Date: Wed, 13 Feb 2019 22:34:56 +0000 Subject: [PATCH 2/6] fix warning; add more info --- code/espurna/homeassistant.ino | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/espurna/homeassistant.ino b/code/espurna/homeassistant.ino index 3dc2ecca..b4c8f345 100644 --- a/code/espurna/homeassistant.ino +++ b/code/espurna/homeassistant.ino @@ -259,7 +259,9 @@ void _haGetDeviceConfig(JsonObject& config) { config.createNestedArray("identifiers").add(identifier); config["name"] = _haFixName(getSetting("hostname")); - config["manufacturer"] = "Espurna"; + config["manufacturer"] = String("Espurna"); + config["model"] = getBoardName(); + config["sw_version"] = String(APP_VERSION) + " (" + getCoreVersion() + ")"; } void _haSend() { From 0424610b874a97aa40d365f3b35c1f16050ac74b Mon Sep 17 00:00:00 2001 From: abmantis Date: Fri, 15 Feb 2019 22:30:43 +0000 Subject: [PATCH 3/6] don't add discovery info on generated yaml --- code/espurna/homeassistant.ino | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/code/espurna/homeassistant.ino b/code/espurna/homeassistant.ino index b4c8f345..55cef328 100644 --- a/code/espurna/homeassistant.ino +++ b/code/espurna/homeassistant.ino @@ -38,9 +38,11 @@ void _haSendMagnitude(unsigned char i, const JsonObject& deviceConfig, JsonObjec config.set("platform", "mqtt"); config["state_topic"] = mqttTopic(magnitudeTopicIndex(i).c_str(), false); config["unit_of_measurement"] = magnitudeUnits(type); - config["uniq_id"] = getIdentifier() + "_" + type + "_" + String(i); - config["device"] = deviceConfig; + if (deviceConfig.size() > 0) { + config["uniq_id"] = getIdentifier() + "_" + type + "_" + String(i); + config["device"] = deviceConfig; + } } void _haSendMagnitudes(const JsonObject& deviceConfig) { @@ -84,8 +86,10 @@ void _haSendSwitch(unsigned char i, const JsonObject& deviceConfig, JsonObject& config.set("name", _haFixName(name)); config.set("platform", "mqtt"); - config["uniq_id"] = getIdentifier() + "_switch_" + String(i); - config["device"] = deviceConfig; + if (deviceConfig.size() > 0) { + config["uniq_id"] = getIdentifier() + "_switch_" + String(i); + config["device"] = deviceConfig; + } if (relayCount()) { config["state_topic"] = mqttTopic(MQTT_TOPIC_RELAY, i, false); @@ -156,8 +160,7 @@ void _haSendSwitches(const JsonObject& deviceConfig) { void _haDumpConfig(std::function printer, bool wrapJson = false) { DynamicJsonBuffer deviceConfigJsonBuffer; - JsonObject& deviceConfig = deviceConfigJsonBuffer.createObject(); - _haGetDeviceConfig(deviceConfig); + JsonObject& emptyDeviceConfig = deviceConfigJsonBuffer.createObject(); #if (LIGHT_PROVIDER != LIGHT_PROVIDER_NONE) || (defined(ITEAD_SLAMPHER)) String type = String("light"); @@ -169,7 +172,7 @@ void _haDumpConfig(std::function printer, bool wrapJson = false) DynamicJsonBuffer jsonBuffer; JsonObject& config = jsonBuffer.createObject(); - _haSendSwitch(i, deviceConfig, config); + _haSendSwitch(i, emptyDeviceConfig, config); String output; output.reserve(config.measureLength() + 32); @@ -211,7 +214,7 @@ void _haDumpConfig(std::function printer, bool wrapJson = false) DynamicJsonBuffer jsonBuffer; JsonObject& config = jsonBuffer.createObject(); - _haSendMagnitude(i, deviceConfig, config); + _haSendMagnitude(i, emptyDeviceConfig, config); String output; output.reserve(config.measureLength() + 32); @@ -259,9 +262,9 @@ void _haGetDeviceConfig(JsonObject& config) { config.createNestedArray("identifiers").add(identifier); config["name"] = _haFixName(getSetting("hostname")); - config["manufacturer"] = String("Espurna"); - config["model"] = getBoardName(); - config["sw_version"] = String(APP_VERSION) + " (" + getCoreVersion() + ")"; + config["manufacturer"] = String(MANUFACTURER); + config["model"] = String(DEVICE); + config["sw_version"] = String(APP_NAME) + " " + String(APP_VERSION) + " (" + getCoreVersion() + ")"; } void _haSend() { From b412f7fd3678256fe72d960a69b17d14ba6cbb75 Mon Sep 17 00:00:00 2001 From: abmantis Date: Sat, 16 Feb 2019 00:56:18 +0000 Subject: [PATCH 4/6] improve name --- code/espurna/homeassistant.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/espurna/homeassistant.ino b/code/espurna/homeassistant.ino index 55cef328..639a5282 100644 --- a/code/espurna/homeassistant.ino +++ b/code/espurna/homeassistant.ino @@ -261,7 +261,7 @@ void _haGetDeviceConfig(JsonObject& config) { String identifier = getIdentifier(); config.createNestedArray("identifiers").add(identifier); - config["name"] = _haFixName(getSetting("hostname")); + config["name"] = getSetting("desc", getSetting("hostname")); config["manufacturer"] = String(MANUFACTURER); config["model"] = String(DEVICE); config["sw_version"] = String(APP_NAME) + " " + String(APP_VERSION) + " (" + getCoreVersion() + ")"; From a832eab84ed3925a19d0b072193e7caf8ff5e454 Mon Sep 17 00:00:00 2001 From: abmantis Date: Sun, 17 Feb 2019 00:35:15 +0000 Subject: [PATCH 5/6] remove uneeded checks; use better type for uniq id --- code/espurna/homeassistant.ino | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/code/espurna/homeassistant.ino b/code/espurna/homeassistant.ino index 639a5282..2c83942a 100644 --- a/code/espurna/homeassistant.ino +++ b/code/espurna/homeassistant.ino @@ -31,18 +31,13 @@ String _haFixName(String name) { #if SENSOR_SUPPORT -void _haSendMagnitude(unsigned char i, const JsonObject& deviceConfig, JsonObject& config) { +void _haSendMagnitude(unsigned char i, JsonObject& config) { unsigned char type = magnitudeType(i); config["name"] = _haFixName(getSetting("hostname") + String(" ") + magnitudeTopic(type)); config.set("platform", "mqtt"); config["state_topic"] = mqttTopic(magnitudeTopicIndex(i).c_str(), false); config["unit_of_measurement"] = magnitudeUnits(type); - - if (deviceConfig.size() > 0) { - config["uniq_id"] = getIdentifier() + "_" + type + "_" + String(i); - config["device"] = deviceConfig; - } } void _haSendMagnitudes(const JsonObject& deviceConfig) { @@ -58,7 +53,10 @@ void _haSendMagnitudes(const JsonObject& deviceConfig) { if (_haEnabled) { DynamicJsonBuffer jsonBuffer; JsonObject& config = jsonBuffer.createObject(); - _haSendMagnitude(i, deviceConfig, config); + _haSendMagnitude(i, config); + config["uniq_id"] = getIdentifier() + "_" + magnitudeTopic(magnitudeType(i)) + "_" + String(i); + config["device"] = deviceConfig; + config.printTo(output); jsonBuffer.clear(); } @@ -76,7 +74,7 @@ void _haSendMagnitudes(const JsonObject& deviceConfig) { // SWITCHES & LIGHTS // ----------------------------------------------------------------------------- -void _haSendSwitch(unsigned char i, const JsonObject& deviceConfig, JsonObject& config) { +void _haSendSwitch(unsigned char i, JsonObject& config) { String name = getSetting("hostname"); if (relayCount() > 1) { @@ -86,11 +84,6 @@ void _haSendSwitch(unsigned char i, const JsonObject& deviceConfig, JsonObject& config.set("name", _haFixName(name)); config.set("platform", "mqtt"); - if (deviceConfig.size() > 0) { - config["uniq_id"] = getIdentifier() + "_switch_" + String(i); - config["device"] = deviceConfig; - } - if (relayCount()) { config["state_topic"] = mqttTopic(MQTT_TOPIC_RELAY, i, false); config["command_topic"] = mqttTopic(MQTT_TOPIC_RELAY, i, true); @@ -143,7 +136,10 @@ void _haSendSwitches(const JsonObject& deviceConfig) { if (_haEnabled) { DynamicJsonBuffer jsonBuffer; JsonObject& config = jsonBuffer.createObject(); - _haSendSwitch(i, deviceConfig, config); + _haSendSwitch(i, config); + config["uniq_id"] = getIdentifier() + "_switch_" + String(i); + config["device"] = deviceConfig; + config.printTo(output); jsonBuffer.clear(); } @@ -159,9 +155,6 @@ void _haSendSwitches(const JsonObject& deviceConfig) { void _haDumpConfig(std::function printer, bool wrapJson = false) { - DynamicJsonBuffer deviceConfigJsonBuffer; - JsonObject& emptyDeviceConfig = deviceConfigJsonBuffer.createObject(); - #if (LIGHT_PROVIDER != LIGHT_PROVIDER_NONE) || (defined(ITEAD_SLAMPHER)) String type = String("light"); #else @@ -172,7 +165,7 @@ void _haDumpConfig(std::function printer, bool wrapJson = false) DynamicJsonBuffer jsonBuffer; JsonObject& config = jsonBuffer.createObject(); - _haSendSwitch(i, emptyDeviceConfig, config); + _haSendSwitch(i, config); String output; output.reserve(config.measureLength() + 32); @@ -214,7 +207,7 @@ void _haDumpConfig(std::function printer, bool wrapJson = false) DynamicJsonBuffer jsonBuffer; JsonObject& config = jsonBuffer.createObject(); - _haSendMagnitude(i, emptyDeviceConfig, config); + _haSendMagnitude(i, config); String output; output.reserve(config.measureLength() + 32); @@ -253,8 +246,6 @@ void _haDumpConfig(std::function printer, bool wrapJson = false) } #endif - - deviceConfigJsonBuffer.clear(); } void _haGetDeviceConfig(JsonObject& config) { From 490fb21636a00366d7d18a948aee267e828e6dc1 Mon Sep 17 00:00:00 2001 From: abmantis Date: Sun, 17 Feb 2019 01:26:45 +0000 Subject: [PATCH 6/6] use type instead of "switch" --- code/espurna/homeassistant.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/espurna/homeassistant.ino b/code/espurna/homeassistant.ino index 2c83942a..a3892bce 100644 --- a/code/espurna/homeassistant.ino +++ b/code/espurna/homeassistant.ino @@ -137,7 +137,7 @@ void _haSendSwitches(const JsonObject& deviceConfig) { DynamicJsonBuffer jsonBuffer; JsonObject& config = jsonBuffer.createObject(); _haSendSwitch(i, config); - config["uniq_id"] = getIdentifier() + "_switch_" + String(i); + config["uniq_id"] = getIdentifier() + "_" + type + "_" + String(i); config["device"] = deviceConfig; config.printTo(output);