From 9a66c9ef09e576e16fd184d0efd0543c3ceee0a7 Mon Sep 17 00:00:00 2001 From: Florian <1technophile@users.noreply.github.com> Date: Wed, 4 Nov 2020 11:53:55 -0600 Subject: [PATCH] HASS gateway Discovery improvements (#792) * MQTT discovery improvements -remove gatewayBT -remove device class formaldehyde (not existing in HASS) -add SYStoMQTT new parameters -attach connectivity parameter to the device -add BT gateway infos and switches -refactor modules storage and publication --- ...TGateway_Home_Assistant_MQTT_discovery.png | Bin 0 -> 80217 bytes docs/integrate/home_assistant.md | 9 +- docs/use/ble.md | 8 ++ docs/use/gateway.md | 9 +- main/ZgatewayBT.ino | 2 +- main/ZmqttDiscovery.ino | 94 +++++++++++--- main/main.ino | 118 +++++------------- 7 files changed, 136 insertions(+), 104 deletions(-) create mode 100644 docs/img/OpenMQTTGateway_Home_Assistant_MQTT_discovery.png diff --git a/docs/img/OpenMQTTGateway_Home_Assistant_MQTT_discovery.png b/docs/img/OpenMQTTGateway_Home_Assistant_MQTT_discovery.png new file mode 100644 index 0000000000000000000000000000000000000000..29e4495d178645a4f43097bf08818ba73cafeac4 GIT binary patch literal 80217 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ΌHmD-O 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 Vct3AR2C#5q@O1TaS?83{1ONoT*(Cq~ literal 0 HcmV?d00001 diff --git a/docs/integrate/home_assistant.md b/docs/integrate/home_assistant.md index d3129b1..9089ef4 100644 --- a/docs/integrate/home_assistant.md +++ b/docs/integrate/home_assistant.md @@ -1,10 +1,15 @@ # 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 -And enable discovery on your MQTT integration definition in HASS. +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. + +Once done, enable discovery on your MQTT integration definition in HASS. 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) + ## Manual integration examples From @123, @finity, @denniz03, @jrockstad diff --git a/docs/use/ble.md b/docs/use/ble.md index a4cfc98..f641c74 100644 --- a/docs/use/ble.md +++ b/docs/use/ble.md @@ -85,6 +85,10 @@ you can also force a scan to be done by the following command: `mosquitto_pub -t home/OpenMQTTGateway/commands/MQTTtoBT/config -m '{"interval":0}'` +::: tip +With Home Assistant, this command is directly avalaible through MQTT auto discovery as a switch into the HASS OpenMQTTGateway device entities list. +::: + Once the forced scan has completed, the previous scan interval value will be restored. Forcing a scan command trigger also a BLE connect process after the scan (see below). The default value `TimeBtwRead` is set into config_BT.h or into your .ini file for platformio users. @@ -107,6 +111,10 @@ If you want to change this characteristic: `mosquitto_pub -t home/OpenMQTTGateway/commands/MQTTtoBT/config -m '{"onlysensors":true}'` +::: tip +With Home Assistant, this command is directly avalaible through MQTT auto discovery as a switch into the HASS OpenMQTTGateway device entities list. +::: + The gateway will publish only the detected sensors like Mi Flora, Mi jia, LYWSD03MMC... and not the other BLE devices. This is usefull if you don't use the gateway for presence detection but only to retrieve sensors data. ## Setting the minimum RSSI accepted to publish device data diff --git a/docs/use/gateway.md b/docs/use/gateway.md index a25c7b8..dcdaf0f 100644 --- a/docs/use/gateway.md +++ b/docs/use/gateway.md @@ -1,13 +1,20 @@ # System commands (ESP only) ## Restart the ESP - `mosquitto_pub -t "home/OpenMQTTGateway/commands/MQTTtoSYS/config" -m '{"cmd":"restart"}'` +::: tip +With Home Assistant, this command is directly avalaible through MQTT auto discovery as a switch into the HASS OpenMQTTGateway device entities list. +::: + ## Erase the ESP settings `mosquitto_pub -t "home/OpenMQTTGateway/commands/MQTTtoSYS/config" -m '{"cmd":"erase"}'` +::: tip +With Home Assistant, this command is directly avalaible through MQTT auto discovery as a switch into the HASS OpenMQTTGateway device entities list. +::: + # 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 28be566..b2cec7a 100644 --- a/main/ZgatewayBT.ino +++ b/main/ZgatewayBT.ino @@ -230,7 +230,7 @@ void FormalDiscovery(char* mac) { {"sensor", "Formal-batt", mac, "battery", jsonBatt, "", "", "%"}, {"sensor", "Formal-temp", mac, "temperature", jsonTempc, "", "", "°C"}, {"sensor", "Formal-hum", mac, "humidity", jsonHum, "", "", "%"}, - {"sensor", "Formal-for", mac, "formaldehyde", jsonFor, "", "", "%"} + {"sensor", "Formal-for", mac, "", jsonFor, "", "", "%"} //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement }; diff --git a/main/ZmqttDiscovery.ino b/main/ZmqttDiscovery.ino index 4f28e56..418b031 100644 --- a/main/ZmqttDiscovery.ino +++ b/main/ZmqttDiscovery.ino @@ -114,7 +114,11 @@ void createDiscovery(char* sensor_type, if (child_device) { StaticJsonBuffer jsonDeviceBuffer; JsonObject& device = jsonDeviceBuffer.createObject(); + char JSONmessageBuffer[JSON_MSG_BUFFER]; + modules.printTo(JSONmessageBuffer, sizeof(JSONmessageBuffer)); + Log.notice(F("Received json : %s" CR), JSONmessageBuffer); device.set("name", gateway_name); + device.set("model", JSONmessageBuffer); device.set("manufacturer", DEVICEMANUFACTURER); device.set("sw_version", OMG_VERSION); JsonArray& identifiers = device.createNestedArray("identifiers"); @@ -128,21 +132,63 @@ void createDiscovery(char* sensor_type, void pubMqttDiscovery() { Log.trace(F("omgStatusDiscovery" CR)); createDiscovery("binary_sensor", //set Type - will_Topic, Gateway_Name, (char*)getUniqueId("", "").c_str(), //set state_topic,name,uniqueId + will_Topic, "SYS: Connectivity", (char*)getUniqueId("connectivity", "").c_str(), //set state_topic,name,uniqueId will_Topic, "connectivity", "", //set availability_topic,device_class,value_template, Gateway_AnnouncementMsg, will_Message, "", //set,payload_on,payload_off,unit_of_meas, 0, //set off_delay - Gateway_AnnouncementMsg, will_Message, false, "" //set,payload_avalaible,payload_not avalaible ,is a child device, command topic + Gateway_AnnouncementMsg, will_Message, true, "" //set,payload_avalaible,payload_not avalaible ,is a child device, command topic ); + createDiscovery("sensor", //set Type + subjectSYStoMQTT, "SYS: Uptime", (char*)getUniqueId("uptime", "").c_str(), //set state_topic,name,uniqueId + "", "", "{{ value_json.uptime }}", //set availability_topic,device_class,value_template, + "", "", "s", //set,payload_on,payload_off,unit_of_meas, + 0, //set off_delay + "", "", true, "" //set,payload_avalaible,payload_not avalaible ,is a child device, command topic + ); + +# if defined(ESP8266) || defined(ESP32) + createDiscovery("sensor", //set Type + subjectSYStoMQTT, "SYS: Free memory", (char*)getUniqueId("freemem", "").c_str(), //set state_topic,name,uniqueId + "", "", "{{ value_json.freemem }}", //set availability_topic,device_class,value_template, + "", "", "B", //set,payload_on,payload_off,unit_of_meas, + 0, //set off_delay + "", "", true, "" //set,payload_avalaible,payload_not avalaible ,is a child device, command topic + ); + createDiscovery("sensor", //set Type + subjectSYStoMQTT, "SYS: IP", (char*)getUniqueId("ip", "").c_str(), //set state_topic,name,uniqueId + "", "", "{{ value_json.ip }}", //set availability_topic,device_class,value_template, + "", "", "", //set,payload_on,payload_off,unit_of_meas, + 0, //set off_delay + "", "", true, "" //set,payload_avalaible,payload_not avalaible ,is a child device, command topic + ); +# ifndef ESP32_ETHERNET + createDiscovery("sensor", //set Type + subjectSYStoMQTT, "SYS: Rssi", (char*)getUniqueId("rssi", "").c_str(), //set state_topic,name,uniqueId + "", "", "{{ value_json.rssi }}", //set availability_topic,device_class,value_template, + "", "", "dB", //set,payload_on,payload_off,unit_of_meas, + 0, //set off_delay + "", "", true, "" //set,payload_avalaible,payload_not avalaible ,is a child device, command topic + ); +# endif +# endif +# ifdef ESP32 + createDiscovery("sensor", //set Type + subjectSYStoMQTT, "SYS: Low Power Mode", (char*)getUniqueId("lowpowermode", "").c_str(), //set state_topic,name,uniqueId + "", "", "{{ value_json.lowpowermode }}", //set availability_topic,device_class,value_template, + "", "", "", //set,payload_on,payload_off,unit_of_meas, + 0, //set off_delay + "", "", true, "" //set,payload_avalaible,payload_not avalaible ,is a child device, command topic + ); +# endif createDiscovery("switch", //set Type - will_Topic, "restart OMG", (char*)getUniqueId("restart", "").c_str(), //set state_topic,name,uniqueId + will_Topic, "SYS: Restart gateway", (char*)getUniqueId("restart", "").c_str(), //set state_topic,name,uniqueId will_Topic, "", "", //set availability_topic,device_class,value_template, "{\"cmd\":\"restart\"}", "", "", //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 child device, command topic ); createDiscovery("switch", //set Type - will_Topic, "erase OMG", (char*)getUniqueId("erase", "").c_str(), //set state_topic,name,uniqueId + will_Topic, "SYS: Erase credentials", (char*)getUniqueId("erase", "").c_str(), //set state_topic,name,uniqueId will_Topic, "", "", //set availability_topic,device_class,value_template, "{\"cmd\":\"erase\"}", "", "", //set,payload_on,payload_off,unit_of_meas, 0, //set off_delay @@ -476,18 +522,34 @@ void pubMqttDiscovery() { # endif # ifdef ZgatewayBT - // Sensor to display BT received value - Log.trace(F("gatewayBTDiscovery" CR)); - char* gatewayBT[8] = {"sensor", "gatewayBT", "", "", jsonId, "", "", ""}; - //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement - - Log.trace(F("CreateDiscoverySensor" CR)); - //trc(gatewayBT[1]); - createDiscovery(gatewayBT[0], - subjectBTtoMQTT, gatewayBT[1], (char*)getUniqueId(gatewayBT[1], gatewayBT[2]).c_str(), - will_Topic, gatewayBT[3], gatewayBT[4], - gatewayBT[5], gatewayBT[6], gatewayBT[7], - 0, "", "", true, ""); + createDiscovery("sensor", //set Type + subjectSYStoMQTT, "BT: Interval between scans", (char*)getUniqueId("interval", "").c_str(), //set state_topic,name,uniqueId + "", "", "{{ value_json.interval }}", //set availability_topic,device_class,value_template, + "", "", "ms", //set,payload_on,payload_off,unit_of_meas, + 0, //set off_delay + "", "", true, "" //set,payload_avalaible,payload_not avalaible ,is a child device, command topic + ); + createDiscovery("sensor", //set Type + subjectSYStoMQTT, "BT: Connnect every X scan(s)", (char*)getUniqueId("scanbcnct", "").c_str(), //set state_topic,name,uniqueId + "", "", "{{ value_json.scanbcnct }}", //set availability_topic,device_class,value_template, + "", "", "", //set,payload_on,payload_off,unit_of_meas, + 0, //set off_delay + "", "", true, "" //set,payload_avalaible,payload_not avalaible ,is a child device, command topic + ); + createDiscovery("switch", //set Type + will_Topic, "BT: Force scan", (char*)getUniqueId("force_scan", "").c_str(), //set state_topic,name,uniqueId + will_Topic, "", "", //set availability_topic,device_class,value_template, + "{\"interval\":0}", "", "", //set,payload_on,payload_off,unit_of_meas, + 0, //set off_delay + Gateway_AnnouncementMsg, will_Message, true, subjectMQTTtoBTset //set,payload_avalaible,payload_not avalaible ,is a child device, command topic + ); + createDiscovery("switch", //set Type + "", "BT: Publish only sensors", (char*)getUniqueId("only_sensors", "").c_str(), //set state_topic,name,uniqueId + "", "", "", //set availability_topic,device_class,value_template, + "{\"onlysensors\":true}", "{\"onlysensors\":false}", "", //set,payload_on,payload_off,unit_of_meas, + 0, //set off_delay + Gateway_AnnouncementMsg, will_Message, true, subjectMQTTtoBTset //set,payload_avalaible,payload_not avalaible ,is a child device, command topic + ); # endif } diff --git a/main/main.ino b/main/main.ino index 0be59fc..90ad967 100644 --- a/main/main.ino +++ b/main/main.ino @@ -48,10 +48,14 @@ ReceivedSignal receivedSignal[struct_size] = {{0, 0}, {0, 0}, {0, 0}, {0, 0}}; unsigned long timer_sys_measures = 0; # define ARDUINOJSON_USE_LONG_LONG 1 #endif + #include #include #include +StaticJsonBuffer modulesBuffer; +JsonArray& modules = modulesBuffer.createArray(); + // Modules config inclusion #if defined(ZgatewayRF) || defined(ZgatewayRF2) || defined(ZgatewayPilight) # include "config_RF.h" @@ -592,81 +596,110 @@ void setup() { #ifdef ZsensorBME280 setupZsensorBME280(); + modules.add(ZsensorBME280); #endif #ifdef ZsensorHTU21 setupZsensorHTU21(); + modules.add(ZsensorHTU21); #endif #ifdef ZsensorAHTx0 setupZsensorAHTx0(); + modules.add(ZsensorAHTx0); #endif #ifdef ZsensorBH1750 setupZsensorBH1750(); + modules.add(ZsensorBH1750); #endif #ifdef ZsensorTSL2561 setupZsensorTSL2561(); + modules.add(ZsensorTSL2561); #endif #ifdef Zgateway2G setup2G(); + modules.add(Zgateway2G); #endif #ifdef ZgatewayIR setupIR(); + modules.add(ZgatewayIR); #endif #ifdef ZgatewayLORA setupLORA(); + modules.add(ZgatewayLORA); #endif #ifdef ZgatewayRF setupRF(); + modules.add(ZgatewayRF); #endif #ifdef ZgatewayRF2 setupRF2(); + modules.add(ZgatewayRF2); #endif #ifdef ZgatewayPilight setupPilight(); + modules.add(ZgatewayPilight); #endif #ifdef ZgatewayWeatherStation setupWeatherStation(); + modules.add(ZgatewayWeatherStation); #endif #ifdef ZgatewaySRFB setupSRFB(); + modules.add(ZgatewaySRFB); #endif #ifdef ZgatewayBT setupBT(); + modules.add(ZgatewayBT); #endif #ifdef ZgatewayRFM69 setupRFM69(); + modules.add(ZgatewayRFM69); #endif #ifdef ZsensorINA226 setupINA226(); + modules.add(ZsensorINA226); #endif #ifdef ZsensorHCSR501 setupHCSR501(); + modules.add(ZsensorHCSR501); #endif #ifdef ZsensorHCSR04 setupHCSR04(); + modules.add(ZsensorHCSR04); #endif #ifdef ZsensorGPIOInput setupGPIOInput(); + modules.add(ZsensorGPIOInput); #endif #ifdef ZsensorGPIOKeyCode setupGPIOKeyCode(); + modules.add(ZsensorGPIOKeyCode); #endif #ifdef ZactuatorFASTLED setupFASTLED(); + modules.add(ZactuatorFASTLED); #endif #ifdef ZactuatorPWM setupPWM(); + modules.add(ZactuatorPWM); #endif #ifdef ZsensorDS1820 setupZsensorDS1820(); + modules.add(ZsensorDS1820); #endif #ifdef ZsensorADC setupADC(); + modules.add(ZsensorADC); #endif #ifdef ZsensorDHT setupDHT(); + modules.add(ZsensorDHT); #endif #ifdef ZgatewayRS232 setupRS232(); + modules.add(ZgatewayRS232); +#endif +#ifdef ZmqttDiscovery + modules.add(ZmqttDiscovery); #endif Log.trace(F("mqtt_max_packet_size: %d" CR), mqtt_max_packet_size); Log.notice(F("Setup OpenMQTTGateway end" CR)); @@ -1337,94 +1370,14 @@ void stateMeasures() { SYSdata["mac"] = (char*)mac.c_str(); SYSdata["wifiprt"] = (int)wifiProtocol; # endif -# endif - String modules = ""; -# ifdef ZgatewayRF - modules = modules + ZgatewayRF; -# endif -# ifdef ZsensorBME280 - modules = modules + ZsensorBME280; -# endif -# ifdef ZsensorHTU21 - modules = modules + ZsensorHTU21; -# endif -# ifdef ZsensorAHTx0 - modules = modules + ZsensorAHTx0; -# endif -# ifdef ZsensorHCSR04 - modules = modules + ZsensorHCSR04; -# endif -# ifdef ZsensorBH1750 - modules = modules + ZsensorBH1750; -# endif -# ifdef ZsensorTSL2561 - modules = modules + ZsensorTSL2561; -# endif -# ifdef ZsensorDHT - modules = modules + ZsensorDHT; -# endif -# ifdef ZsensorDS1820 - modules = modules + ZsensorDS1820; -# endif -# ifdef ZactuatorONOFF - modules = modules + ZactuatorONOFF; -# endif -# ifdef Zgateway2G - modules = modules + Zgateway2G; -# endif -# ifdef ZgatewayIR - modules = modules + ZgatewayIR; -# endif -# ifdef ZgatewayLORA - modules = modules + ZgatewayLORA; -# endif -# ifdef ZgatewayRF2 - modules = modules + ZgatewayRF2; -# endif -# ifdef ZgatewayWeatherStation - modules = modules + ZgatewayWeatherStation; -# endif -# ifdef ZgatewayPilight - modules = modules + ZgatewayPilight; -# endif -# ifdef ZgatewaySRFB - modules = modules + ZgatewaySRFB; # endif # ifdef ZgatewayBT - modules = modules + ZgatewayBT; # ifdef ESP32 SYSdata["lowpowermode"] = (int)low_power_mode; # endif SYSdata["interval"] = BLEinterval; SYSdata["scanbcnct"] = BLEscanBeforeConnect; # endif -# ifdef ZgatewayRFM69 - modules = modules + ZgatewayRFM69; -# endif -# ifdef ZsensorINA226 - modules = modules + ZsensorINA226; -# endif -# ifdef ZsensorHCSR501 - modules = modules + ZsensorHCSR501; -# endif -# ifdef ZsensorGPIOInput - modules = modules + ZsensorGPIOInput; -# endif -# ifdef ZsensorGPIOKeyCode - modules = modules + ZsensorGPIOKeyCode; -# endif -# ifdef ZsensorGPIOKeyCode - modules = modules + ZsensorGPIOKeyCode; -# endif -# ifdef ZmqttDiscovery - modules = modules + ZmqttDiscovery; -# endif -# ifdef ZactuatorFASTLED - modules = modules + ZactuatorFASTLED; -# endif -# ifdef ZactuatorPWM - modules = modules + ZactuatorPWM; -# endif # ifdef ZboardM5STACK M5.Power.begin(); SYSdata["m5-batt-level"] = (int8_t)M5.Power.getBatteryLevel(); @@ -1444,10 +1397,7 @@ void stateMeasures() { SYSdata["m5-bat-chargecurrent"] = (float)M5.Axp.GetBatChargeCurrent(); SYSdata["m5-aps-voltage"] = (float)M5.Axp.GetAPSVoltage(); # endif -# ifdef ZGatewayRS232 - modules = modules + ZGatewayRS232; -# endif - SYSdata["modules"] = modules; + SYSdata.set("modules", modules); pub(subjectSYStoMQTT, SYSdata); } #endif