#pragma once #include #include #include #include "networkDevices/NetworkDevice.h" #include "networkDevices/IPConfiguration.h" #include "enums/NetworkDeviceType.h" #include "util/NetworkUtil.h" #include "EspMillis.h" #ifndef NUKI_HUB_UPDATER #include "MqttReceiver.h" #include "MqttTopics.h" #include "Gpio.h" #include #include "NukiConstants.h" #include "HomeAssistantDiscovery.h" #endif class NukiNetwork { public: void initialize(); void readSettings(); bool update(); void reconfigureDevice(); void scan(bool passive = false, bool async = true); bool isApOpen(); bool isConnected(); bool mqttConnected(); bool wifiConnected(); void clearWifiFallback(); const String networkDeviceName() const; const String networkBSSID() const; const NetworkDeviceType networkDeviceType(); void setKeepAliveCallback(std::function reconnectTick); NetworkDevice* device(); #ifdef NUKI_HUB_UPDATER explicit NukiNetwork(Preferences* preferences); #else explicit NukiNetwork(Preferences* preferences, Gpio* gpio, const String& maintenancePathPrefix, char* buffer, size_t bufferSize); void registerMqttReceiver(MqttReceiver* receiver); void disableAutoRestarts(); // disable on OTA start void disableMqtt(); String localIP(); void subscribe(const char* prefix, const char* path); void initTopic(const char* prefix, const char* path, const char* value); void publishFloat(const char* prefix, const char* topic, const float value, bool retain, const uint8_t precision = 2); void publishInt(const char* prefix, const char* topic, const int value, bool retain); void publishUInt(const char* prefix, const char* topic, const unsigned int value, bool retain); void publishULong(const char* prefix, const char* topic, const unsigned long value, bool retain); void publishLongLong(const char* prefix, const char* topic, int64_t value, bool retain); void publishBool(const char* prefix, const char* topic, const bool value, bool retain); void publishString(const char* prefix, const char* topic, const char* value, bool retain); void publish(const char* prefix, const char *topic, const char *value, bool retain); void publish(const char* path, const char *value, bool retain); void removeTopic(const String& mqttPath, const String& mqttTopic); void batteryTypeToString(const Nuki::BatteryType battype, char* str); void advertisingModeToString(const Nuki::AdvertisingMode advmode, char* str); void timeZoneIdToString(const Nuki::TimeZoneId timeZoneId, char* str); void setupHASS(int type, uint32_t nukiId, char* nukiName, const char* firmwareVersion, const char* hardwareVersion, bool hasDoorSensor, bool hasKeypad); void disableHASS(); void publishHassTopic(const String& mqttDeviceType, const String& mqttDeviceName, 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> additionalEntries ); void removeHassTopic(const String& mqttDeviceType, const String& mqttDeviceName, const String& uidString); int mqttConnectionState(); // 0 = not connected; 1 = connected; 2 = connected and mqtt processed bool mqttRecentlyConnected(); bool pathEquals(const char* prefix, const char* path, const char* referencePath); uint16_t subscribe(const char* topic, uint8_t qos); void addReconnectedCallback(std::function reconnectedCallback); #endif private: void setupDevice(); bool reconnect(); static NukiNetwork* _inst; const char* _latestVersion; Preferences* _preferences; IPConfiguration* _ipConfiguration = nullptr; String _hostname; char _hostnameArr[101] = {0}; char _nukiHubPath[181] = {0}; NetworkDevice* _device = nullptr; std::function _keepAliveCallback = nullptr; std::vector> _reconnectedCallbacks; NetworkDeviceType _networkDeviceType = (NetworkDeviceType)-1; bool _firstBootAfterDeviceChange = false; bool _webEnabled = true; #ifndef NUKI_HUB_UPDATER static void onMqttDataReceivedCallback(const espMqttClientTypes::MessageProperties& properties, const char* topic, const uint8_t* payload, size_t len, size_t index, size_t total); void onMqttDataReceived(const espMqttClientTypes::MessageProperties& properties, const char* topic, const uint8_t* payload, size_t& len, size_t& index, size_t& total); void onMqttDataReceived(const char* topic, byte* payload, const unsigned int length); void onMqttConnect(const bool& sessionPresent); void onMqttDisconnect(const espMqttClientTypes::DisconnectReason& reason); void parseGpioTopics(const espMqttClientTypes::MessageProperties& properties, const char* topic, const uint8_t* payload, size_t& len, size_t& index, size_t& total); void gpioActionCallback(const GpioAction& action, const int& pin); bool comparePrefixedPath(const char* fullPath, const char* subPath); void buildMqttPath(const char *path, char *outPath); void buildMqttPath(char* outPath, std::initializer_list paths); const char* _lastWillPayload = "offline"; char _mqttConnectionStateTopic[211] = {0}; String _lockPath; HomeAssistantDiscovery* _hadiscovery = nullptr; Gpio* _gpio; int _mqttConnectionState = 0; int _mqttConnectCounter = 0; int _mqttPort = 1883; long _mqttConnectedTs = -1; bool _connectReplyReceived = false; bool _firstDisconnected = true; int64_t _publishedUpTime = 0; int64_t _nextReconnect = 0; char _mqttBrokerAddr[101] = {0}; char _mqttUser[31] = {0}; char _mqttPass[31] = {0}; char _maintenancePathPrefix[181] = {0}; int _networkTimeout = 0; std::vector _mqttReceivers; bool _restartOnDisconnect = false; bool _disableNetworkIfNotConnected = false; bool _checkUpdates = false; bool _firstConnect = true; bool _publishDebugInfo = false; bool _logIp = true; bool _retainGpio = false; std::vector _subscribedTopics; std::map _initTopics; int64_t _lastConnectedTs = 0; int64_t _lastMaintenanceTs = 0; int64_t _lastUpdateCheckTs = 0; int64_t _lastRssiTs = 0; bool _mqttEnabled = true; int _rssiPublishInterval = 0; std::map _gpioTs; char* _buffer; const size_t _bufferSize; int8_t _lastRssi = 127; #endif };