From 7e74992a7f5af59cd96f4b3e82139b0344c49fa4 Mon Sep 17 00:00:00 2001 From: technyon Date: Wed, 15 Mar 2023 21:54:10 +0100 Subject: [PATCH 01/12] update readme --- Config.h.save | 6 ------ README.md | 15 +++++++++------ 2 files changed, 9 insertions(+), 12 deletions(-) delete mode 100644 Config.h.save diff --git a/Config.h.save b/Config.h.save deleted file mode 100644 index aad4e52..0000000 --- a/Config.h.save +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#define NUKI_HUB_VERSION "8.13" - -#define MQTT_QOS_LEVEL 1 -#define MQTT_CLEAN_SESSIONS false diff --git a/README.md b/README.md index 26e4d3e..5291c03 100644 --- a/README.md +++ b/README.md @@ -187,8 +187,11 @@ The Pin configuration is:
## Connecting via LAN (Optional) -If you prefer to connect to the MQTT Broker via LAN instead of WiFi, you can use a Wiznet W5x00 Module (W5100, W5200, W5500 are supported). -To connect, just wire the module and connect the LAN cable: +If you prefer to connect to the MQTT Broker via LAN instead of WiFi, you either use one of the supported ESP32 modules (see about section above), +or wire a seperate Wiznet W5x00 Module (W5100, W5200, W5500 are supported). To use a supported module, flash the firmware, connect via Wifi and +select the correct network hardware in the MQTT and network settings section.

+ +To wire an external W5x00 module to the ESP, use this wiring scheme:

- Connect W5x00 to ESP32 SPI0:
W5x00 SCK to GPIO18
@@ -199,10 +202,10 @@ W5x00 CS/SS to GPIO5 W5x00 reset to GPIO33 - Last but not least, on the ESP32 bridge GPIO26 and GND. This let's the firmware know that a LAN Module is connected -Wifi is now disabled, and the module doesn't boot into WifiManager anymore. - -As an alternative to do the wiring yourself, you can use an [M5Stack Atom POE](https://docs.m5stack.com/en/atom/atom_poe). -After flashing, go to MQTT and network settings and select the module under "Network hardware". +Wifi is now disabled, and the module doesn't boot into WifiManager anymore.
+Note: Encrypted MQTT is only available for Wifi and LAN8720 modules, W5x00 modules don't support encryption +(that leaves Olimex, WT32-ETH01 and M5Stack PoESP32 Unit if encryption is desired). If encryption is needed, Olimex +is the easiest option, since it has USB for flashing onboard. ## Troubleshooting From be6e2c8e36aebb4607d21ef991633b3a6e014359 Mon Sep 17 00:00:00 2001 From: technyon Date: Wed, 15 Mar 2023 21:54:37 +0100 Subject: [PATCH 02/12] update readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5291c03..52bb6ee 100644 --- a/README.md +++ b/README.md @@ -189,9 +189,9 @@ The Pin configuration is:
If you prefer to connect to the MQTT Broker via LAN instead of WiFi, you either use one of the supported ESP32 modules (see about section above), or wire a seperate Wiznet W5x00 Module (W5100, W5200, W5500 are supported). To use a supported module, flash the firmware, connect via Wifi and -select the correct network hardware in the MQTT and network settings section.

+select the correct network hardware in the MQTT and network settings section.
-To wire an external W5x00 module to the ESP, use this wiring scheme:

+To wire an external W5x00 module to the ESP, use this wiring scheme:
- Connect W5x00 to ESP32 SPI0:
W5x00 SCK to GPIO18
From face4eb91ecf9a002679e70b90625e5cd69cfade Mon Sep 17 00:00:00 2001 From: technyon Date: Sun, 19 Mar 2023 21:30:05 +0100 Subject: [PATCH 03/12] add ha topic for last lock action sensor --- Config.h | 2 +- MqttTopics.h | 1 + Network.cpp | 25 ++++++++++++++++++++++--- Network.h | 3 ++- NetworkLock.cpp | 13 +++++++++++-- NetworkLock.h | 2 +- NetworkOpener.cpp | 11 ++++++++++- NetworkOpener.h | 2 +- NukiOpenerWrapper.cpp | 2 +- NukiWrapper.cpp | 2 +- 10 files changed, 51 insertions(+), 12 deletions(-) diff --git a/Config.h b/Config.h index 0e5992f..f9c63a0 100644 --- a/Config.h +++ b/Config.h @@ -1,6 +1,6 @@ #pragma once -#define NUKI_HUB_VERSION "8.18" +#define NUKI_HUB_VERSION "8.19-pre-1" #define MQTT_QOS_LEVEL 1 #define MQTT_CLEAN_SESSIONS false diff --git a/MqttTopics.h b/MqttTopics.h index f96b612..a002911 100644 --- a/MqttTopics.h +++ b/MqttTopics.h @@ -36,6 +36,7 @@ #define mqtt_topic_config_auto_lock "/configuration/autoLock" #define mqtt_topic_config_single_lock "/configuration/singleLock" #define mqtt_topic_config_sound_level "/configuration/soundLevel" +#define mqtt_topic_config_last_action_authorization "/configuration/lastActionAuthorizaton" #define mqtt_topic_info_hardware_version "/info/hardwareVersion" #define mqtt_topic_info_firmware_version "/info/firmwareVersion" diff --git a/Network.cpp b/Network.cpp index ab7d45d..8453f77 100644 --- a/Network.cpp +++ b/Network.cpp @@ -856,7 +856,7 @@ void Network::publishHASSConfigLedBrightness(char *deviceType, const char *baseT void Network::publishHASSConfigSoundLevel(char *deviceType, const char *baseTopic, char *name, char *uidString) { - publishHassTopic("number", + publishHassTopic("sensor", "sound_level", uidString, "_sound_level", @@ -874,6 +874,25 @@ void Network::publishHASSConfigSoundLevel(char *deviceType, const char *baseTopi { "max", "255" }}); } + +void Network::publishHASSConfigAccessLog(char *deviceType, const char *baseTopic, char *name, char *uidString) +{ + publishHassTopic("sensor", + "last_action_authorization", + uidString, + "_last_action_authorization", + "Last action authorization", + name, + baseTopic, + mqtt_topic_lock_log, + deviceType, + "", + "", + "diagnostic", + "", + { { "value_template", "{{ (value_json|selectattr('type', 'eq', 'LockAction')|selectattr('action', 'in', ['Lock', 'Unlock', 'Unlatch'])|first).authorizationName }}" }});} + + void Network::publishHASSWifiRssiConfig(char *deviceType, const char *baseTopic, char *name, char *uidString) { if(_device->signalStrength() == 127) @@ -1083,9 +1102,9 @@ void Network::removeHASSConfig(char* uidString) } } -void Network::removeHASSConfigDoorSensor(char *deviceType, const char *baseTopic, char *name, char *uidString) +void Network::removeHASSConfigTopic(char *deviceType, char *name, char *uidString) { - removeHassTopic("binary_sensor", "door_sensor", uidString); + removeHassTopic(deviceType, name, uidString); } void Network::publishPresenceDetection(char *csv) diff --git a/Network.h b/Network.h index 26218d0..9b1e839 100644 --- a/Network.h +++ b/Network.h @@ -46,10 +46,11 @@ public: void publishHASSConfigRingDetect(char* deviceType, const char* baseTopic, char* name, char* uidString); void publishHASSConfigLedBrightness(char* deviceType, const char* baseTopic, char* name, char* uidString); void publishHASSConfigSoundLevel(char* deviceType, const char* baseTopic, char* name, char* uidString); + void publishHASSConfigAccessLog(char* deviceType, const char* baseTopic, char* name, char* uidString); void publishHASSWifiRssiConfig(char* deviceType, const char* baseTopic, char* name, char* uidString); void publishHASSBleRssiConfig(char* deviceType, const char* baseTopic, char* name, char* uidString); void removeHASSConfig(char* uidString); - void removeHASSConfigDoorSensor(char* deviceType, const char* baseTopic, char* name, char* uidString); + void removeHASSConfigTopic(char* deviceType, char* name, char* uidString); void clearWifiFallback(); diff --git a/NetworkLock.cpp b/NetworkLock.cpp index 34845a1..5669aa8 100644 --- a/NetworkLock.cpp +++ b/NetworkLock.cpp @@ -515,7 +515,7 @@ bool NetworkLock::comparePrefixedPath(const char *fullPath, const char *subPath) return strcmp(fullPath, prefixedPath) == 0; } -void NetworkLock::publishHASSConfig(char *deviceType, const char *baseTopic, char *name, char *uidString, const bool& hasDoorSensor, const bool& hasKeypad, char *lockAction, +void NetworkLock::publishHASSConfig(char *deviceType, const char *baseTopic, char *name, char *uidString, const bool& hasDoorSensor, const bool& hasKeypad, const bool& publishAuthData, char *lockAction, char *unlockAction, char *openAction, char *lockedState, char *unlockedState) { _network->publishHASSConfig(deviceType, baseTopic, name, uidString, hasKeypad, lockAction, unlockAction, openAction, lockedState, unlockedState); @@ -527,10 +527,19 @@ void NetworkLock::publishHASSConfig(char *deviceType, const char *baseTopic, cha } else { - _network->removeHASSConfigDoorSensor(deviceType, baseTopic, name, uidString); + _network->removeHASSConfigTopic("binary_sensor", "door_sensor", uidString); } _network->publishHASSWifiRssiConfig(deviceType, baseTopic, name, uidString); _network->publishHASSBleRssiConfig(deviceType, baseTopic, name, uidString); + + if(publishAuthData) + { + _network->publishHASSConfigAccessLog(deviceType, baseTopic, name, uidString); + } + else + { + _network->removeHASSConfigTopic("sensor", "last_action_authorization", uidString); + } } void NetworkLock::removeHASSConfig(char *uidString) diff --git a/NetworkLock.h b/NetworkLock.h index d722d3d..d529fc5 100644 --- a/NetworkLock.h +++ b/NetworkLock.h @@ -31,7 +31,7 @@ public: void publishRssi(const int& rssi); void publishRetry(const std::string& message); void publishBleAddress(const std::string& address); - void publishHASSConfig(char* deviceType, const char* baseTopic, char* name, char* uidString, const bool& hasDoorSensor, const bool& hasKeypad, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState); + void publishHASSConfig(char* deviceType, const char* baseTopic, char* name, char* uidString, const bool& hasDoorSensor, const bool& hasKeypad, const bool& publishAuthData, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState); void removeHASSConfig(char* uidString); void publishKeypad(const std::list& entries, uint maxKeypadCodeCount); void publishKeypadCommandResult(const char* result); diff --git a/NetworkOpener.cpp b/NetworkOpener.cpp index 0650a5d..9241094 100644 --- a/NetworkOpener.cpp +++ b/NetworkOpener.cpp @@ -481,12 +481,21 @@ void NetworkOpener::publishBleAddress(const std::string &address) publishString(mqtt_topic_lock_address, address); } -void NetworkOpener::publishHASSConfig(char* deviceType, 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, const bool& publishAuthData, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState) { _network->publishHASSConfig(deviceType, baseTopic, name, uidString, false, lockAction, unlockAction, openAction, lockedState, unlockedState); _network->publishHASSConfigRingDetect(deviceType, baseTopic, name, uidString); _network->publishHASSConfigSoundLevel(deviceType, baseTopic, name, uidString); _network->publishHASSBleRssiConfig(deviceType, baseTopic, name, uidString); + + if(publishAuthData) + { + _network->publishHASSConfigAccessLog(deviceType, baseTopic, name, uidString); + } + else + { + _network->removeHASSConfigTopic("sensor", "last_action_authorization", uidString); + } } void NetworkOpener::removeHASSConfig(char* uidString) diff --git a/NetworkOpener.h b/NetworkOpener.h index a868dcf..4853f84 100644 --- a/NetworkOpener.h +++ b/NetworkOpener.h @@ -31,7 +31,7 @@ public: void publishRssi(const int& rssi); void publishRetry(const std::string& message); void publishBleAddress(const std::string& address); - void publishHASSConfig(char* deviceType, 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, const bool& publishAuthData, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState); void removeHASSConfig(char* uidString); void publishKeypad(const std::list& entries, uint maxKeypadCodeCount); void publishKeypadCommandResult(const char* result); diff --git a/NukiOpenerWrapper.cpp b/NukiOpenerWrapper.cpp index 9bd9104..e7ade08 100644 --- a/NukiOpenerWrapper.cpp +++ b/NukiOpenerWrapper.cpp @@ -646,7 +646,7 @@ void NukiOpenerWrapper::setupHASS() String baseTopic = _preferences->getString(preference_mqtt_opener_path); char uidString[20]; itoa(_nukiConfig.nukiId, uidString, 16); - _network->publishHASSConfig("Opener",baseTopic.c_str(),(char*)_nukiConfig.name,uidString,"deactivateRTO","activateRTO","electricStrikeActuation","locked","unlocked"); + _network->publishHASSConfig("Opener",baseTopic.c_str(),(char*)_nukiConfig.name,uidString, _publishAuthData, "deactivateRTO","activateRTO","electricStrikeActuation","locked","unlocked"); _hassSetupCompleted = true; Log->println("HASS setup for opener completed."); diff --git a/NukiWrapper.cpp b/NukiWrapper.cpp index 35d828a..24ac52a 100644 --- a/NukiWrapper.cpp +++ b/NukiWrapper.cpp @@ -661,7 +661,7 @@ void NukiWrapper::setupHASS() char uidString[20]; itoa(_nukiConfig.nukiId, uidString, 16); - _network->publishHASSConfig("SmartLock", baseTopic.c_str(),(char*)_nukiConfig.name, uidString, hasDoorSensor(), _hasKeypad, "lock", "unlock", "unlatch", "locked", "unlocked"); + _network->publishHASSConfig("SmartLock", baseTopic.c_str(),(char*)_nukiConfig.name, uidString, hasDoorSensor(), _hasKeypad, _publishAuthData,"lock", "unlock", "unlatch", "locked", "unlocked"); _hassSetupCompleted = true; Log->println("HASS setup for lock completed."); From 681a2ba75d6f2a589a1a2d254ffc028c9a932510 Mon Sep 17 00:00:00 2001 From: technyon Date: Sun, 19 Mar 2023 21:38:24 +0100 Subject: [PATCH 04/12] remove last lock action for opener --- NetworkOpener.cpp | 11 +---------- NetworkOpener.h | 2 +- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/NetworkOpener.cpp b/NetworkOpener.cpp index 9241094..0650a5d 100644 --- a/NetworkOpener.cpp +++ b/NetworkOpener.cpp @@ -481,21 +481,12 @@ void NetworkOpener::publishBleAddress(const std::string &address) publishString(mqtt_topic_lock_address, address); } -void NetworkOpener::publishHASSConfig(char* deviceType, const char* baseTopic, char* name, char* uidString, const bool& publishAuthData, 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(deviceType, baseTopic, name, uidString, false, lockAction, unlockAction, openAction, lockedState, unlockedState); _network->publishHASSConfigRingDetect(deviceType, baseTopic, name, uidString); _network->publishHASSConfigSoundLevel(deviceType, baseTopic, name, uidString); _network->publishHASSBleRssiConfig(deviceType, baseTopic, name, uidString); - - if(publishAuthData) - { - _network->publishHASSConfigAccessLog(deviceType, baseTopic, name, uidString); - } - else - { - _network->removeHASSConfigTopic("sensor", "last_action_authorization", uidString); - } } void NetworkOpener::removeHASSConfig(char* uidString) diff --git a/NetworkOpener.h b/NetworkOpener.h index 4853f84..a868dcf 100644 --- a/NetworkOpener.h +++ b/NetworkOpener.h @@ -31,7 +31,7 @@ public: void publishRssi(const int& rssi); void publishRetry(const std::string& message); void publishBleAddress(const std::string& address); - void publishHASSConfig(char* deviceType, const char* baseTopic, char* name, char* uidString, const bool& publishAuthData, 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 removeHASSConfig(char* uidString); void publishKeypad(const std::list& entries, uint maxKeypadCodeCount); void publishKeypadCommandResult(const char* result); From 3c967c745a21b5ba1db987493557f7776e77cf30 Mon Sep 17 00:00:00 2001 From: technyon Date: Tue, 21 Mar 2023 20:29:56 +0100 Subject: [PATCH 05/12] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 52bb6ee..5a78170 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ Note: It is possible to run NUKI Hub alongside a NUKI Bridge. This is not recomm ## Support If you haven't ordered your NUKI product yet, you can support me by using my referrer code when placing your order:
-REFPGVT4XJ5JW
+REFXQ847A4ZDG
This will also give you a 30€ discount for your order. This project is free to use for everyone. However if you feel like donating, you can buy me a coffee at ko-fi.com: From a51ef8a830741666e1c54851387e28b584034811 Mon Sep 17 00:00:00 2001 From: Mikko Date: Wed, 22 Mar 2023 08:38:37 +0000 Subject: [PATCH 06/12] Publish version once on startup --- MqttTopics.h | 2 +- Network.cpp | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/MqttTopics.h b/MqttTopics.h index a002911..24039d8 100644 --- a/MqttTopics.h +++ b/MqttTopics.h @@ -40,7 +40,7 @@ #define mqtt_topic_info_hardware_version "/info/hardwareVersion" #define mqtt_topic_info_firmware_version "/info/firmwareVersion" - +#define mqtt_topic_info_nuki_hub_version "/info/nukiHubVersion" #define mqtt_topic_keypad "/keypad" #define mqtt_topic_keypad_command_action "/keypad/command/action" diff --git a/Network.cpp b/Network.cpp index 8453f77..afe7033 100644 --- a/Network.cpp +++ b/Network.cpp @@ -11,6 +11,7 @@ Network* Network::_inst = nullptr; unsigned long Network::_ignoreSubscriptionsTs = 0; +bool _versionPublished = false; RTC_NOINIT_ATTR char WiFi_fallbackDetect[14]; @@ -289,6 +290,10 @@ bool Network::update() publishString(_maintenancePathPrefix, mqtt_topic_restart_reason_fw, getRestartReason().c_str()); publishString(_maintenancePathPrefix, mqtt_topic_restart_reason_esp, getEspRestartReason().c_str()); } + if (!_versionPublished) { + publishString(mqtt_topic_info_nuki_hub_version, NUKI_HUB_VERSION); + _versionPublished = true; + } _lastMaintenanceTs = ts; } @@ -717,6 +722,23 @@ void Network::publishHASSConfig(char* deviceType, const char* baseTopic, char* n { { "enabled_by_default", "true" }, {"ic", "mdi:counter"}}); + // NUKI Hub version + publishHassTopic("sensor", + "nuki_hub_version", + uidString, + "_nuki_hub__version", + "NUKI Hub version", + name, + baseTopic, + mqtt_topic_info_nuki_hub_version, + deviceType, + "", + "", + "diagnostic", + "", + { { "enabled_by_default", "true" }, + {"ic", "mdi:counter"}}); + // LED enabled publishHassTopic("switch", "led_enabled", From ff4bd2618f8e0ca42b5856fcf8d656e43e1d1b64 Mon Sep 17 00:00:00 2001 From: technyon Date: Wed, 22 Mar 2023 22:54:35 +0100 Subject: [PATCH 07/12] add auto discovery for keypad result --- CMakeLists.txt | 1 + CharBuffer.cpp | 13 +++++ CharBuffer.h | 13 +++++ Network.cpp | 22 ++++++++- Network.h | 1 + NetworkLock.cpp | 83 ++++++++++++++++---------------- NetworkLock.h | 7 ++- NetworkOpener.cpp | 107 ++++++++++++++++++------------------------ NetworkOpener.h | 2 + NukiOpenerWrapper.cpp | 2 +- PresenceDetection.cpp | 13 ++--- PresenceDetection.h | 5 +- main.cpp | 7 ++- 13 files changed, 158 insertions(+), 118 deletions(-) create mode 100644 CharBuffer.cpp create mode 100644 CharBuffer.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 61f98e4..51c7871 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,6 +43,7 @@ include_directories(${PROJECT_NAME} set(SRCFILES Pins.h Config.h + CharBuffer.cpp Network.cpp MqttReceiver.h NetworkLock.cpp diff --git a/CharBuffer.cpp b/CharBuffer.cpp new file mode 100644 index 0000000..62b47b7 --- /dev/null +++ b/CharBuffer.cpp @@ -0,0 +1,13 @@ +#include "CharBuffer.h" + +void CharBuffer::initialize() +{ + _buffer = new char[CHAR_BUFFER_SIZE]; +} + +char *CharBuffer::get() +{ + return _buffer; +} + +char* CharBuffer::_buffer; diff --git a/CharBuffer.h b/CharBuffer.h new file mode 100644 index 0000000..4abaf87 --- /dev/null +++ b/CharBuffer.h @@ -0,0 +1,13 @@ +#pragma once + +#define CHAR_BUFFER_SIZE 4096 + +class CharBuffer +{ +public: + static void initialize(); + static char* get(); + +private: + static char* _buffer; +}; \ No newline at end of file diff --git a/Network.cpp b/Network.cpp index 8453f77..7c7fb7c 100644 --- a/Network.cpp +++ b/Network.cpp @@ -890,8 +890,28 @@ void Network::publishHASSConfigAccessLog(char *deviceType, const char *baseTopic "", "diagnostic", "", - { { "value_template", "{{ (value_json|selectattr('type', 'eq', 'LockAction')|selectattr('action', 'in', ['Lock', 'Unlock', 'Unlatch'])|first).authorizationName }}" }});} + { { "ic", "mdi:format-list-bulleted" }, + { "value_template", "{{ (value_json|selectattr('type', 'eq', 'LockAction')|selectattr('action', 'in', ['Lock', 'Unlock', 'Unlatch'])|first).authorizationName }}" }}); +} +void Network::publishHASSConfigKeypadAttemptInfo(char *deviceType, const char *baseTopic, char *name, char *uidString) +{ + publishHassTopic("sensor", + "keypad_status", + uidString, + "_keypad_stats", + "Keypad status", + name, + baseTopic, + mqtt_topic_lock_log, + deviceType, + "", + "", + "diagnostic", + "", + { { "ic", "mdi:drag-vertical" }, + { "value_template", "{% for state in value_json %} {% if state.type == 'KeypadAction' %} {{ state.completionStatus }} {% endif %} {% endfor %}" }}); +} void Network::publishHASSWifiRssiConfig(char *deviceType, const char *baseTopic, char *name, char *uidString) { diff --git a/Network.h b/Network.h index 9b1e839..2df975e 100644 --- a/Network.h +++ b/Network.h @@ -47,6 +47,7 @@ public: void publishHASSConfigLedBrightness(char* deviceType, const char* baseTopic, char* name, char* uidString); void publishHASSConfigSoundLevel(char* deviceType, const char* baseTopic, char* name, char* uidString); void publishHASSConfigAccessLog(char* deviceType, const char* baseTopic, char* name, char* uidString); + void publishHASSConfigKeypadAttemptInfo(char* deviceType, const char* baseTopic, char* name, char* uidString); void publishHASSWifiRssiConfig(char* deviceType, const char* baseTopic, char* name, char* uidString); void publishHASSBleRssiConfig(char* deviceType, const char* baseTopic, char* name, char* uidString); void removeHASSConfig(char* uidString); diff --git a/NetworkLock.cpp b/NetworkLock.cpp index 5669aa8..dbd458c 100644 --- a/NetworkLock.cpp +++ b/NetworkLock.cpp @@ -5,10 +5,14 @@ #include "PreferencesKeys.h" #include "Logger.h" #include "RestartReason.h" +#include "CharBuffer.h" +#include -NetworkLock::NetworkLock(Network* network, Preferences* preferences) +NetworkLock::NetworkLock(Network* network, Preferences* preferences, char* buffer, size_t bufferSize) : _network(network), - _preferences(preferences) + _preferences(preferences), + _buffer(buffer), + _bufferSize(bufferSize) { _configTopics.reserve(5); _configTopics.push_back(mqtt_topic_config_button_enabled); @@ -273,7 +277,6 @@ void NetworkLock::publishBinaryState(NukiLock::LockState lockState) } } - void NetworkLock::publishAuthorizationInfo(const std::list& logEntries) { char str[50]; @@ -283,7 +286,7 @@ void NetworkLock::publishAuthorizationInfo(const std::list& char authName[33]; memset(authName, 0, sizeof(authName)); - String json = "[\n"; + DynamicJsonDocument json(_bufferSize); for(const auto& log : logEntries) { @@ -294,90 +297,75 @@ void NetworkLock::publishAuthorizationInfo(const std::list& memcpy(authName, log.name, sizeof(log.name)); } - json.concat("{\n"); + auto entry = json.add(); - json.concat("\"index\": "); json.concat(log.index); json.concat(",\n"); - json.concat("\"authorizationId\": "); json.concat(log.authId); json.concat(",\n"); - - memset(str, 0, sizeof(str)); - memcpy(str, log.name, sizeof(log.name)); - json.concat("\"authorizationName\": \""); json.concat(str); json.concat("\",\n"); - - json.concat("\"timeYear\": "); json.concat(log.timeStampYear); json.concat(",\n"); - json.concat("\"timeMonth\": "); json.concat(log.timeStampMonth); json.concat(",\n"); - json.concat("\"timeDay\": "); json.concat(log.timeStampDay); json.concat(",\n"); - json.concat("\"timeHour\": "); json.concat(log.timeStampHour); json.concat(",\n"); - json.concat("\"timeMinute\": "); json.concat(log.timeStampMinute); json.concat(",\n"); - json.concat("\"timeSecond\": "); json.concat(log.timeStampSecond); json.concat(",\n"); + entry["index"] = log.index; + entry["authorizationId"] = log.authId; + entry["authorizationName"] = log.name; + entry["timeYear"] = log.timeStampYear; + entry["timeMonth"] = log.timeStampMonth; + entry["timeDay"] = log.timeStampDay; + entry["timeHour"] = log.timeStampHour; + entry["timeMinute"] = log.timeStampMinute; + entry["timeSecond"] = log.timeStampSecond; memset(str, 0, sizeof(str)); loggingTypeToString(log.loggingType, str); - json.concat("\"type\": \""); json.concat(str); json.concat("\",\n"); + entry["type"] = str; switch(log.loggingType) { case NukiLock::LoggingType::LockAction: memset(str, 0, sizeof(str)); NukiLock::lockactionToString((NukiLock::LockAction)log.data[0], str); - json.concat("\"action\": \""); json.concat(str); json.concat("\",\n"); + entry["action"] = str; memset(str, 0, sizeof(str)); NukiLock::triggerToString((NukiLock::Trigger)log.data[1], str); - json.concat("\"trigger\": \""); json.concat(str); json.concat("\",\n"); + entry["trigger"] = str; memset(str, 0, sizeof(str)); NukiLock::completionStatusToString((NukiLock::CompletionStatus)log.data[3], str); - json.concat("\"completionStatus\": \""); json.concat(str); json.concat("\"\n"); + entry["completionStatus"] = str; break; case NukiLock::LoggingType::KeypadAction: memset(str, 0, sizeof(str)); NukiLock::lockactionToString((NukiLock::LockAction)log.data[0], str); - json.concat("\"action\": \""); json.concat(str); json.concat("\",\n"); + entry["action"] = str; memset(str, 0, sizeof(str)); NukiLock::completionStatusToString((NukiLock::CompletionStatus)log.data[2], str); - json.concat("\"completionStatus\": \""); json.concat(str); json.concat("\"\n"); + entry["completionStatus"] = str; break; case NukiLock::LoggingType::DoorSensor: memset(str, 0, sizeof(str)); NukiLock::lockactionToString((NukiLock::LockAction)log.data[0], str); - json.concat("\"action\": \""); + switch(log.data[0]) { case 0: - json.concat("DoorOpened"); + entry["action"] = "DoorOpened"; break; case 1: - json.concat("DoorClosed"); + entry["action"] = "DoorClosed"; break; case 2: - json.concat("SensorJammed"); + entry["action"] = "SensorJammed"; break; default: - json.concat("Unknown"); + entry["action"] = "Unknown"; break; } - json.concat("\",\n"); memset(str, 0, sizeof(str)); NukiLock::completionStatusToString((NukiLock::CompletionStatus)log.data[2], str); - json.concat("\"completionStatus\": \""); json.concat(str); json.concat("\"\n"); + entry["completionStatus"] = str; break; } - - json.concat("}"); - if(&log == &logEntries.back()) - { - json.concat("\n"); - } - else - { - json.concat(",\n"); - } } - json.concat("]"); - publishString(mqtt_topic_lock_log, json); + serializeJson(json, reinterpret_cast(*_buffer)); + publishString(mqtt_topic_lock_log, _buffer); if(authFound) { @@ -540,6 +528,15 @@ void NetworkLock::publishHASSConfig(char *deviceType, const char *baseTopic, cha { _network->removeHASSConfigTopic("sensor", "last_action_authorization", uidString); } + + if(hasKeypad) + { + _network->publishHASSConfigKeypadAttemptInfo(deviceType, baseTopic, name, uidString); + } + else + { + _network->removeHASSConfigTopic("sensor", "keypad_status", uidString); + } } void NetworkLock::removeHASSConfig(char *uidString) diff --git a/NetworkLock.h b/NetworkLock.h index d529fc5..47fb12f 100644 --- a/NetworkLock.h +++ b/NetworkLock.h @@ -11,10 +11,12 @@ #include "Network.h" #include "QueryCommand.h" +#define LOCK_LOG_JSON_BUFFER_SIZE 2048 + class NetworkLock : public MqttReceiver { public: - explicit NetworkLock(Network* network, Preferences* preferences); + explicit NetworkLock(Network* network, Preferences* preferences, char* buffer, size_t bufferSize); virtual ~NetworkLock(); void initialize(); @@ -79,6 +81,9 @@ private: int _keypadCommandEnabled = 1; uint8_t _queryCommands = 0; + char* _buffer; + size_t _bufferSize; + bool (*_lockActionReceivedCallback)(const char* value) = nullptr; void (*_configUpdateReceivedCallback)(const char* path, const char* value) = nullptr; void (*_keypadCommandReceivedReceivedCallback)(const char* command, const uint& id, const String& name, const String& code, const int& enabled) = nullptr; diff --git a/NetworkOpener.cpp b/NetworkOpener.cpp index 0650a5d..72ec80c 100644 --- a/NetworkOpener.cpp +++ b/NetworkOpener.cpp @@ -4,6 +4,7 @@ #include "PreferencesKeys.h" #include "Logger.h" #include "Config.h" +#include NetworkOpener::NetworkOpener(Network* network, Preferences* preferences) : _preferences(preferences), @@ -268,130 +269,114 @@ void NetworkOpener::publishAuthorizationInfo(const std::list(*jsonOut)); + publishString(mqtt_topic_lock_log, jsonOut); + + delete jsonOut; if(authFound) { diff --git a/NetworkOpener.h b/NetworkOpener.h index a868dcf..9c1c2e4 100644 --- a/NetworkOpener.h +++ b/NetworkOpener.h @@ -9,6 +9,8 @@ #include "NukiOpenerConstants.h" #include "NetworkLock.h" +#define OPENER_LOG_JSON_BUFFER_SIZE 2048 + class NetworkOpener : public MqttReceiver { public: diff --git a/NukiOpenerWrapper.cpp b/NukiOpenerWrapper.cpp index e7ade08..cc33c25 100644 --- a/NukiOpenerWrapper.cpp +++ b/NukiOpenerWrapper.cpp @@ -646,7 +646,7 @@ void NukiOpenerWrapper::setupHASS() String baseTopic = _preferences->getString(preference_mqtt_opener_path); char uidString[20]; itoa(_nukiConfig.nukiId, uidString, 16); - _network->publishHASSConfig("Opener",baseTopic.c_str(),(char*)_nukiConfig.name,uidString, _publishAuthData, "deactivateRTO","activateRTO","electricStrikeActuation","locked","unlocked"); + _network->publishHASSConfig("Opener",baseTopic.c_str(),(char*)_nukiConfig.name,uidString, "deactivateRTO","activateRTO","electricStrikeActuation","locked","unlocked"); _hassSetupCompleted = true; Log->println("HASS setup for opener completed."); diff --git a/PresenceDetection.cpp b/PresenceDetection.cpp index 786f4cb..45a8702 100644 --- a/PresenceDetection.cpp +++ b/PresenceDetection.cpp @@ -1,14 +1,15 @@ #include "PresenceDetection.h" #include "PreferencesKeys.h" #include "Logger.h" +#include "CharBuffer.h" -PresenceDetection::PresenceDetection(Preferences* preferences, BleScanner::Scanner *bleScanner, Network* network) +PresenceDetection::PresenceDetection(Preferences* preferences, BleScanner::Scanner *bleScanner, Network* network, char* buffer, size_t bufferSize) : _preferences(preferences), _bleScanner(bleScanner), - _network(network) + _network(network), + _csv(buffer), + _bufferSize(bufferSize) { - _csv = new char[presence_detection_buffer_size]; - _timeout = _preferences->getInt(preference_presence_detection_timeout) * 1000; if(_timeout == 0) { @@ -41,7 +42,7 @@ void PresenceDetection::update() delay(3000); if(_timeout < 0) return; - memset(_csv, 0, presence_detection_buffer_size); + memset(_csv, 0, _bufferSize); if(_devices.size() == 0) { @@ -60,7 +61,7 @@ void PresenceDetection::update() } // Prevent csv buffer overflow - if(_csvIndex > presence_detection_buffer_size - (sizeof(it.second.name) + sizeof(it.second.address) + 10)) + if(_csvIndex > _bufferSize - (sizeof(it.second.name) + sizeof(it.second.address) + 10)) { break; } diff --git a/PresenceDetection.h b/PresenceDetection.h index 6cc210c..049af9f 100644 --- a/PresenceDetection.h +++ b/PresenceDetection.h @@ -13,12 +13,10 @@ struct PdDevice bool hasRssi = false; }; -#define presence_detection_buffer_size 4096 - class PresenceDetection : public BleScanner::Subscriber { public: - PresenceDetection(Preferences* preferences, BleScanner::Scanner* bleScanner, Network* network); + PresenceDetection(Preferences* preferences, BleScanner::Scanner* bleScanner, Network* network, char* buffer, size_t bufferSize); virtual ~PresenceDetection(); void initialize(); @@ -33,6 +31,7 @@ private: BleScanner::Scanner* _bleScanner; Network* _network; char* _csv = {0}; + size_t _bufferSize = 0; std::map _devices; int _timeout = 20000; int _csvIndex = 0; diff --git a/main.cpp b/main.cpp index b6ffd5b..ea7725e 100644 --- a/main.cpp +++ b/main.cpp @@ -13,6 +13,7 @@ #include "Logger.h" #include "Config.h" #include "RestartReason.h" +#include "CharBuffer.h" Network* network = nullptr; NetworkLock* networkLock = nullptr; @@ -170,6 +171,8 @@ void setup() bool firstStart = initPreferences(); initializeRestartReason(); + CharBuffer::initialize(); + if(preferences->getInt(preference_restart_timer) > 0) { restartTs = preferences->getInt(preference_restart_timer) * 60 * 1000; @@ -182,7 +185,7 @@ void setup() network = new Network(preferences, mqttLockPath); network->initialize(); - networkLock = new NetworkLock(network, preferences); + networkLock = new NetworkLock(network, preferences, CharBuffer::get(), CHAR_BUFFER_SIZE); networkLock->initialize(); if(openerEnabled) @@ -226,7 +229,7 @@ void setup() webCfgServer = new WebCfgServer(nuki, nukiOpener, network, ethServer, preferences, network->networkDeviceType() == NetworkDeviceType::WiFi); webCfgServer->initialize(); - presenceDetection = new PresenceDetection(preferences, bleScanner, network); + presenceDetection = new PresenceDetection(preferences, bleScanner, network, CharBuffer::get(), CHAR_BUFFER_SIZE); presenceDetection->initialize(); setupTasks(); From 04ebf17b1a2096ec691f3f0df80fe2d801a084cd Mon Sep 17 00:00:00 2001 From: technyon Date: Wed, 22 Mar 2023 23:06:13 +0100 Subject: [PATCH 08/12] use common buffer --- Network.cpp | 25 +++++++++++-------------- Network.h | 6 +++++- NetworkOpener.cpp | 16 ++++++++-------- NetworkOpener.h | 7 ++++--- main.cpp | 4 ++-- 5 files changed, 30 insertions(+), 28 deletions(-) diff --git a/Network.cpp b/Network.cpp index 7c7fb7c..70ee897 100644 --- a/Network.cpp +++ b/Network.cpp @@ -8,14 +8,17 @@ #include #include "RestartReason.h" #include "networkDevices/EthLan8720Device.h" +#include "CharBuffer.h" Network* Network::_inst = nullptr; unsigned long Network::_ignoreSubscriptionsTs = 0; RTC_NOINIT_ATTR char WiFi_fallbackDetect[14]; -Network::Network(Preferences *preferences, const String& maintenancePathPrefix) -: _preferences(preferences) +Network::Network(Preferences *preferences, const String& maintenancePathPrefix, char* buffer, size_t bufferSize) +: _preferences(preferences), + _buffer(buffer), + _bufferSize(bufferSize) { _inst = this; _hostname = _preferences->getString(preference_hostname); @@ -578,7 +581,6 @@ void Network::publishHASSConfig(char* deviceType, const char* baseTopic, char* n if (discoveryTopic != "") { - char* jsonOut = new char[JSON_BUFFER_SIZE]; DynamicJsonDocument json(JSON_BUFFER_SIZE); auto dev = json.createNestedObject("dev"); @@ -599,16 +601,14 @@ void Network::publishHASSConfig(char* deviceType, const char* baseTopic, char* n json["stat_unlocked"] = unlockedState; json["opt"] = "false"; - serializeJson(json, reinterpret_cast(*jsonOut)); + serializeJson(json, reinterpret_cast(*_buffer)); String path = discoveryTopic; path.concat("/lock/"); path.concat(uidString); path.concat("/smartlock/config"); - _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, jsonOut); - - delete jsonOut; + _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, _buffer); // Battery critical publishHassTopic("binary_sensor", @@ -910,7 +910,7 @@ void Network::publishHASSConfigKeypadAttemptInfo(char *deviceType, const char *b "diagnostic", "", { { "ic", "mdi:drag-vertical" }, - { "value_template", "{% for state in value_json %} {% if state.type == 'KeypadAction' %} {{ state.completionStatus }} {% endif %} {% endfor %}" }}); + { "value_template", "{{ (value_json|selectattr('type', 'eq', 'KeypadAction')|first).completionStatus }}" }}); } void Network::publishHASSWifiRssiConfig(char *deviceType, const char *baseTopic, char *name, char *uidString) @@ -984,8 +984,7 @@ void Network::publishHassTopic(const String& mqttDeviceType, if (discoveryTopic != "") { - char *jsonOut = new char[JSON_BUFFER_SIZE]; - DynamicJsonDocument json(JSON_BUFFER_SIZE); + DynamicJsonDocument json(CHAR_BUFFER_SIZE); // Battery level json.clear(); @@ -1022,7 +1021,7 @@ void Network::publishHassTopic(const String& mqttDeviceType, json[entry.first] = entry.second; } - serializeJson(json, reinterpret_cast(*jsonOut)); + serializeJson(json, reinterpret_cast(*_buffer)); String path = discoveryTopic; path.concat("/"); @@ -1033,9 +1032,7 @@ void Network::publishHassTopic(const String& mqttDeviceType, path.concat(mattDeviceName); path.concat("/config"); - _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, jsonOut); - - delete jsonOut; + _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, _buffer); } } diff --git a/Network.h b/Network.h index 2df975e..d3ec444 100644 --- a/Network.h +++ b/Network.h @@ -21,7 +21,7 @@ enum class NetworkDeviceType class Network { public: - explicit Network(Preferences* preferences, const String& maintenancePathPrefix); + explicit Network(Preferences* preferences, const String& maintenancePathPrefix, char* buffer, size_t bufferSize); void initialize(); bool update(); @@ -127,6 +127,10 @@ private: bool _mqttEnabled = true; static unsigned long _ignoreSubscriptionsTs; long _rssiPublishInterval = 0; + + char* _buffer; + size_t _bufferSize; + std::function _keepAliveCallback = nullptr; std::vector> _reconnectedCallbacks; diff --git a/NetworkOpener.cpp b/NetworkOpener.cpp index 72ec80c..fd76a8b 100644 --- a/NetworkOpener.cpp +++ b/NetworkOpener.cpp @@ -4,11 +4,14 @@ #include "PreferencesKeys.h" #include "Logger.h" #include "Config.h" +#include "CharBuffer.h" #include -NetworkOpener::NetworkOpener(Network* network, Preferences* preferences) +NetworkOpener::NetworkOpener(Network* network, Preferences* preferences, char* buffer, size_t bufferSize) : _preferences(preferences), - _network(network) + _network(network), + _buffer(buffer), + _bufferSize(bufferSize) { _configTopics.reserve(5); _configTopics.push_back(mqtt_topic_config_button_enabled); @@ -269,8 +272,7 @@ void NetworkOpener::publishAuthorizationInfo(const std::list(*jsonOut)); - publishString(mqtt_topic_lock_log, jsonOut); - - delete jsonOut; + serializeJson(json, reinterpret_cast(*_buffer)); + publishString(mqtt_topic_lock_log, _buffer); if(authFound) { diff --git a/NetworkOpener.h b/NetworkOpener.h index 9c1c2e4..ffd8840 100644 --- a/NetworkOpener.h +++ b/NetworkOpener.h @@ -9,12 +9,10 @@ #include "NukiOpenerConstants.h" #include "NetworkLock.h" -#define OPENER_LOG_JSON_BUFFER_SIZE 2048 - class NetworkOpener : public MqttReceiver { public: - explicit NetworkOpener(Network* network, Preferences* preferences); + explicit NetworkOpener(Network* network, Preferences* preferences, char* buffer, size_t bufferSize); virtual ~NetworkOpener() = default; void initialize(); @@ -85,6 +83,9 @@ private: unsigned long _resetLockStateTs = 0; uint8_t _queryCommands = 0; + char* _buffer; + size_t _bufferSize; + bool (*_lockActionReceivedCallback)(const char* value) = nullptr; void (*_configUpdateReceivedCallback)(const char* path, const char* value) = nullptr; void (*_keypadCommandReceivedReceivedCallback)(const char* command, const uint& id, const String& name, const String& code, const int& enabled) = nullptr; diff --git a/main.cpp b/main.cpp index ea7725e..7fe8644 100644 --- a/main.cpp +++ b/main.cpp @@ -182,7 +182,7 @@ void setup() openerEnabled = preferences->getBool(preference_opener_enabled); const String mqttLockPath = preferences->getString(preference_mqtt_lock_path); - network = new Network(preferences, mqttLockPath); + network = new Network(preferences, mqttLockPath, CharBuffer::get(), CHAR_BUFFER_SIZE); network->initialize(); networkLock = new NetworkLock(network, preferences, CharBuffer::get(), CHAR_BUFFER_SIZE); @@ -190,7 +190,7 @@ void setup() if(openerEnabled) { - networkOpener = new NetworkOpener(network, preferences); + networkOpener = new NetworkOpener(network, preferences, CharBuffer::get(), CHAR_BUFFER_SIZE); networkOpener->initialize(); } From 8e6b464563f3b8a85bf9d85eca95b6710356fb3b Mon Sep 17 00:00:00 2001 From: technyon Date: Wed, 22 Mar 2023 23:15:38 +0100 Subject: [PATCH 09/12] use common buffer --- Network.cpp | 7 +++---- Network.h | 2 +- NetworkLock.cpp | 3 +-- NetworkOpener.cpp | 5 ++--- NetworkOpener.h | 2 +- 5 files changed, 8 insertions(+), 11 deletions(-) diff --git a/Network.cpp b/Network.cpp index 70ee897..8af3c3c 100644 --- a/Network.cpp +++ b/Network.cpp @@ -8,7 +8,6 @@ #include #include "RestartReason.h" #include "networkDevices/EthLan8720Device.h" -#include "CharBuffer.h" Network* Network::_inst = nullptr; unsigned long Network::_ignoreSubscriptionsTs = 0; @@ -601,7 +600,7 @@ void Network::publishHASSConfig(char* deviceType, const char* baseTopic, char* n json["stat_unlocked"] = unlockedState; json["opt"] = "false"; - serializeJson(json, reinterpret_cast(*_buffer)); + serializeJson(json, _buffer, _bufferSize); String path = discoveryTopic; path.concat("/lock/"); @@ -984,7 +983,7 @@ void Network::publishHassTopic(const String& mqttDeviceType, if (discoveryTopic != "") { - DynamicJsonDocument json(CHAR_BUFFER_SIZE); + DynamicJsonDocument json(_bufferSize); // Battery level json.clear(); @@ -1021,7 +1020,7 @@ void Network::publishHassTopic(const String& mqttDeviceType, json[entry.first] = entry.second; } - serializeJson(json, reinterpret_cast(*_buffer)); + serializeJson(json, _buffer, _bufferSize); String path = discoveryTopic; path.concat("/"); diff --git a/Network.h b/Network.h index d3ec444..ba66907 100644 --- a/Network.h +++ b/Network.h @@ -129,7 +129,7 @@ private: long _rssiPublishInterval = 0; char* _buffer; - size_t _bufferSize; + const size_t _bufferSize; std::function _keepAliveCallback = nullptr; std::vector> _reconnectedCallbacks; diff --git a/NetworkLock.cpp b/NetworkLock.cpp index dbd458c..6e332a7 100644 --- a/NetworkLock.cpp +++ b/NetworkLock.cpp @@ -5,7 +5,6 @@ #include "PreferencesKeys.h" #include "Logger.h" #include "RestartReason.h" -#include "CharBuffer.h" #include NetworkLock::NetworkLock(Network* network, Preferences* preferences, char* buffer, size_t bufferSize) @@ -364,7 +363,7 @@ void NetworkLock::publishAuthorizationInfo(const std::list& } } - serializeJson(json, reinterpret_cast(*_buffer)); + serializeJson(json, _buffer, _bufferSize); publishString(mqtt_topic_lock_log, _buffer); if(authFound) diff --git a/NetworkOpener.cpp b/NetworkOpener.cpp index fd76a8b..ab2fabe 100644 --- a/NetworkOpener.cpp +++ b/NetworkOpener.cpp @@ -4,7 +4,6 @@ #include "PreferencesKeys.h" #include "Logger.h" #include "Config.h" -#include "CharBuffer.h" #include NetworkOpener::NetworkOpener(Network* network, Preferences* preferences, char* buffer, size_t bufferSize) @@ -272,7 +271,7 @@ void NetworkOpener::publishAuthorizationInfo(const std::list(*_buffer)); + serializeJson(json, _buffer, _bufferSize); publishString(mqtt_topic_lock_log, _buffer); if(authFound) diff --git a/NetworkOpener.h b/NetworkOpener.h index ffd8840..2f42d53 100644 --- a/NetworkOpener.h +++ b/NetworkOpener.h @@ -84,7 +84,7 @@ private: uint8_t _queryCommands = 0; char* _buffer; - size_t _bufferSize; + const size_t _bufferSize; bool (*_lockActionReceivedCallback)(const char* value) = nullptr; void (*_configUpdateReceivedCallback)(const char* path, const char* value) = nullptr; From fb8bd9a5b38c139cc5134cd2119a89be1c54da94 Mon Sep 17 00:00:00 2001 From: technyon Date: Wed, 22 Mar 2023 23:23:42 +0100 Subject: [PATCH 10/12] compile fix --- Network.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Network.cpp b/Network.cpp index 7b6dab8..1bbfcae 100644 --- a/Network.cpp +++ b/Network.cpp @@ -293,7 +293,7 @@ bool Network::update() publishString(_maintenancePathPrefix, mqtt_topic_restart_reason_esp, getEspRestartReason().c_str()); } if (!_versionPublished) { - publishString(mqtt_topic_info_nuki_hub_version, NUKI_HUB_VERSION); + publishString(_maintenancePathPrefix, mqtt_topic_info_nuki_hub_version, NUKI_HUB_VERSION); _versionPublished = true; } _lastMaintenanceTs = ts; From 847cb2b6cc6587086eb5b061c6b42f3883b508c2 Mon Sep 17 00:00:00 2001 From: technyon Date: Thu, 23 Mar 2023 19:01:22 +0100 Subject: [PATCH 11/12] publish network device name via mqtt --- MqttTopics.h | 3 ++- Network.cpp | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/MqttTopics.h b/MqttTopics.h index 24039d8..dce7bf2 100644 --- a/MqttTopics.h +++ b/MqttTopics.h @@ -58,4 +58,5 @@ #define mqtt_topic_log "/maintenance/log" #define mqtt_topic_freeheap "/maintenance/freeHeap" #define mqtt_topic_restart_reason_fw "/maintenance/restartReasonNukiHub" -#define mqtt_topic_restart_reason_esp "/maintenance/restartReasonNukiEsp" \ No newline at end of file +#define mqtt_topic_restart_reason_esp "/maintenance/restartReasonNukiEsp" +#define mqtt_topic_network_device "/maintenance/networkDevice" \ No newline at end of file diff --git a/Network.cpp b/Network.cpp index 1bbfcae..8c87486 100644 --- a/Network.cpp +++ b/Network.cpp @@ -403,6 +403,7 @@ bool Network::reconnect() if(_firstConnect) { _firstConnect = false; + publishString(_maintenancePathPrefix, mqtt_topic_network_device, _device->deviceName().c_str()); for(const auto& it : _initTopics) { _device->mqttPublish(it.first.c_str(), MQTT_QOS_LEVEL, true, it.second.c_str()); From 0758df21bb31935a5a4d739504b5488bfe6ea7fc Mon Sep 17 00:00:00 2001 From: technyon Date: Thu, 23 Mar 2023 19:10:46 +0100 Subject: [PATCH 12/12] fix for W5500 detection --- Config.h | 2 +- networkDevices/W5500Device.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Config.h b/Config.h index f9c63a0..b855cc5 100644 --- a/Config.h +++ b/Config.h @@ -1,6 +1,6 @@ #pragma once -#define NUKI_HUB_VERSION "8.19-pre-1" +#define NUKI_HUB_VERSION "8.19-pre-2" #define MQTT_QOS_LEVEL 1 #define MQTT_CLEAN_SESSIONS false diff --git a/networkDevices/W5500Device.cpp b/networkDevices/W5500Device.cpp index 6d4e517..a6d5801 100644 --- a/networkDevices/W5500Device.cpp +++ b/networkDevices/W5500Device.cpp @@ -115,6 +115,7 @@ ReconnectStatus W5500Device::reconnect() } else { + hardwareFound = true; _hasDHCPAddress = true; dhcpRetryCnt = 1000; if(_ipConfiguration->dhcpEnabled())