diff --git a/Network.cpp b/Network.cpp index 3b0dadf..dd5452a 100644 --- a/Network.cpp +++ b/Network.cpp @@ -343,34 +343,66 @@ void Network::publishPresenceDetection(char *csv) _presenceCsv = csv; } -void Network::publishHASSConfig(const char* baseTopic, char* name, char* uidString, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState) +void Network::publishHASSConfig(char* deviceType, 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\": \""); + String configJSON = "{\"dev\":{\"ids\":[\"nuki_"; configJSON.concat(uidString); - configJSON.concat("\", \"cmd_t\": \"~/lock/action\", \"pl_lock\": \""); + configJSON.concat("\"],\"mf\":\"Nuki\",\"mdl\":\""); + configJSON.concat(deviceType); + configJSON.concat("\",\"name\":\""); + configJSON.concat(name); + configJSON.concat("\"},\"~\":\""); + configJSON.concat(baseTopic); + configJSON.concat("\",\"name\":\""); + configJSON.concat(name); + configJSON.concat("\",\"unique_id\":\""); + configJSON.concat(uidString); + configJSON.concat("_lock\",\"cmd_t\":\"~"); + configJSON.concat(mqtt_topic_lock_action); + configJSON.concat("\",\"pl_lock\":\""); configJSON.concat(lockAction); - configJSON.concat("\", \"pl_unlk\": \""); + configJSON.concat("\",\"pl_unlk\":\""); configJSON.concat(unlockAction); - configJSON.concat("\", \"pl_open\": \""); + configJSON.concat("\",\"pl_open\":\""); configJSON.concat(openAction); - configJSON.concat("\", \"stat_t\": \"~/lock/state\", \"stat_locked\": \""); + configJSON.concat("\",\"stat_t\":\"~"); + configJSON.concat(mqtt_topic_lock_state); + configJSON.concat("\",\"stat_locked\":\""); configJSON.concat(lockedState); - configJSON.concat("\", \"stat_unlocked\": \""); + configJSON.concat("\",\"stat_unlocked\":\""); configJSON.concat(unlockedState); - configJSON.concat("\", \"opt\": \"false\"}"); + configJSON.concat("\",\"opt\":\"false\"}"); String path = "homeassistant/lock/"; path.concat(uidString); - path.concat("/config"); + path.concat("/smartlock/config"); Serial.println("HASS Config:"); Serial.println(configJSON); _device->mqttClient()->publish(path.c_str(), configJSON.c_str(), true); + + configJSON = "{\"dev\":{\"ids\":[\"nuki_"; + configJSON.concat(uidString); + configJSON.concat("\"],\"mf\":\"Nuki\",\"mdl\":\""); + configJSON.concat(deviceType); + configJSON.concat("\",\"name\":\""); + configJSON.concat(name); + configJSON.concat("\"},\"~\":\""); + configJSON.concat(baseTopic); + configJSON.concat("\",\"name\":\""); + configJSON.concat(name); + configJSON.concat(" battery low\",\"unique_id\":\""); + configJSON.concat(uidString); + configJSON.concat("_battery_low\",\"dev_cla\":\"battery\",\"ent_cat\":\"diagnostic\",\"pl_off\":\"0\",\"pl_on\":\"1\",\"stat_t\":\"~"); + configJSON.concat(mqtt_topic_battery_critical); + configJSON.concat("\"}"); + + path = "homeassistant/binary_sensor/"; + path.concat(uidString); + path.concat("/battery_low/config"); + + _device->mqttClient()->publish(path.c_str(), configJSON.c_str(), true); } void Network::setLockActionReceivedCallback(bool (*lockActionReceivedCallback)(const char *)) diff --git a/Network.h b/Network.h index ff3a7f8..bef677a 100644 --- a/Network.h +++ b/Network.h @@ -36,7 +36,7 @@ public: void publishConfig(const NukiLock::Config& config); void publishAdvancedConfig(const NukiLock::AdvancedConfig& config); void publishPresenceDetection(char* csv); - void publishHASSConfig(const char* baseTopic, char* name, char* uidString, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState); + void publishHASSConfig(char* deviceType, 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 setConfigUpdateReceivedCallback(void (*configUpdateReceivedCallback)(const char* path, const char* value)); diff --git a/NetworkOpener.cpp b/NetworkOpener.cpp index f92f10d..ac90b88 100644 --- a/NetworkOpener.cpp +++ b/NetworkOpener.cpp @@ -166,9 +166,9 @@ void NetworkOpener::publishAdvancedConfig(const NukiOpener::AdvancedConfig &conf // 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) +void NetworkOpener::publishHASSConfig(char* deviceType, 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); + _network->publishHASSConfig(deviceType, baseTopic, name, uidString, lockAction, unlockAction, openAction, lockedState, unlockedState); } void NetworkOpener::setLockActionReceivedCallback(bool (*lockActionReceivedCallback)(const char *)) diff --git a/NetworkOpener.h b/NetworkOpener.h index 97329c7..5136786 100644 --- a/NetworkOpener.h +++ b/NetworkOpener.h @@ -26,7 +26,7 @@ public: void publishBatteryReport(const NukiOpener::BatteryReport& batteryReport); void publishConfig(const NukiOpener::Config& 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 publishHASSConfig(char* deviceType, 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 setConfigUpdateReceivedCallback(void (*configUpdateReceivedCallback)(const char* path, const char* value)); diff --git a/NukiOpenerWrapper.cpp b/NukiOpenerWrapper.cpp index 3e01567..b88ed4e 100644 --- a/NukiOpenerWrapper.cpp +++ b/NukiOpenerWrapper.cpp @@ -313,7 +313,7 @@ void NukiOpenerWrapper::setupHASS() 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"); + _network->publishHASSConfig("Opener",baseTopic.c_str(),(char*)_nukiConfig.name,uidString,"deactivateRTO","activateRTO","electricStrikeActuation","locked","RTOactive"); } else { diff --git a/NukiWrapper.cpp b/NukiWrapper.cpp index f0f8fa9..8478b03 100644 --- a/NukiWrapper.cpp +++ b/NukiWrapper.cpp @@ -335,7 +335,7 @@ void NukiWrapper::setupHASS() 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"); + _network->publishHASSConfig("SmartLock",baseTopic.c_str(),(char*)_nukiConfig.name,uidString,"lock","unlock","unlatch","locked","unlocked"); } else {