From ef95e8721e53827147b3092d46e87e55adb28272 Mon Sep 17 00:00:00 2001 From: iranl Date: Thu, 8 Feb 2024 21:35:55 +0100 Subject: [PATCH] Checkbox, Update Topic, Remove HA topics --- Network.cpp | 213 ++++++++++++++++++++-------------------------- PreferencesKeys.h | 5 +- WebCfgServer.cpp | 15 +++- 3 files changed, 106 insertions(+), 127 deletions(-) diff --git a/Network.cpp b/Network.cpp index 30a49fb..a80131a 100644 --- a/Network.cpp +++ b/Network.cpp @@ -358,27 +358,30 @@ bool Network::update() _lastMaintenanceTs = ts; } - if(_lastUpdateCheckTs == 0 || (ts - _lastUpdateCheckTs) > 86400000) + if(_preferences->getBool(preference_check_updates)) { - _lastUpdateCheckTs = ts; - - https.useHTTP10(true); - https.begin(GITHUB_LATEST_RELEASE_API_URL); + if(_lastUpdateCheckTs == 0 || (ts - _lastUpdateCheckTs) > 86400000) + { + _lastUpdateCheckTs = ts; + + https.useHTTP10(true); + https.begin(GITHUB_LATEST_RELEASE_API_URL); - int httpResponseCode = https.GET(); + int httpResponseCode = https.GET(); - if (httpResponseCode == HTTP_CODE_OK || httpResponseCode == HTTP_CODE_MOVED_PERMANENTLY) { - DynamicJsonDocument doc(6144); - DeserializationError jsonError = deserializeJson(doc, https.getStream()); + if (httpResponseCode == HTTP_CODE_OK || httpResponseCode == HTTP_CODE_MOVED_PERMANENTLY) { + DynamicJsonDocument doc(6144); + DeserializationError jsonError = deserializeJson(doc, https.getStream()); - if (!jsonError) { - _latestVersion = doc["tag_name"]; - _latestVersionUrl = doc["assets"][0]["browser_download_url"]; - publishString(_maintenancePathPrefix, mqtt_topic_info_nuki_hub_latest, _latestVersion); - } + if (!jsonError) { + _latestVersion = doc["tag_name"]; + _latestVersionUrl = doc["assets"][0]["browser_download_url"]; + publishString(_maintenancePathPrefix, mqtt_topic_info_nuki_hub_latest, _latestVersion); + } + } + + https.end(); } - - https.end(); } for(const auto& gpioTs : _gpioTs) @@ -948,23 +951,50 @@ void Network::publishHASSConfig(char* deviceType, const char* baseTopic, char* n "", { { "enabled_by_default", "true" }, {"ic", "mdi:counter"}}); - - // NUKI Hub latest - publishHassTopic("sensor", - "nuki_hub_latest", - uidString, - "_nuki_hub_latest", - "NUKI Hub latest", - name, - baseTopic, - _lockPath + mqtt_topic_info_nuki_hub_latest, - deviceType, - "", - "", - "diagnostic", - "", - { { "enabled_by_default", "true" }, - {"ic", "mdi:counter"}}); + + if(_preferences->getBool(preference_check_updates)) + { + // NUKI Hub latest + publishHassTopic("sensor", + "nuki_hub_latest", + uidString, + "_nuki_hub_latest", + "NUKI Hub latest", + name, + baseTopic, + _lockPath + mqtt_topic_info_nuki_hub_latest, + deviceType, + "", + "", + "diagnostic", + "", + { { "enabled_by_default", "true" }, + {"ic", "mdi:counter"}}); + + // NUKI Hub update + publishHassTopic("update", + "nuki_hub_update", + uidString, + "_nuki_hub_update", + "NUKI Hub Firmware Update", + name, + baseTopic, + _lockPath + mqtt_topic_info_nuki_hub_version, + deviceType, + "firmware", + "", + "", + "", + { { "enabled_by_default", "true" }, + { "entity_picture", "https://raw.githubusercontent.com/technyon/nuki_hub/master/icon/icon-192x192.png" }, + { "release_url", GITHUB_LATEST_RELEASE_URL }, + { "latest_version_topic", _lockPath + mqtt_topic_info_nuki_hub_latest }}); + } + else + { + removeHassTopic("sensor", "nuki_hub_latest", uidString); + removeHassTopic("update", "nuki_hub_update", uidString); + } // NUKI Hub IP Address publishHassTopic("sensor", @@ -1404,95 +1434,34 @@ void Network::removeHASSConfig(char* uidString) if(discoveryTopic != "") { - String path = discoveryTopic; - path.concat("/lock/"); - path.concat(uidString); - path.concat("/smartlock/config"); - _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, ""); - - path = discoveryTopic; - path.concat("/binary_sensor/"); - path.concat(uidString); - path.concat("/battery_low/config"); - _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, ""); - - path = discoveryTopic; - path.concat("/button/"); - path.concat(uidString); - path.concat("/lockngo/config"); - _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, ""); - - path = discoveryTopic; - path.concat("/button/"); - path.concat(uidString); - path.concat("/lockngounlatch/config"); - _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, ""); - - path = discoveryTopic; - path.concat("/button/"); - path.concat(uidString); - path.concat("/unlatch/config"); - _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, ""); - - path = discoveryTopic; - path.concat("/sensor/"); - path.concat(uidString); - path.concat("/battery_voltage/config"); - _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, ""); - - path = discoveryTopic; - path.concat("/sensor/"); - path.concat(uidString); - path.concat("/trigger/config"); - _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, ""); - - path = discoveryTopic; - path.concat("/sensor/"); - path.concat(uidString); - path.concat("/battery_level/config"); - _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, ""); - - path = discoveryTopic; - path.concat("/sensor/"); - path.concat(uidString); - path.concat("/sound_level/config"); - _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, ""); - - path = discoveryTopic; - path.concat("/sensor/"); - path.concat(uidString); - path.concat("/nuki_hub_ip/config"); - _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, ""); - - path = discoveryTopic; - path.concat("/number/"); - path.concat(uidString); - path.concat("/sound_level/config"); - _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, ""); - - path = discoveryTopic; - path.concat("/binary_sensor/"); - path.concat(uidString); - path.concat("/door_sensor/config"); - _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, ""); - - path = discoveryTopic; - path.concat("/binary_sensor/"); - path.concat(uidString); - path.concat("/ring/config"); - _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, ""); - - path = discoveryTopic; - path.concat("/sensor/"); - path.concat(uidString); - path.concat("/wifi_signal_strength/config"); - _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, ""); - - path = discoveryTopic; - path.concat("/sensor/"); - path.concat(uidString); - path.concat("/bluetooth_signal_strength/config"); - _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, ""); + removeHassTopic("lock", "smartlock", uidString); + removeHassTopic("binary_sensor", "battery_low", uidString); + removeHassTopic("binary_sensor", "keypad_battery_low", uidString); + removeHassTopic("sensor", "battery_voltage", uidString); + removeHassTopic("sensor", "trigger", uidString); + removeHassTopic("binary_sensor", "mqtt_connected", uidString); + removeHassTopic("switch", "reset", uidString); + removeHassTopic("sensor", "firmware_version", uidString); + removeHassTopic("sensor", "hardware_version", uidString); + removeHassTopic("sensor", "nuki_hub_version", uidString); + removeHassTopic("sensor", "nuki_hub_latest", uidString); + removeHassTopic("update", "nuki_hub_update", uidString); + removeHassTopic("sensor", "nuki_hub_ip", uidString); + removeHassTopic("switch", "led_enabled", uidString); + removeHassTopic("switch", "button_enabled", uidString); + removeHassTopic("button", "unlatch", uidString); + removeHassTopic("button", "lockngo", uidString); + removeHassTopic("button", "lockngounlatch", uidString); + removeHassTopic("sensor", "battery_level", uidString); + removeHassTopic("binary_sensor", "door_sensor", uidString); + removeHassTopic("binary_sensor", "ring", uidString); + removeHassTopic("number", "led_brightness", uidString); + removeHassTopic("sensor", "sound_level", uidString); + removeHassTopic("number", "sound_level", uidString); + removeHassTopic("sensor", "last_action_authorization", uidString); + removeHassTopic("sensor", "keypad_status", uidString); + removeHassTopic("sensor", "wifi_signal_strength", uidString); + removeHassTopic("sensor", "bluetooth_signal_strength", uidString); } } diff --git a/PreferencesKeys.h b/PreferencesKeys.h index 13757d5..c1632f4 100644 --- a/PreferencesKeys.h +++ b/PreferencesKeys.h @@ -14,6 +14,7 @@ #define preference_mqtt_lock_path "mqttpath" #define preference_opener_enabled "openerena" #define preference_mqtt_opener_path "mqttoppath" +#define preference_check_updates "checkupdates" #define preference_lock_max_keypad_code_count "maxkpad" #define preference_opener_max_keypad_code_count "opmaxkpad" #define preference_mqtt_ca "mqttca" @@ -62,7 +63,7 @@ private: std::vector _keys = { preference_started_before, preference_device_id_lock, preference_device_id_opener, preference_mqtt_broker, preference_mqtt_broker_port, - preference_mqtt_user, preference_mqtt_password, preference_mqtt_log_enabled, preference_lock_enabled, + preference_mqtt_user, preference_mqtt_password, preference_mqtt_log_enabled, preference_check_updates, preference_lock_enabled, preference_mqtt_lock_path, preference_opener_enabled, preference_mqtt_opener_path, 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, @@ -85,7 +86,7 @@ private: }; std::vector _boolPrefs = { - preference_started_before, preference_mqtt_log_enabled, preference_lock_enabled, preference_opener_enabled, + preference_started_before, preference_mqtt_log_enabled, preference_check_updates, preference_lock_enabled, preference_opener_enabled, preference_restart_on_disconnect, preference_keypad_control_enabled, preference_register_as_app, preference_ip_dhcp_enabled, preference_publish_authdata, preference_has_mac_saved, preference_publish_debug_info, preference_network_wifi_fallback_disabled }; diff --git a/WebCfgServer.cpp b/WebCfgServer.cpp index 5918386..a463939 100644 --- a/WebCfgServer.cpp +++ b/WebCfgServer.cpp @@ -377,6 +377,11 @@ bool WebCfgServer::processArgs(String& message) _preferences->putBool(preference_mqtt_log_enabled, (value == "1")); configChanged = true; } + else if(key == "CHECKUPDATE") + { + _preferences->putBool(preference_check_updates, (value == "1")); + configChanged = true; + } else if(key == "DHCPENA") { _preferences->putBool(preference_ip_dhcp_enabled, (value == "1")); @@ -620,9 +625,12 @@ void WebCfgServer::buildHtml(String& response) const char* _latestVersion = _network->latestHubVersion(); - //if (_latestVersion.toFloat() > atof(NUKI_HUB_VERSION) || (_latestVersion.toFloat() == atof(NUKI_HUB_VERSION) && _latestVersion.c_str() != NUKI_HUB_VERSION)) { - printParameter(response, "Latest Firmware", _latestVersion, GITHUB_LATEST_RELEASE_URL); - //} + if(_preferences->getBool(preference_check_updates)) + { + //if(atof(_latestVersion) > atof(NUKI_HUB_VERSION) || (atof(_latestVersion) == atof(NUKI_HUB_VERSION) && _latestVersion != NUKI_HUB_VERSION)) { + printParameter(response, "Latest Firmware", _latestVersion, GITHUB_LATEST_RELEASE_URL); + //} + } response.concat("

"); @@ -786,6 +794,7 @@ void WebCfgServer::buildMqttConfigHtml(String &response) printInputField(response, "NETTIMEOUT", "Network Timeout until restart (seconds; -1 to disable)", _preferences->getInt(preference_network_timeout), 5); printCheckBox(response, "RSTDISC", "Restart on disconnect", _preferences->getBool(preference_restart_on_disconnect)); printCheckBox(response, "MQTTLOG", "Enable MQTT logging", _preferences->getBool(preference_mqtt_log_enabled)); + printCheckBox(response, "CHECKUPDATE", "Check for Firmware Updates every 24h", _preferences->getBool(preference_check_updates)); response.concat(""); response.concat("* If no encryption is configured for the MQTT broker, leave empty. Only supported for WiFi connections.

");