From 1ccac05b43f71d72901b892218e7a3f5460d9825 Mon Sep 17 00:00:00 2001 From: Theo Arends Date: Sun, 1 Apr 2018 21:37:00 +0200 Subject: [PATCH] Add Domoticz Battery and RSSI Quality 5.12.0i * Add Domoticz Battery and RSSI Quality (#1604) --- sonoff/_releasenotes.ino | 1 + sonoff/xdrv_05_domoticz.ino | 40 ++++++++++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/sonoff/_releasenotes.ino b/sonoff/_releasenotes.ino index 1de743336..2c5c80c70 100644 --- a/sonoff/_releasenotes.ino +++ b/sonoff/_releasenotes.ino @@ -2,6 +2,7 @@ * Add 16 timers using commands Timer and Timers (#1091) * Add commands Timer 0 to clear timer and Timer 1..16 to copy timer * Add optional Timer configuration webpage to be enabled in user_config.h with define USE_TIMERS_WEB + * Add Domoticz Battery and RSSI Quality (#1604) * Add Home Assistant MQTT Discovery for Buttons and change SetOption19 response (#2277) * Add support for SGP30 gas and air quality sensor (#2307) * Add multiple color entry support for command Led like Led2 120000 001200 000012 setting led2 as Red, Led3 as Green and Led4 as Blue (#2303) diff --git a/sonoff/xdrv_05_domoticz.ino b/sonoff/xdrv_05_domoticz.ino index 5aa6a7c43..ea2b39319 100644 --- a/sonoff/xdrv_05_domoticz.ino +++ b/sonoff/xdrv_05_domoticz.ino @@ -35,6 +35,8 @@ const char HTTP_FORM_DOMOTICZ_TIMER[] PROGMEM = "" D_DOMOTICZ_UPDATE_TIMER " (" STR(DOMOTICZ_UPDATE_TIMER) ")"; #endif // USE_WEBSERVER +const char DOMOTICZ_MESSAGE[] PROGMEM = "{\"idx\":%d,\"nvalue\":%d,\"svalue\":\"%s\",\"Battery\":%d,\"RSSI\":%d}"; + enum DomoticzCommands { CMND_IDX, CMND_KEYIDX, CMND_SWITCHIDX, CMND_SENSORIDX, CMND_UPDATETIMER }; const char kDomoticzCommands[] PROGMEM = D_CMND_IDX "|" D_CMND_KEYIDX "|" D_CMND_SWITCHIDX "|" D_CMND_SENSORIDX "|" D_CMND_UPDATETIMER ; @@ -57,6 +59,32 @@ boolean domoticz_subscribe = false; int domoticz_update_timer = 0; byte domoticz_update_flag = 1; +int DomoticzBatteryQuality() +{ + // Battery 0%: ESP 2.6V (minimum operating voltage is 2.5) + // Battery 100%: ESP 3.6V (maximum operating voltage is 3.6) + // Battery 101% to 200%: ESP over 3.6V (means over maximum operating voltage) + + int quality = 0; // Voltage range from 2,6V > 0% to 3,6V > 100% + + uint16_t voltage = ESP.getVcc(); + if (voltage <= 2600) { + quality = 0; + } else if (voltage >= 4600) { + quality = 200; + } else { + quality = (voltage - 2600) / 10; + } + return quality; +} + +int DomoticzRssiQuality() +{ + // RSSI range: 0% to 10% (12 means disable RSSI in Domoticz) + + return WifiGetRssiAsQuality(WiFi.RSSI()) / 10; +} + void MqttPublishDomoticzPowerState(byte device) { char sdimmer[8]; @@ -66,8 +94,8 @@ void MqttPublishDomoticzPowerState(byte device) } if (Settings.flag.mqtt_enabled && Settings.domoticz_relay_idx[device -1]) { snprintf_P(sdimmer, sizeof(sdimmer), PSTR("%d"), Settings.light_dimmer); - snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"idx\":%d,\"nvalue\":%d,\"svalue\":\"%s\"}"), - Settings.domoticz_relay_idx[device -1], (power & (1 << (device -1))) ? 1 : 0, (light_type) ? sdimmer : ""); + snprintf_P(mqtt_data, sizeof(mqtt_data), DOMOTICZ_MESSAGE, + Settings.domoticz_relay_idx[device -1], (power & (1 << (device -1))) ? 1 : 0, (light_type) ? sdimmer : "", DomoticzBatteryQuality(), DomoticzRssiQuality()); MqttPublish(domoticz_in_topic); } } @@ -275,13 +303,15 @@ uint8_t DomoticzHumidityState(char *hum) void DomoticzSensor(byte idx, char *data) { if (Settings.domoticz_sensor_idx[idx]) { - char dmess[64]; + char dmess[90]; memcpy(dmess, mqtt_data, sizeof(dmess)); if (DZ_AIRQUALITY == idx) { - snprintf_P(mqtt_data, sizeof(dmess), PSTR("{\"idx\":%d,\"nvalue\":%s}"), Settings.domoticz_sensor_idx[idx], data); + snprintf_P(mqtt_data, sizeof(dmess), PSTR("{\"idx\":%d,\"nvalue\":%s,\"Battery\":%d,\"RSSI\":%d}"), + Settings.domoticz_sensor_idx[idx], data, DomoticzBatteryQuality(), DomoticzRssiQuality()); } else { - snprintf_P(mqtt_data, sizeof(dmess), PSTR("{\"idx\":%d,\"nvalue\":0,\"svalue\":\"%s\"}"), Settings.domoticz_sensor_idx[idx], data); + snprintf_P(mqtt_data, sizeof(dmess), DOMOTICZ_MESSAGE, + Settings.domoticz_sensor_idx[idx], 0, data, DomoticzBatteryQuality(), DomoticzRssiQuality()); } MqttPublish(domoticz_in_topic); memcpy(mqtt_data, dmess, sizeof(dmess));