From 2d377a1c3f8350bf423452fc2dcadea5f9fe9ed5 Mon Sep 17 00:00:00 2001 From: Florian <1technophile@users.noreply.github.com> Date: Sun, 31 Jan 2021 13:41:22 -0600 Subject: [PATCH] Auto discovery deactivation at runtime by MQTT command (#856) and switch automatic creation for it in HASS (by autodiscovery :-) --- docs/integrate/home_assistant.md | 4 +++- docs/upload/advanced-configuration.md | 27 +++++++++++++++++++++++ docs/use/gateway.md | 14 ++++++++++++ main/ZgatewayBT.ino | 3 ++- main/ZgatewayRF.ino | 3 ++- main/ZgatewayRF2.ino | 3 ++- main/ZmqttDiscovery.ino | 8 +++++++ main/ZsensorDS1820.ino | 27 ++++++++++++----------- main/main.ino | 31 ++++++++++++++++++--------- 9 files changed, 94 insertions(+), 26 deletions(-) diff --git a/docs/integrate/home_assistant.md b/docs/integrate/home_assistant.md index 9036a65..309a67e 100644 --- a/docs/integrate/home_assistant.md +++ b/docs/integrate/home_assistant.md @@ -1,6 +1,6 @@ # Integrate Home Assistant ## Auto discovery -So as to enable HASS auto discovery with MQTT you have to uncomment [ZmqttDiscovery](https://github.com/1technophile/OpenMQTTGateway/blob/0180a0dbd55ed8e0799e30ee84f68070a6f478fa/User_config.h#L99) in User_config.h. Note that Home Assistant discovery is enabled by default on all binaries and platformio configurations except for UNO. +Home Assistant discovery is enabled by default on all binaries and platformio configurations except for UNO. With Arduino IDE please read the [advanced configuration section](../upload/advanced-configuration#auto-discovery) of the documentation. Once done, enable discovery on your MQTT integration definition in HASS. @@ -14,7 +14,9 @@ The max size of the username is 30 and 60 for the password. OMG will use the auto discovery functionality of home assistant to create sensors and gateways into your HASS instance automaticaly. +::: tip The gateway device will be available into Configuration->Devices section of Home Assistant. +::: ![](../img/OpenMQTTGateway_Home_Assistant_MQTT_discovery.png) diff --git a/docs/upload/advanced-configuration.md b/docs/upload/advanced-configuration.md index e63f53d..538f7f9 100644 --- a/docs/upload/advanced-configuration.md +++ b/docs/upload/advanced-configuration.md @@ -52,3 +52,30 @@ home/OpenMQTTGateway/SRFBtoMQTT/59365 {"raw":"2B660186042E00E7E5","value":"59365 ``` It can be usefull to avoid warning or errors on certain controllers. + +## Auto discovery +Home Assistant discovery is enabled by default on all binaries and platformio configurations except for UNO. With Arduino IDE you have to uncomment [ZmqttDiscovery](https://github.com/1technophile/OpenMQTTGateway/blob/0180a0dbd55ed8e0799e30ee84f68070a6f478fa/User_config.h#L99) in User_config.h. + +To have a working discovery setup you need to enable it on your MQTT integration definition in HASS. + +::: tip +With platformio you can deactivate discovery by adding: +``` ini +'-UZmqttDiscovery="HADiscovery"' +``` +To your environment definition. +::: + +So as to create the MQTT username and password, you have to create a new user(recommended) into Home Assistant->Configuration->Users (available in admin mode) or use an existing username/pwd combination (not recommended). This user doesn't need to be an administrator. + +![](../img/OpenMQTTGateway-Configuration-Home-Assistant.png) + +::: warning +The max size of the username is 30 and 60 for the password. +::: + +OMG will use the auto discovery functionality of home assistant to create sensors and gateways into your HASS instance automaticaly. + +The gateway device will be available into Configuration->Devices section of Home Assistant. + +![](../img/OpenMQTTGateway_Home_Assistant_MQTT_discovery.png) diff --git a/docs/use/gateway.md b/docs/use/gateway.md index 1bab4f6..7ed7895 100644 --- a/docs/use/gateway.md +++ b/docs/use/gateway.md @@ -15,6 +15,20 @@ With Home Assistant, this command is directly avalaible through MQTT auto discov With Home Assistant, this command is directly avalaible through MQTT auto discovery as a switch into the HASS OpenMQTTGateway device entities list. ::: +## Auto discovery +You can deactivate the MQTT auto discovery function, this function enable to create automaticaly devices/entities with Home Assistant convention. +### Deactivate +`mosquitto_pub -t "home/OpenMQTTGateway/commands/MQTTtoSYS/config" -m '{"discovery":false}'` + +### Activate +`mosquitto_pub -t "home/OpenMQTTGateway/commands/MQTTtoSYS/config" -m '{"discovery":true}'` + +If you want the settings to be kept upon gateway restart, you can publish the command with the retain flag. + +::: tip +Auto discovery is enable by default on release binaries, on platformio (except for UNO). With Arduino IDE please read the [advanced configuration section](../upload/advanced-configuration#auto-discovery) of the documentation. +::: + # State LED usage The gateway can support up to 3 LED to display its operating state: diff --git a/main/ZgatewayBT.ino b/main/ZgatewayBT.ino index 6bf67ba..4270565 100644 --- a/main/ZgatewayBT.ino +++ b/main/ZgatewayBT.ino @@ -612,7 +612,8 @@ void coreTask(void* pvParameters) { // Launching a connect every BLEscanBeforeConnect if (!(scanCount % BLEscanBeforeConnect) || scanCount == 1) BLEconnect(); - launchDiscovery(); + if (disc) + launchDiscovery(); dumpDevices(); } if (low_power_mode) { diff --git a/main/ZgatewayRF.ino b/main/ZgatewayRF.ino index 6549ab5..f1adfa9 100644 --- a/main/ZgatewayRF.ino +++ b/main/ZgatewayRF.ino @@ -98,7 +98,8 @@ void RFtoMQTT() { if (!isAduplicateSignal(MQTTvalue) && MQTTvalue != 0) { // conditions to avoid duplications of RF -->MQTT # if defined(ZmqttDiscovery) && !defined(RF_DISABLE_TRANSMIT) //component creation for HA - RFtoMQTTdiscovery(MQTTvalue); + if (disc) + RFtoMQTTdiscovery(MQTTvalue); # endif pub(subjectRFtoMQTT, RFdata); // Casting "receivedSignal[o].value" to (unsigned long) because ArduinoLog doesn't support uint64_t for ESP's diff --git a/main/ZgatewayRF2.ino b/main/ZgatewayRF2.ino index 6dccfd8..a941006 100644 --- a/main/ZgatewayRF2.ino +++ b/main/ZgatewayRF2.ino @@ -132,7 +132,8 @@ void RF2toMQTT() { RF2data.set("address", (unsigned long)rf2rd.address); RF2data.set("switchType", (int)rf2rd.switchType); # ifdef ZmqttDiscovery //component creation for HA - RF2toMQTTdiscovery(RF2data); + if (disc) + RF2toMQTTdiscovery(RF2data); # endif pub(subjectRF2toMQTT, RF2data); diff --git a/main/ZmqttDiscovery.ino b/main/ZmqttDiscovery.ino index 36c88cd..6ec48c3 100644 --- a/main/ZmqttDiscovery.ino +++ b/main/ZmqttDiscovery.ino @@ -292,6 +292,14 @@ void pubMqttDiscovery() { Gateway_AnnouncementMsg, will_Message, true, subjectMQTTtoSYSset, //set,payload_avalaible,payload_not avalaible ,is a gateway entity, command topic "", "", "", "" // device name, device manufacturer, device model, device mac ); + createDiscovery("switch", //set Type + "", "SYS: Auto discovery", (char*)getUniqueId("discovery", "").c_str(), //set state_topic,name,uniqueId + will_Topic, "", "", //set availability_topic,device_class,value_template, + "{\"discovery\":true}", "{\"discovery\":false}", "", //set,payload_on,payload_off,unit_of_meas, + 0, //set off_delay + Gateway_AnnouncementMsg, will_Message, true, subjectMQTTtoSYSset, //set,payload_avalaible,payload_not avalaible ,is a gateway entity, command topic + "", "", "", "" // device name, device manufacturer, device model, device mac + ); # ifdef ZsensorBME280 # define BMEparametersCount 5 diff --git a/main/ZsensorDS1820.ino b/main/ZsensorDS1820.ino index 2ceceec..91877ab 100644 --- a/main/ZsensorDS1820.ino +++ b/main/ZsensorDS1820.ino @@ -100,18 +100,21 @@ void setupZsensorDS1820() { void pubOneWire_HADiscovery() { // If zmqttDiscovery is enabled, create a sensor topic for each DS18b20 sensor found on the bus, using addr as uniqueID # ifdef ZmqttDiscovery - Log.notice(F("CreateDiscoverySensor - Found %d" CR), ds1820_count); - for (int index = 0; index < ds1820_count; index++) { - createDiscovery("sensor", - (char*)(String(OW_TOPIC) + "/" + ds1820_addr[index]).c_str(), - (char*)("DS12B20_" + String(index + 1) + "_c").c_str(), - (char*)(ds1820_addr[index] + "_c").c_str(), - will_Topic, - "temperature", - jsonTempc, - "", "", "°C", - 0, "", "", true, "", - "", "", "", ""); + // If zmqtt discovery is enabled, create a sensor topic for each DS18b20 sensor found on the bus, using addr as uniqueID + if (disc) { + Log.notice(F("CreateDiscoverySensor - Found %d" CR), ds1820_count); + for (int index = 0; index < ds1820_count; index++) { + createDiscovery("sensor", + (char*)(String(OW_TOPIC) + "/" + ds1820_addr[index]).c_str(), + (char*)("DS12B20_" + String(index + 1) + "_c").c_str(), + (char*)(ds1820_addr[index] + "_c").c_str(), + will_Topic, + "temperature", + jsonTempc, + "", "", "°C", + 0, "", "", true, "", + "", "", "", ""); + } } # endif } diff --git a/main/main.ino b/main/main.ino index 4bd59fc..91c7b98 100644 --- a/main/main.ino +++ b/main/main.ino @@ -159,7 +159,9 @@ char gateway_name[parameters_size * 2] = Gateway_Name; bool connectedOnce = false; //indicate if we have been connected once to MQTT int failure_number_ntwk = 0; // number of failure connecting to network int failure_number_mqtt = 0; // number of failure connecting to MQTT - +#ifdef ZmqttDiscovery +bool disc = true; // Auto discovery with Home Assistant convention +#endif unsigned long timer_led_measures = 0; #ifdef ESP32 @@ -716,9 +718,6 @@ void setup() { setupRS232(); modules.add(ZgatewayRS232); #endif -#ifdef ZmqttDiscovery - modules.add(ZmqttDiscovery); -#endif #ifdef ZsensorSHTC3 setupSHTC3(); #endif @@ -1243,15 +1242,17 @@ void loop() { #endif failure_number_ntwk = 0; if (client.connected()) { -#ifdef ZmqttDiscovery - if (!connectedOnce) pubMqttDiscovery(); // at first connection we publish the discovery payloads -#endif digitalWrite(LED_INFO, LED_INFO_ON); connectedOnce = true; failure_number_ntwk = 0; client.loop(); +#ifdef ZmqttDiscovery + if (disc) + if (!connectedOnce) pubMqttDiscovery(); // at first connection we publish the discovery payloads +#endif + #if defined(ESP8266) || defined(ESP32) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) if (now > (timer_sys_measures + (TimeBetweenReadingSYS * 1000)) || !timer_sys_measures) { timer_sys_measures = millis(); @@ -1533,7 +1534,7 @@ void receivingMQTT(char* topicOri, char* datacallback) { # if defined(ZboardM5STICKC) || defined(ZboardM5STICKCP) || defined(ZboardM5STACK) MQTTtoM5(topicOri, jsondata); # endif -# ifdef ZactuatorONOFF // outside the jsonpublishing macro due to the fact that we need to use simplepublishing with HA discovery +# ifdef ZactuatorONOFF MQTTtoONOFF(topicOri, jsondata); # endif # ifdef ZactuatorSomfy @@ -1596,10 +1597,20 @@ void MQTTtoSYS(char* topicOri, JsonObject& SYSdata) { // json object decoding # ifndef ESPWifiManualSetup setup_wifimanager(true); # endif - } else { - Log.warning(F("wrong command" CR)); } } +#endif +#ifdef ZmqttDiscovery + if (SYSdata.containsKey("discovery")) { + if (SYSdata.is("discovery")) { + disc = SYSdata["discovery"]; + if (disc) + pubMqttDiscovery(); + } else { + Log.error(F("Discovery command not a boolean" CR)); + } + Log.notice(F("Discovery state: %T" CR), disc); + } #endif } }