Auto discovery deactivation at runtime by MQTT command (#856)

and switch automatic creation for it in HASS (by autodiscovery :-)
This commit is contained in:
Florian authored and GitHub committed 2021-01-31 13:41:22 -06:00
1 parent e8b4c63c6c
commit 2d377a1c3f
9 files changed
+94 -26

No files matched your search

+3 -1
View File
@@ -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)
+27
View File
@@ -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)
+14
View File
@@ -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:
+2 -1
View File
@@ -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) {
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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);
+8
View File
@@ -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
+15 -12
View File
@@ -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
}
+21 -10
View File
@@ -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<bool>("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
}
}