Merge branch 'master' into publish-additional-states

This commit is contained in:
iranl
2024-02-17 11:45:48 +01:00
committed by GitHub
4 changed files with 136 additions and 82 deletions

View File

@@ -1205,6 +1205,13 @@ void Network::publishHASSConfigRingDetect(char *deviceType, const char *baseTopi
"", "",
{{"pl_on", "ring"}, {{"pl_on", "ring"},
{"pl_off", "locked"}}); {"pl_off", "locked"}});
DynamicJsonDocument json(_bufferSize);
json = createHassJson(uidString, "_ring_event", "Ring", name, baseTopic, String("~") + mqtt_topic_lock_state, deviceType, "doorbell", "", "", "", {{"value_template", "{ \"event_type\": \"{{ value }}\" }"}});
json["event_types"][0] = "ring";
serializeJson(json, _buffer, _bufferSize);
String path = createHassTopicPath("event", "ring", uidString);
_device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, _buffer);
} }
} }
@@ -1341,7 +1348,7 @@ void Network::publishHASSBleRssiConfig(char *deviceType, const char *baseTopic,
} }
void Network::publishHassTopic(const String& mqttDeviceType, void Network::publishHassTopic(const String& mqttDeviceType,
const String& mattDeviceName, const String& mqttDeviceName,
const String& uidString, const String& uidString,
const String& uidStringPostfix, const String& uidStringPostfix,
const String& displayName, const String& displayName,
@@ -1361,90 +1368,35 @@ void Network::publishHassTopic(const String& mqttDeviceType,
if (discoveryTopic != "") if (discoveryTopic != "")
{ {
DynamicJsonDocument json(_bufferSize); DynamicJsonDocument json(_bufferSize);
json = createHassJson(uidString, uidStringPostfix, displayName, name, baseTopic, stateTopic, deviceType, deviceClass, stateClass, entityCat, commandTopic, additionalEntries);
// Battery level
json.clear();
auto dev = json.createNestedObject("dev");
auto ids = dev.createNestedArray("ids");
ids.add(String("nuki_") + uidString);
json["dev"]["mf"] = "Nuki";
json["dev"]["mdl"] = deviceType;
json["dev"]["name"] = name;
json["~"] = baseTopic;
json["name"] = displayName;
json["unique_id"] = String(uidString) + uidStringPostfix;
if(deviceClass != "")
{
json["dev_cla"] = deviceClass;
}
if(stateTopic != "")
{
json["stat_t"] = stateTopic;
}
if(stateClass != "")
{
json["stat_cla"] = stateClass;
}
if(entityCat != "")
{
json["ent_cat"] = entityCat;
}
if(commandTopic != "")
{
json["cmd_t"] = commandTopic;
}
json["avty"]["t"] = _lockPath + mqtt_topic_mqtt_connection_state;
for(const auto& entry : additionalEntries)
{
if(strcmp(entry.second, "true") == 0)
{
json[entry.first] = true;
}
else if(strcmp(entry.second, "false") == 0)
{
json[entry.first] = false;
}
else
{
json[entry.first] = entry.second;
}
}
serializeJson(json, _buffer, _bufferSize); serializeJson(json, _buffer, _bufferSize);
String path = createHassTopicPath(mqttDeviceType, mqttDeviceName, uidString);
String path = discoveryTopic;
path.concat("/");
path.concat(mqttDeviceType);
path.concat("/");
path.concat(uidString);
path.concat("/");
path.concat(mattDeviceName);
path.concat("/config");
_device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, _buffer); _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, _buffer);
} }
} }
String Network::createHassTopicPath(const String& mqttDeviceType, const String& mqttDeviceName, const String& uidString)
{
String discoveryTopic = _preferences->getString(preference_mqtt_hass_discovery);
String path = discoveryTopic;
path.concat("/");
path.concat(mqttDeviceType);
path.concat("/");
path.concat(uidString);
path.concat("/");
path.concat(mqttDeviceName);
path.concat("/config");
void Network::removeHassTopic(const String& mqttDeviceType, const String& mattDeviceName, const String& uidString) return path;
}
void Network::removeHassTopic(const String& mqttDeviceType, const String& mqttDeviceName, const String& uidString)
{ {
String discoveryTopic = _preferences->getString(preference_mqtt_hass_discovery); String discoveryTopic = _preferences->getString(preference_mqtt_hass_discovery);
if (discoveryTopic != "") if (discoveryTopic != "")
{ {
String path = discoveryTopic; String path = createHassTopicPath(mqttDeviceType, mqttDeviceName, uidString);
path.concat("/");
path.concat(mqttDeviceType);
path.concat("/");
path.concat(uidString);
path.concat("/");
path.concat(mattDeviceName);
path.concat("/config");
_device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, ""); _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, "");
} }
} }
@@ -1492,6 +1444,79 @@ void Network::removeHASSConfigTopic(char *deviceType, char *name, char *uidStrin
removeHassTopic(deviceType, name, uidString); removeHassTopic(deviceType, name, uidString);
} }
DynamicJsonDocument Network::createHassJson(const String& uidString,
const String& uidStringPostfix,
const String& displayName,
const String& name,
const String& baseTopic,
const String& stateTopic,
const String& deviceType,
const String& deviceClass,
const String& stateClass,
const String& entityCat,
const String& commandTopic,
std::vector<std::pair<char*, char*>> additionalEntries
)
{
DynamicJsonDocument json(_bufferSize);
json.clear();
auto dev = json.createNestedObject("dev");
auto ids = dev.createNestedArray("ids");
ids.add(String("nuki_") + uidString);
json["dev"]["mf"] = "Nuki";
json["dev"]["mdl"] = deviceType;
json["dev"]["name"] = name;
json["~"] = baseTopic;
json["name"] = displayName;
json["unique_id"] = String(uidString) + uidStringPostfix;
if(deviceClass != "")
{
json["dev_cla"] = deviceClass;
}
if(stateTopic != "")
{
json["stat_t"] = stateTopic;
}
if(stateClass != "")
{
json["stat_cla"] = stateClass;
}
if(entityCat != "")
{
json["ent_cat"] = entityCat;
}
if(commandTopic != "")
{
json["cmd_t"] = commandTopic;
}
json["avty"]["t"] = _lockPath + mqtt_topic_mqtt_connection_state;
for(const auto& entry : additionalEntries)
{
if(strcmp(entry.second, "true") == 0)
{
json[entry.first] = true;
}
else if(strcmp(entry.second, "false") == 0)
{
json[entry.first] = false;
}
else
{
json[entry.first] = entry.second;
}
}
return json;
}
void Network::publishPresenceDetection(char *csv) void Network::publishPresenceDetection(char *csv)
{ {
_presenceCsv = csv; _presenceCsv = csv;

View File

@@ -8,6 +8,7 @@
#include "networkDevices/IPConfiguration.h" #include "networkDevices/IPConfiguration.h"
#include "MqttTopics.h" #include "MqttTopics.h"
#include "Gpio.h" #include "Gpio.h"
#include <ArduinoJson.h>
#include <HTTPClient.h> #include <HTTPClient.h>
enum class NetworkDeviceType enum class NetworkDeviceType
@@ -86,7 +87,7 @@ private:
bool reconnect(); bool reconnect();
void publishHassTopic(const String& mqttDeviceType, void publishHassTopic(const String& mqttDeviceType,
const String& mattDeviceName, const String& mqttDeviceName,
const String& uidString, const String& uidString,
const String& uidStringPostfix, const String& uidStringPostfix,
const String& displayName, const String& displayName,
@@ -101,7 +102,21 @@ private:
std::vector<std::pair<char*, char*>> additionalEntries = {} std::vector<std::pair<char*, char*>> additionalEntries = {}
); );
void removeHassTopic(const String& mqttDeviceType, const String& mattDeviceName, const String& uidString); String createHassTopicPath(const String& mqttDeviceType, const String& mqttDeviceName, const String& uidString);
void removeHassTopic(const String& mqttDeviceType, const String& mqttDeviceName, const String& uidString);
DynamicJsonDocument createHassJson(const String& uidString,
const String& uidStringPostfix,
const String& displayName,
const String& name,
const String& baseTopic,
const String& stateTopic,
const String& deviceType,
const String& deviceClass,
const String& stateClass = "",
const String& entityCat = "",
const String& commandTopic = "",
std::vector<std::pair<char*, char*>> additionalEntries = {}
);
void onMqttConnect(const bool& sessionPresent); void onMqttConnect(const bool& sessionPresent);
void onMqttDisconnect(const espMqttClientTypes::DisconnectReason& reason); void onMqttDisconnect(const espMqttClientTypes::DisconnectReason& reason);

View File

@@ -3,6 +3,7 @@
#include <vector> #include <vector>
#define preference_started_before "run" #define preference_started_before "run"
#define preference_config_version "confVersion"
#define preference_device_id_lock "deviceId" #define preference_device_id_lock "deviceId"
#define preference_device_id_opener "deviceIdOp" #define preference_device_id_opener "deviceIdOp"
#define preference_mqtt_broker "mqttbroker" #define preference_mqtt_broker "mqttbroker"
@@ -63,10 +64,8 @@ class DebugPreferences
private: private:
std::vector<char*> _keys = std::vector<char*> _keys =
{ {
preference_started_before, preference_device_id_lock, preference_device_id_opener, preference_mqtt_broker, preference_mqtt_broker_port, preference_started_before, preference_config_version, preference_device_id_lock, preference_device_id_opener, preference_mqtt_broker,
preference_mqtt_user, preference_mqtt_password, preference_mqtt_log_enabled, preference_lock_enabled, preference_mqtt_broker_port, preference_mqtt_user, preference_mqtt_password, preference_mqtt_log_enabled, preference_check_updates, preference_lock_enabled,
preference_mqtt_lock_path, preference_opener_enabled, preference_opener_continuous_mode, preference_mqtt_opener_path,
preference_mqtt_user, preference_mqtt_password, preference_mqtt_log_enabled, preference_check_updates, preference_lock_enabled,
preference_mqtt_lock_path, preference_opener_enabled, preference_opener_continuous_mode, preference_mqtt_opener_path, preference_mqtt_lock_path, preference_opener_enabled, preference_opener_continuous_mode, preference_mqtt_opener_path,
preference_lock_max_keypad_code_count, preference_opener_max_keypad_code_count, preference_mqtt_ca, preference_lock_max_keypad_code_count, preference_opener_max_keypad_code_count, preference_mqtt_ca,
preference_mqtt_crt, preference_mqtt_key, preference_mqtt_hass_discovery, preference_mqtt_hass_cu_url, preference_mqtt_crt, preference_mqtt_key, preference_mqtt_hass_discovery, preference_mqtt_hass_cu_url,

View File

@@ -147,6 +147,21 @@ bool initPreferences()
preferences->putBool(preference_started_before, true); preferences->putBool(preference_started_before, true);
preferences->putBool(preference_lock_enabled, true); preferences->putBool(preference_lock_enabled, true);
} }
else
{
int configVer = preferences->getInt(preference_config_version);
if(configVer < (atof(NUKI_HUB_VERSION) * 100))
{
//Example
//if (configVer < 833)
//{
//MIGRATE SETTINGS
//}
preferences->putInt(preference_config_version, atof(NUKI_HUB_VERSION) * 100);
}
}
return firstStart; return firstStart;
} }