Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[MQTT] (Auto)Discovery implementation #5199

Open
wants to merge 35 commits into
base: mega
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
3656475
[MQTT] (Auto)Discovery implementation
tonhuisman Dec 30, 2024
6fdf84c
[P052] Add MQTT Discovery data for supported Values
tonhuisman Dec 30, 2024
7be7b81
[Source] Fix CR/LF vs LF
tonhuisman Dec 30, 2024
a9ddd65
Merge branch 'mega' of https://github.com/letscontrolit/ESPEasy into …
tonhuisman Jan 1, 2025
834b2d7
Merge branch 'mega' of https://github.com/letscontrolit/ESPEasy into …
tonhuisman Jan 9, 2025
d14b111
Merge branch 'mega' of https://github.com/letscontrolit/ESPEasy into …
tonhuisman Jan 10, 2025
e4b0e4e
[MQTT] Add support for more VTypes, implement more VTypes, small impr…
tonhuisman Jan 10, 2025
5240af6
Merge branch 'mega' of https://github.com/letscontrolit/ESPEasy into …
tonhuisman Jan 12, 2025
3666157
[MQTT] Move TaskValue VType Discovery to each plugin where needed. So…
tonhuisman Jan 12, 2025
89381f2
Merge branch 'mega' of https://github.com/letscontrolit/ESPEasy into …
tonhuisman Jan 12, 2025
c06a29b
[P105] Fix Uncrustify formatting
tonhuisman Jan 12, 2025
0bed31b
Merge branch 'mega' of https://github.com/letscontrolit/ESPEasy into …
tonhuisman Jan 16, 2025
49bf984
[P164] Add fixme for currently unsupported AQI Discovery value
tonhuisman Jan 16, 2025
738159b
Merge branch 'mega' of https://github.com/letscontrolit/ESPEasy into …
tonhuisman Jan 16, 2025
01daf16
[Discovery] Add VType for Reactive Power
tonhuisman Jan 16, 2025
e143e5f
[Discovery] Implement VType for Reactive Power
tonhuisman Jan 16, 2025
19513a8
[P076] Implement Discovery support (for user-selected values)
tonhuisman Jan 16, 2025
0d4344d
[P077] Implement Discovery support (for user-selected values)
tonhuisman Jan 16, 2025
11b8c2e
Merge branch 'mega' of https://github.com/letscontrolit/ESPEasy into …
tonhuisman Jan 17, 2025
4fe9219
Merge branch 'mega' of https://github.com/letscontrolit/ESPEasy into …
tonhuisman Jan 17, 2025
51621ec
[P078] Implement Discovery support (for user-selected values)
tonhuisman Jan 17, 2025
bbf4246
[P085] Implement Discovery support (for user-selected values)
tonhuisman Jan 17, 2025
865852a
[P102] Implement Discovery support (for user-selected values)
tonhuisman Jan 17, 2025
fa3afec
[P108] Implement Discovery support (for user-selected values)
tonhuisman Jan 17, 2025
f060c3d
[P115] Implement Discovery support (for user-selected values)
tonhuisman Jan 18, 2025
9754ae9
[P132] Implement Discovery support (for user-selected values)
tonhuisman Jan 18, 2025
243b271
[P142] Implement Discovery support (for user-selected values)
tonhuisman Jan 18, 2025
d5b8298
[Discovery] Refactor getting VType per plugin, add some more plugins …
tonhuisman Jan 18, 2025
9ac80ed
Merge branch 'mega' of https://github.com/letscontrolit/ESPEasy into …
tonhuisman Jan 22, 2025
8c6ea9f
[Discovery] Add support for some more VTypes, add AQI and NOx
tonhuisman Jan 23, 2025
4fedeef
[P147] Implement MQTT Discovery support
tonhuisman Jan 23, 2025
d447566
[P164] Update MQTT Discovery support
tonhuisman Jan 23, 2025
29d9453
Merge branch 'mega' of https://github.com/letscontrolit/ESPEasy into …
tonhuisman Feb 3, 2025
a6cd05f
Merge branch 'mega' of https://github.com/letscontrolit/ESPEasy into …
tonhuisman Feb 4, 2025
c0fcf9f
Merge branch 'mega' into feature/MQTT-discovery
tonhuisman Feb 8, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 84 additions & 4 deletions src/_C005.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@

# include "src/Commands/ExecuteCommand.h"
# include "src/Globals/EventQueue.h"
# if FEATURE_MQTT_DISCOVER
# include "src/Globals/MQTT.h"
# endif // if FEATURE_MQTT_DISCOVER
# include "src/Helpers/_CPlugin_Helper_mqtt.h"
# include "src/Helpers/PeriodicalActions.h"
# include "src/Helpers/StringParser.h"
Expand All @@ -13,6 +16,9 @@
// #######################################################################################################

/** Changelog:
* 2024-11-29 tonhuisman: Add Discovery trigger setting
* 2024-11-11 tonhuisman: Add AutoDiscovery options
* Home Assistant suggested discovery topic: "homeassistant/%devclass%/%sysname%/%tskname%"
* 2023-08-18 tonhuisman: Clean up source for pull request
* 2023-03-15 tonhuisman: Add processing of topic endpoint /set to issue a TaskValueSet,taskname,taskvalue,payload command for
* topic %sysname%/#/taskname/valuename/set
Expand Down Expand Up @@ -46,9 +52,12 @@ bool CPlugin_005(CPlugin::Function function, struct EventStruct *event, String&
proto.usesExtCreds = true;
proto.defaultPort = 1883;
proto.usesID = false;
#if FEATURE_MQTT_TLS
proto.usesTLS = true;
#endif
# if FEATURE_MQTT_TLS
proto.usesTLS = true;
# endif // if FEATURE_MQTT_TLS
# if FEATURE_MQTT_DISCOVER
proto.mqttAutoDiscover = true;
# endif // if FEATURE_MQTT_DISCOVER
break;
}

Expand All @@ -61,8 +70,51 @@ bool CPlugin_005(CPlugin::Function function, struct EventStruct *event, String&
case CPlugin::Function::CPLUGIN_INIT:
{
success = init_mqtt_delay_queue(event->ControllerIndex, CPlugin_005_pubname, CPlugin_005_mqtt_retainFlag);
# if FEATURE_MQTT_DISCOVER
mqttDiscoveryController = INVALID_CONTROLLER_INDEX;

if (success) {
MakeControllerSettings(ControllerSettings); // -V522

if (!AllocatedControllerSettings()) {
return false;
}
LoadControllerSettings(event->ControllerIndex, *ControllerSettings);

if (ControllerSettings->mqtt_autoDiscovery() &&

// (ControllerSettings->MqttAutoDiscoveryTrigger[0] != 0) &&
(ControllerSettings->MqttAutoDiscoveryTopic[0] != 0)) {
mqttDiscoveryController = event->ControllerIndex;
mqttDiscoveryTimeout = random(10, 100);

if (loglevelActiveFor(LOG_LEVEL_INFO)) {
addLog(LOG_LEVEL_INFO, strformat(F("C005 : INIT: AutoDiscovery for Controller %d in %.1f sec."),
event->ControllerIndex + 1,
mqttDiscoveryTimeout / 10.0f));
}
}
}
# endif // if FEATURE_MQTT_DISCOVER
break;
}

# if FEATURE_MQTT_DISCOVER
case CPlugin::Function::CPLUGIN_TEN_PER_SECOND:
{
if ((mqttDiscoveryTimeout > 0) && MQTTclient_connected) {
mqttDiscoveryTimeout--;

if (0 == mqttDiscoveryTimeout) {
if (loglevelActiveFor(LOG_LEVEL_INFO)) {
addLog(LOG_LEVEL_INFO, F("C005 : AutoDiscovery delay expired, starting now..."));
}
success = MQTT_SendAutoDiscovery(event->ControllerIndex, CPLUGIN_ID_005);
}
}
break;
}
# endif // if FEATURE_MQTT_DISCOVER

case CPlugin::Function::CPLUGIN_EXIT:
{
Expand All @@ -82,7 +134,35 @@ bool CPlugin_005(CPlugin::Function function, struct EventStruct *event, String&
controllerIndex_t ControllerID = findFirstEnabledControllerWithId(CPLUGIN_ID_005);

if (validControllerIndex(ControllerID)) {
C005_parse_command(event);
# if FEATURE_MQTT_DISCOVER
MakeControllerSettings(ControllerSettings); // -V522

if (!AllocatedControllerSettings()) {
return false;
}
LoadControllerSettings(event->ControllerIndex, *ControllerSettings);

// AutoDiscovery enabled?
if (ControllerSettings->mqtt_autoDiscovery()
&& (ControllerSettings->MqttAutoDiscoveryTrigger[0] != '\0')
&& event->String1.equals(ControllerSettings->MqttAutoDiscoveryTrigger)
&& event->String2.equals(F("online")) // FIXME Should be configurable?
) {
// We have received the Discovery request topic
// Generate random time-offset in 0.1 sec, range 1..10 seconds
mqttDiscoveryTimeout = random(10, 100);

if (loglevelActiveFor(LOG_LEVEL_INFO)) {
addLog(LOG_LEVEL_INFO, strformat(F("C005 : Request for AutoDiscovery received. %.1f sec."),
mqttDiscoveryTimeout / 10.0f));
}

// FIXME Generate event when request received?
} else
# endif // if FEATURE_MQTT_DISCOVER
{
C005_parse_command(event);
}
}
break;
}
Expand Down
15 changes: 15 additions & 0 deletions src/_P002_ADC.ino
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@
// #################################### Plugin 002: Analog ###############################################
// #######################################################################################################

/** Changelog:
* 2025-01-12 tonhuisman: Add support for MQTT AutoDiscovery
*/

# define PLUGIN_002
# define PLUGIN_ID_002 2
# define PLUGIN_NAME_002 "Analog input - internal"
Expand Down Expand Up @@ -48,6 +52,17 @@ boolean Plugin_002(uint8_t function, struct EventStruct *event, String& string)
break;
}

# if FEATURE_MQTT_DISCOVER
case PLUGIN_GET_DISCOVERY_VTYPES:
{
for (uint8_t i = 0; i < event->Par5; ++i) {
event->ParN[i] = static_cast<int>(Sensor_VType::SENSOR_TYPE_ANALOG_ONLY);
}
success = true;
break;
}
# endif // if FEATURE_MQTT_DISCOVER

case PLUGIN_WEBFORM_LOAD:
{
P002_data_struct *P002_data =
Expand Down
10 changes: 10 additions & 0 deletions src/_P003_Pulse.ino
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
// tolerate less good signals. After a pulse and debounce time it verifies the signal 3 times.

/** Changelog:
* 2025-01-12 tonhuisman: Add support for MQTT AutoDiscovery (not supported yet for Pulse Counters)
* 2024-08-12 tonhuisman: Improved handling of 'Ignore multiple Delta = 0' by peeking the Delta value.
* 2024-08-10 tonhuisman: Changed option to 'Ignore multiple Delta = 0', and allow Interval = 0, combined with Delta = 0, to send a pulse
* immediately to the Controllers and generate events.
Expand Down Expand Up @@ -144,6 +145,15 @@ boolean Plugin_003(uint8_t function, struct EventStruct *event, String& string)
break;
}

# if FEATURE_MQTT_DISCOVER
case PLUGIN_GET_DISCOVERY_VTYPES:
{
event->Par1 = static_cast<int>(Sensor_VType::SENSOR_TYPE_NONE); // Not yet supported
success = true;
break;
}
# endif // if FEATURE_MQTT_DISCOVER

case PLUGIN_WEBFORM_LOAD:
{
addFormNumericBox(F("Debounce Time"), F("debounce")
Expand Down
12 changes: 12 additions & 0 deletions src/_P004_Dallas.ino
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
// Maxim Integrated (ex Dallas) DS18B20 datasheet : https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf

/** Changelog:
* 2025-01-12 tonhuisman: Add support for MQTT AutoDiscovery
* 2024-05-11 tonhuisman: Add Get Config Value support for sensor statistics: Read success, Read retry, Read failed,
* Read init failed, Resolution and Address (formatted)
* [<taskname>#sensorstats,<sensorindex>,success|retry|failed|initfailed|resolution|address]
Expand Down Expand Up @@ -92,6 +93,17 @@ boolean Plugin_004(uint8_t function, struct EventStruct *event, String& string)
break;
}

# if FEATURE_MQTT_DISCOVER
case PLUGIN_GET_DISCOVERY_VTYPES:
{
for (uint8_t i = 0; i < event->Par5; ++i) {
event->ParN[i] = static_cast<int>(Sensor_VType::SENSOR_TYPE_TEMP_ONLY);
}
success = true;
break;
}
# endif // if FEATURE_MQTT_DISCOVER

case PLUGIN_SET_DEFAULTS:
{
PCONFIG(P004_SENSOR_TYPE_INDEX) = static_cast<uint8_t>(Sensor_VType::SENSOR_TYPE_SINGLE);
Expand Down
12 changes: 12 additions & 0 deletions src/_P007_PCF8591.ino
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
// #######################################################################################################

/** Changelog:
* 2025-01-12 tonhuisman: Add support for MQTT AutoDiscovery
* 2023-11-24 tonhuisman: Add Device flag for I2CMax100kHz as this sensor won't work at 400 kHz
* 2022-05-08 tonhuisman: Use ESPEasy core I2C functions where possible
* Add support for use of the Analog output pin and 'analogout,<value>' command
Expand Down Expand Up @@ -79,6 +80,17 @@ boolean Plugin_007(uint8_t function, struct EventStruct *event, String& string)
break;
}

# if FEATURE_MQTT_DISCOVER
case PLUGIN_GET_DISCOVERY_VTYPES:
{
for (uint8_t i = 0; i < event->Par5; ++i) {
event->ParN[i] = static_cast<int>(Sensor_VType::SENSOR_TYPE_ANALOG_ONLY);
}
success = true;
break;
}
# endif // if FEATURE_MQTT_DISCOVER

case PLUGIN_SET_DEFAULTS:
{
PCONFIG(P007_SENSOR_TYPE_INDEX) = static_cast<uint8_t>(Sensor_VType::SENSOR_TYPE_SINGLE);
Expand Down
10 changes: 10 additions & 0 deletions src/_P008_RFID.ino
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

/*
History:
2025-01-12 tonhuisman: Add support for MQTT AutoDiscovery (not supported yet for RFID)
2023-01-22 tonhuisman: Disable some strings in BUILD_NO_DEBUG builds to reduce size, minor optimizations
2022-12-04 tonhuisman: Fix initialization issue (hanginging ESP...) when GPIO pins are not configured correctly
2022-12-03 tonhuisman: Add Get Config values for tag value and bits received
Expand Down Expand Up @@ -75,6 +76,15 @@ boolean Plugin_008(uint8_t function, struct EventStruct *event, String& string)
break;
}

# if FEATURE_MQTT_DISCOVER
case PLUGIN_GET_DISCOVERY_VTYPES:
{
event->Par1 = static_cast<int>(Sensor_VType::SENSOR_TYPE_NONE); // Not yet supported
success = true;
break;
}
# endif // if FEATURE_MQTT_DISCOVER

case PLUGIN_SET_DEFAULTS:
{
P008_DATA_BITS = 26; // Minimal nr. of bits
Expand Down
14 changes: 14 additions & 0 deletions src/_P010_BH1750.ino
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
// #################################### Plugin-010: LuxRead ############################################
// #######################################################################################################

/** Changelog:
* 2025-01-12 tonhuisman: Add support for MQTT AutoDiscovery
*/

# include <AS_BH1750.h>

Expand Down Expand Up @@ -47,6 +50,17 @@ boolean Plugin_010(uint8_t function, struct EventStruct *event, String& string)
break;
}

# if FEATURE_MQTT_DISCOVER
case PLUGIN_GET_DISCOVERY_VTYPES:
{
for (uint8_t i = 0; i < event->Par5; ++i) {
event->ParN[i] = static_cast<int>(Sensor_VType::SENSOR_TYPE_LUX_ONLY);
}
success = true;
break;
}
# endif // if FEATURE_MQTT_DISCOVER

case PLUGIN_I2C_HAS_ADDRESS:
case PLUGIN_WEBFORM_SHOW_I2C_PARAMS:
{
Expand Down
10 changes: 10 additions & 0 deletions src/_P011_PME.ino
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
// #######################################################################################################

/** Changelog:
* 2025-01-12 tonhuisman: Add support for MQTT AutoDiscovery (not supported for PME)
* 2024-04-14 tonhuisman: Add support for Get Config Values, to obtain a port state/value without instantiating a task for each pin.
* Only a single, enabled, task is required to handle the Get Config Values.
* Variables: [<TaskName>#D<port>] and [<TaskName>#A,<port>]
Expand Down Expand Up @@ -64,6 +65,15 @@ boolean Plugin_011(uint8_t function, struct EventStruct *event, String& string)
break;
}

# if FEATURE_MQTT_DISCOVER
case PLUGIN_GET_DISCOVERY_VTYPES:
{
event->Par1 = static_cast<int>(Sensor_VType::SENSOR_TYPE_NONE); // Not yet supported
success = true;
break;
}
# endif // if FEATURE_MQTT_DISCOVER

case PLUGIN_I2C_HAS_ADDRESS:
{
success = (event->Par1 == PLUGIN_011_I2C_ADDRESS);
Expand Down
11 changes: 11 additions & 0 deletions src/_P013_HCSR04.ino
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
// #######################################################################################################

/** Changelog:
* 2025-01-12 tonhuisman: Add support for MQTT AutoDiscovery
* 2023-02-25 tonhuisman: Make Interval optional, and also disable the added feature P013_FEATURE_INTERVALEVENT, as setting Interval
* to 0 is effectively the same. (Small code reduction)
* Changed second value label for Combined mode to State
Expand Down Expand Up @@ -101,6 +102,16 @@ boolean Plugin_013(uint8_t function, struct EventStruct *even
}
# endif // if P013_FEATURE_COMBINED_MODE

# if FEATURE_MQTT_DISCOVER
case PLUGIN_GET_DISCOVERY_VTYPES:
{
event->Par1 = static_cast<int>(Sensor_VType::SENSOR_TYPE_DISTANCE_ONLY);
event->Par2 = static_cast<int>(Sensor_VType::SENSOR_TYPE_SWITCH);
success = true;
break;
}
# endif // if FEATURE_MQTT_DISCOVER

case PLUGIN_SET_DEFAULTS:
{
P013_FILTER_SIZE = P013_DEFAULT_FILTER_SIZE;
Expand Down
23 changes: 19 additions & 4 deletions src/_P014_SI70xx.ino
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,15 @@
// #######################################################################################################
// ######################## Plugin 014 SI70xx I2C Temperature Humidity Sensor ###########################
// #######################################################################################################
// 2015-10-12 Charles-Henri Hallard, see my projects and blog at https://hallard.me
// 2022-07-22 MFD, Adding support for SI7013 with ADC and lots of refactoring
// 2023-07-11 tonhuisman, Add missing PLUGIN_SET_DEFAULTS handling, to set default Temperature/Humidity output values
// Use internationally usable dates for changelog

/** Changelog:
* 2025-01-12 tonhuisman: Add support for MQTT AutoDiscovery
* Update changelog
* 2023-07-11 tonhuisman, Add missing PLUGIN_SET_DEFAULTS handling, to set default Temperature/Humidity output values
* Use internationally usable dates for changelog
* 2022-07-22 MFD, Adding support for SI7013 with ADC and lots of refactoring
* 2015-10-12 Charles-Henri Hallard, see my projects and blog at https://hallard.me
*/


/*
Expand Down Expand Up @@ -72,6 +77,16 @@ boolean Plugin_014(uint8_t function, struct EventStruct *event, String& string)
break;
}

# if FEATURE_MQTT_DISCOVER
case PLUGIN_GET_DISCOVERY_VTYPES:
{
event->Par1 = static_cast<int>(Sensor_VType::SENSOR_TYPE_TEMP_HUM);
event->Par2 = static_cast<int>(Sensor_VType::SENSOR_TYPE_ANALOG_ONLY);
success = true;
break;
}
# endif // if FEATURE_MQTT_DISCOVER

case PLUGIN_SET_DEFAULTS:
{
P014_VALUES_COUNT = getValueCountFromSensorType(Sensor_VType::SENSOR_TYPE_TEMP_HUM);
Expand Down
14 changes: 14 additions & 0 deletions src/_P015_TSL2561.ino
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
// this plugin is based on the sparkfun library
// written based on version 1.1.0 from https://github.com/sparkfun/SparkFun_TSL2561_Arduino_Library

/** Changelog:
* 2025-01-12 tonhuisman: Add support for MQTT AutoDiscovery (not supported yet for Pulse Counters)
*/

# include "src/PluginStructs/P015_data_struct.h"

Expand Down Expand Up @@ -63,6 +66,17 @@ boolean Plugin_015(uint8_t function, struct EventStruct *event, String& string)
break;
}

# if FEATURE_MQTT_DISCOVER
case PLUGIN_GET_DISCOVERY_VTYPES:
{
event->Par1 = static_cast<int>(Sensor_VType::SENSOR_TYPE_LUX_ONLY);
event->Par2 = static_cast<int>(Sensor_VType::SENSOR_TYPE_IR_ONLY);
event->Par3 = static_cast<int>(Sensor_VType::SENSOR_TYPE_LUX_ONLY);
success = true;
break;
}
# endif // if FEATURE_MQTT_DISCOVER

case PLUGIN_I2C_HAS_ADDRESS:
case PLUGIN_WEBFORM_SHOW_I2C_PARAMS:
{
Expand Down
Loading