Initial HASS autodiscovery support
This commit is contained in:
30
Network.cpp
30
Network.cpp
@@ -343,6 +343,36 @@ void Network::publishPresenceDetection(char *csv)
|
|||||||
_presenceCsv = csv;
|
_presenceCsv = csv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Network::publishHASSConfig(const char* baseTopic, char* name, char* uidString, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState)
|
||||||
|
{
|
||||||
|
String configJSON = "{\"~\": \"";
|
||||||
|
configJSON.concat(baseTopic);
|
||||||
|
configJSON.concat("\", \"name\": \"");
|
||||||
|
configJSON.concat(name);
|
||||||
|
configJSON.concat("\", \"unique_id\": \"");
|
||||||
|
configJSON.concat(uidString);
|
||||||
|
configJSON.concat("\", \"cmd_t\": \"~/lock/action\", \"pl_lock\": \"");
|
||||||
|
configJSON.concat(lockAction);
|
||||||
|
configJSON.concat("\", \"pl_unlk\": \"");
|
||||||
|
configJSON.concat(unlockAction);
|
||||||
|
configJSON.concat("\", \"pl_open\": \"");
|
||||||
|
configJSON.concat(openAction);
|
||||||
|
configJSON.concat("\", \"stat_t\": \"~/lock/state\", \"stat_locked\": \"");
|
||||||
|
configJSON.concat(lockedState);
|
||||||
|
configJSON.concat("\", \"stat_unlocked\": \"");
|
||||||
|
configJSON.concat(unlockedState);
|
||||||
|
configJSON.concat("\", \"opt\": \"false\"}");
|
||||||
|
|
||||||
|
String path = "homeassistant/lock/";
|
||||||
|
path.concat(uidString);
|
||||||
|
path.concat("/config");
|
||||||
|
|
||||||
|
Serial.println("HASS Config:");
|
||||||
|
Serial.println(configJSON);
|
||||||
|
|
||||||
|
_device->mqttClient()->publish(path.c_str(), configJSON.c_str(), true);
|
||||||
|
}
|
||||||
|
|
||||||
void Network::setLockActionReceivedCallback(bool (*lockActionReceivedCallback)(const char *))
|
void Network::setLockActionReceivedCallback(bool (*lockActionReceivedCallback)(const char *))
|
||||||
{
|
{
|
||||||
_lockActionReceivedCallback = lockActionReceivedCallback;
|
_lockActionReceivedCallback = lockActionReceivedCallback;
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ public:
|
|||||||
void publishConfig(const NukiLock::Config& config);
|
void publishConfig(const NukiLock::Config& config);
|
||||||
void publishAdvancedConfig(const NukiLock::AdvancedConfig& config);
|
void publishAdvancedConfig(const NukiLock::AdvancedConfig& config);
|
||||||
void publishPresenceDetection(char* csv);
|
void publishPresenceDetection(char* csv);
|
||||||
|
void publishHASSConfig(const char* baseTopic, char* name, char* uidString, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState);
|
||||||
|
|
||||||
void setLockActionReceivedCallback(bool (*lockActionReceivedCallback)(const char* value));
|
void setLockActionReceivedCallback(bool (*lockActionReceivedCallback)(const char* value));
|
||||||
void setConfigUpdateReceivedCallback(void (*configUpdateReceivedCallback)(const char* path, const char* value));
|
void setConfigUpdateReceivedCallback(void (*configUpdateReceivedCallback)(const char* path, const char* value));
|
||||||
|
|||||||
@@ -166,6 +166,11 @@ void NetworkOpener::publishAdvancedConfig(const NukiOpener::AdvancedConfig &conf
|
|||||||
// publishBool(mqtt_topic_config_auto_lock, config.autoLockEnabled == 1);
|
// publishBool(mqtt_topic_config_auto_lock, config.autoLockEnabled == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NetworkOpener::publishHASSConfig(const char* baseTopic, char* name, char* uidString, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState)
|
||||||
|
{
|
||||||
|
_network->publishHASSConfig(baseTopic, name, uidString, lockAction, unlockAction, openAction, lockedState, unlockedState);
|
||||||
|
}
|
||||||
|
|
||||||
void NetworkOpener::setLockActionReceivedCallback(bool (*lockActionReceivedCallback)(const char *))
|
void NetworkOpener::setLockActionReceivedCallback(bool (*lockActionReceivedCallback)(const char *))
|
||||||
{
|
{
|
||||||
_lockActionReceivedCallback = lockActionReceivedCallback;
|
_lockActionReceivedCallback = lockActionReceivedCallback;
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ public:
|
|||||||
void publishBatteryReport(const NukiOpener::BatteryReport& batteryReport);
|
void publishBatteryReport(const NukiOpener::BatteryReport& batteryReport);
|
||||||
void publishConfig(const NukiOpener::Config& config);
|
void publishConfig(const NukiOpener::Config& config);
|
||||||
void publishAdvancedConfig(const NukiOpener::AdvancedConfig& config);
|
void publishAdvancedConfig(const NukiOpener::AdvancedConfig& config);
|
||||||
|
void publishHASSConfig(const char* baseTopic, char* name, char* uidString, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState);
|
||||||
|
|
||||||
void setLockActionReceivedCallback(bool (*lockActionReceivedCallback)(const char* value));
|
void setLockActionReceivedCallback(bool (*lockActionReceivedCallback)(const char* value));
|
||||||
void setConfigUpdateReceivedCallback(void (*configUpdateReceivedCallback)(const char* path, const char* value));
|
void setConfigUpdateReceivedCallback(void (*configUpdateReceivedCallback)(const char* path, const char* value));
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ void NukiOpenerWrapper::update()
|
|||||||
if (_nukiOpener.pairNuki() == NukiOpener::PairingResult::Success) {
|
if (_nukiOpener.pairNuki() == NukiOpener::PairingResult::Success) {
|
||||||
Serial.println(F("Nuki opener paired"));
|
Serial.println(F("Nuki opener paired"));
|
||||||
_paired = true;
|
_paired = true;
|
||||||
|
setupHASS();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -299,3 +300,23 @@ void NukiOpenerWrapper::readAdvancedConfig()
|
|||||||
_nukiAdvancedConfigValid = result == Nuki::CmdResult::Success;
|
_nukiAdvancedConfigValid = result == Nuki::CmdResult::Success;
|
||||||
Serial.println(result);
|
Serial.println(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NukiOpenerWrapper::setupHASS()
|
||||||
|
{
|
||||||
|
if(!_nukiConfigValid) // only ask for config once to save battery life
|
||||||
|
{
|
||||||
|
Nuki::CmdResult result = _nukiOpener.requestConfig(&_nukiConfig);
|
||||||
|
_nukiConfigValid = result == Nuki::CmdResult::Success;
|
||||||
|
}
|
||||||
|
if (_nukiConfigValid)
|
||||||
|
{
|
||||||
|
String baseTopic = _preferences->getString(preference_mqtt_opener_path);
|
||||||
|
char uidString[20];
|
||||||
|
itoa(_nukiConfig.nukiId, uidString, 16);
|
||||||
|
_network->publishHASSConfig(baseTopic.c_str(),(char*)_nukiConfig.name,uidString,"deactivateRTO","activateRTO","electricStrikeActuation","locked","RTOactive");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Serial.println(F("Unable to setup HASS. Invalid config received."));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ private:
|
|||||||
|
|
||||||
void readConfig();
|
void readConfig();
|
||||||
void readAdvancedConfig();
|
void readAdvancedConfig();
|
||||||
|
|
||||||
|
void setupHASS();
|
||||||
|
|
||||||
NukiOpener::LockAction lockActionToEnum(const char* str); // char array at least 14 characters
|
NukiOpener::LockAction lockActionToEnum(const char* str); // char array at least 14 characters
|
||||||
|
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ void NukiWrapper::update()
|
|||||||
if (_nukiLock.pairNuki() == Nuki::PairingResult::Success) {
|
if (_nukiLock.pairNuki() == Nuki::PairingResult::Success) {
|
||||||
Serial.println(F("Nuki paired"));
|
Serial.println(F("Nuki paired"));
|
||||||
_paired = true;
|
_paired = true;
|
||||||
|
setupHASS();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -321,3 +322,23 @@ void NukiWrapper::readAdvancedConfig()
|
|||||||
_nukiAdvancedConfigValid = result == Nuki::CmdResult::Success;
|
_nukiAdvancedConfigValid = result == Nuki::CmdResult::Success;
|
||||||
Serial.println(result);
|
Serial.println(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NukiWrapper::setupHASS()
|
||||||
|
{
|
||||||
|
if(!_nukiConfigValid) // only ask for config once to save battery life
|
||||||
|
{
|
||||||
|
Nuki::CmdResult result = _nukiLock.requestConfig(&_nukiConfig);
|
||||||
|
_nukiConfigValid = result == Nuki::CmdResult::Success;
|
||||||
|
}
|
||||||
|
if (_nukiConfigValid)
|
||||||
|
{
|
||||||
|
String baseTopic = _preferences->getString(preference_mqtt_lock_path);
|
||||||
|
char uidString[20];
|
||||||
|
itoa(_nukiConfig.nukiId, uidString, 16);
|
||||||
|
_network->publishHASSConfig(baseTopic.c_str(),(char*)_nukiConfig.name,uidString,"lock","unlock","unlatch","locked","unlocked");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Serial.println(F("Unable to setup HASS. Invalid config received."));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ private:
|
|||||||
|
|
||||||
void readConfig();
|
void readConfig();
|
||||||
void readAdvancedConfig();
|
void readAdvancedConfig();
|
||||||
|
|
||||||
|
void setupHASS();
|
||||||
|
|
||||||
NukiLock::LockAction lockActionToEnum(const char* str); // char array at least 14 characters
|
NukiLock::LockAction lockActionToEnum(const char* str); // char array at least 14 characters
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user