diff --git a/MqttTopics.h b/MqttTopics.h index 351ebe2..4909b81 100644 --- a/MqttTopics.h +++ b/MqttTopics.h @@ -39,4 +39,5 @@ #define mqtt_topic_reset "/maintenance/reset" #define mqtt_topic_uptime "/maintenance/uptime" +#define mqtt_topic_wifi_rssi "/maintenance/wifiRssi" #define mqtt_topic_freeheap "/maintenance/freeHeap" \ No newline at end of file diff --git a/Network.cpp b/Network.cpp index e2714ff..cc6b908 100644 --- a/Network.cpp +++ b/Network.cpp @@ -7,11 +7,19 @@ Network* Network::_inst = nullptr; -Network::Network(const NetworkDeviceType networkDevice, Preferences *preferences) +Network::Network(const NetworkDeviceType networkDevice, Preferences *preferences, const String& maintenancePathPrefix) : _preferences(preferences) { _inst = this; _hostname = _preferences->getString(preference_hostname); + + memset(_maintenancePathPrefix, 0, sizeof(_maintenancePathPrefix)); + + size_t len = maintenancePathPrefix.length(); + for(int i=0; i < len; i++) + { + _maintenancePathPrefix[i] = maintenancePathPrefix.charAt(i); + } setupDevice(networkDevice); } @@ -147,6 +155,12 @@ int Network::update() _presenceCsv = nullptr; } + if(_device->signalStrength() != 127 && ts - _lastMaintenancePublish > 2000) + { + publishInt(_maintenancePathPrefix, mqtt_topic_wifi_rssi, _device->signalStrength()); + _lastMaintenancePublish = ts; + } + _device->mqttClient()->loop(); return 0; } diff --git a/Network.h b/Network.h index e3b72cb..cfa5109 100644 --- a/Network.h +++ b/Network.h @@ -15,7 +15,7 @@ enum class NetworkDeviceType class Network { public: - explicit Network(const NetworkDeviceType networkDevice, Preferences* preferences); + explicit Network(const NetworkDeviceType networkDevice, Preferences* preferences, const String& maintenancePathPrefix); void initialize(); int update(); @@ -63,6 +63,7 @@ private: char _mqttUser[31] = {0}; char _mqttPass[31] = {0}; char _mqttPresencePrefix[181] = {0}; + char _maintenancePathPrefix[181] = {0}; int _networkTimeout = 0; std::vector _mqttReceivers; char* _presenceCsv = nullptr; @@ -72,4 +73,5 @@ private: std::map _initTopics; unsigned long _lastConnectedTs = 0; + unsigned long _lastMaintenancePublish = 0; }; diff --git a/main.cpp b/main.cpp index 910be82..76c4328 100644 --- a/main.cpp +++ b/main.cpp @@ -173,7 +173,8 @@ void setup() // const NetworkDeviceType networkDevice = NetworkDeviceType::WiFi; const NetworkDeviceType networkDevice = digitalRead(NETWORK_SELECT) == HIGH ? NetworkDeviceType::WiFi : NetworkDeviceType::W5500; - network = new Network(networkDevice, preferences); + const String mqttLockPath = preferences->getString(preference_mqtt_lock_path); + network = new Network(networkDevice, preferences, mqttLockPath); network->initialize(); networkLock = new NetworkLock(network, preferences); networkLock->initialize(); diff --git a/networkDevices/NetworkDevice.h b/networkDevices/NetworkDevice.h index 7fc65bf..0aa0dcb 100644 --- a/networkDevices/NetworkDevice.h +++ b/networkDevices/NetworkDevice.h @@ -19,6 +19,7 @@ public: virtual void update() = 0; virtual bool isConnected() = 0; + virtual int8_t signalStrength() = 0; protected: const uint16_t _mqttMaxBufferSize = 6144; diff --git a/networkDevices/W5500Device.cpp b/networkDevices/W5500Device.cpp index 1b852cb..bf40811 100644 --- a/networkDevices/W5500Device.cpp +++ b/networkDevices/W5500Device.cpp @@ -165,3 +165,8 @@ void W5500Device::update() { _maintainResult = Ethernet.maintain(); } + +int8_t W5500Device::signalStrength() +{ + return 127; +} diff --git a/networkDevices/W5500Device.h b/networkDevices/W5500Device.h index a0ade7e..d18368e 100644 --- a/networkDevices/W5500Device.h +++ b/networkDevices/W5500Device.h @@ -19,6 +19,8 @@ public: virtual bool isConnected(); + int8_t signalStrength() override; + virtual PubSubClient *mqttClient(); private: diff --git a/networkDevices/WifiDevice.cpp b/networkDevices/WifiDevice.cpp index 8c3c564..0445ca2 100644 --- a/networkDevices/WifiDevice.cpp +++ b/networkDevices/WifiDevice.cpp @@ -130,3 +130,8 @@ void WifiDevice::onDisconnected() ESP.restart(); } } + +int8_t WifiDevice::signalStrength() +{ + return WiFi.RSSI(); +} diff --git a/networkDevices/WifiDevice.h b/networkDevices/WifiDevice.h index 9161848..cd517d7 100644 --- a/networkDevices/WifiDevice.h +++ b/networkDevices/WifiDevice.h @@ -20,6 +20,8 @@ public: virtual bool isConnected(); + int8_t signalStrength() override; + virtual PubSubClient *mqttClient(); private: