refactor: remove ESP8266 support and legacy flash wrappers

This commit is contained in:
Yurii committed 2026-10-21 04:34:00 +03:00
1 parent 959a15c11f
commit b72bccb3d7
24 files changed
+2027 -2415

No files matched your search

+3 -1
View File
@@ -14,6 +14,8 @@
![Integration with HomeAssistant](/assets/poster-3.png) ![Integration with HomeAssistant](/assets/poster-3.png)
## Features ## Features
The current version targets ESP32-based boards.
- DHW temperature control - DHW temperature control
- Heating temperature control - Heating temperature control
- Smart heating temperature control modes: - Smart heating temperature control modes:
@@ -81,7 +83,7 @@ Anyone is welcome to add their native language as a [new localization](https://h
</a> </a>
## Gratitude ## Gratitude
* To the developers of the libraries used: [OpenTherm Library](https://github.com/ihormelnyk/opentherm_library), [ESP8266Scheduler](https://github.com/nrwiersma/ESP8266Scheduler), [ArduinoJson](https://github.com/bblanchon/ArduinoJson), [NimBLE-Arduino](https://github.com/h2zero/NimBLE-Arduino), [ArduinoMqttClient](https://github.com/arduino-libraries/ArduinoMqttClient), [ESPTelnet](https://github.com/LennartHennigs/ESPTelnet), [FileData](https://github.com/GyverLibs/FileData), [GyverPID](https://github.com/GyverLibs/GyverPID), [GyverBlinker](https://github.com/GyverLibs/GyverBlinker), [OneWireNg](https://github.com/pstolarz/OneWireNg) & [OneWire](https://github.com/PaulStoffregen/OneWire) * To the developers of the libraries used: [OpenTherm Library](https://github.com/ihormelnyk/opentherm_library), [ESP32Scheduler](https://github.com/laxilef/ESP32Scheduler), [ArduinoJson](https://github.com/bblanchon/ArduinoJson), [NimBLE-Arduino](https://github.com/h2zero/NimBLE-Arduino), [ArduinoMqttClient](https://github.com/arduino-libraries/ArduinoMqttClient), [ESPTelnet](https://github.com/LennartHennigs/ESPTelnet), [FileData](https://github.com/GyverLibs/FileData), [GyverPID](https://github.com/GyverLibs/GyverPID), [GyverBlinker](https://github.com/GyverLibs/GyverBlinker), [OneWireNg](https://github.com/pstolarz/OneWireNg) & [OneWire](https://github.com/PaulStoffregen/OneWire)
* To the [PlatformIO](https://platformio.org/) Team * To the [PlatformIO](https://platformio.org/) Team
* To the team and contributors of the [pioarduino](https://github.com/pioarduino/platform-espressif32) project * To the team and contributors of the [pioarduino](https://github.com/pioarduino/platform-espressif32) project
* To the [BrowserStack](https://www.browserstack.com/) team. This project is tested with BrowserStack. * To the [BrowserStack](https://www.browserstack.com/) team. This project is tested with BrowserStack.
-20
View File
@@ -14,17 +14,8 @@ public:
void send(int code, T contentType, const JsonVariantConst content, bool pretty = false) { void send(int code, T contentType, const JsonVariantConst content, bool pretty = false) {
auto contentLength = pretty ? measureJsonPretty(content) : measureJson(content); auto contentLength = pretty ? measureJsonPretty(content) : measureJson(content);
#ifdef ARDUINO_ARCH_ESP8266
if (!this->webServer->chunkedResponseModeStart(code, contentType)) {
this->webServer->send(505, F("text/html"), F("HTTP1.1 required"));
return;
}
this->webServer->setContentLength(contentLength);
#else
this->webServer->setContentLength(contentLength); this->webServer->setContentLength(contentLength);
this->webServer->send(code, contentType, emptyString); this->webServer->send(code, contentType, emptyString);
#endif
if (pretty) { if (pretty) {
serializeJsonPretty(content, *this); serializeJsonPretty(content, *this);
@@ -35,11 +26,7 @@ public:
this->flush(); this->flush();
#ifdef ARDUINO_ARCH_ESP8266
this->webServer->chunkedResponseFinalize();
#else
this->webServer->sendContent(emptyString); this->webServer->sendContent(emptyString);
#endif
} }
size_t write(uint8_t c) { size_t write(uint8_t c) {
@@ -78,10 +65,6 @@ public:
return; return;
} }
#ifdef ARDUINO_ARCH_ESP8266
::optimistic_yield(1000);
#endif
auto& client = this->webServer->client(); auto& client = this->webServer->client();
if (client.connected()) { if (client.connected()) {
this->webServer->sendContent((const char*)this->buffer, this->bufferPos); this->webServer->sendContent((const char*)this->buffer, this->bufferPos);
@@ -89,9 +72,6 @@ public:
this->bufferPos = 0; this->bufferPos = 0;
#ifdef ARDUINO_ARCH_ESP8266
::optimistic_yield(1000);
#endif
} }
protected: protected:
@@ -53,23 +53,23 @@ public:
return false; return false;
} }
doc[FPSTR(HA_DEVICE)][FPSTR(HA_IDENTIFIERS)][0] = this->devicePrefix; doc[HA_DEVICE][HA_IDENTIFIERS][0] = this->devicePrefix;
doc[FPSTR(HA_DEVICE)][FPSTR(HA_SW_VERSION)] = this->deviceVersion; doc[HA_DEVICE][HA_SW_VERSION] = this->deviceVersion;
if (this->deviceManufacturer != nullptr) { if (this->deviceManufacturer != nullptr) {
doc[FPSTR(HA_DEVICE)][FPSTR(HA_MANUFACTURER)] = this->deviceManufacturer; doc[HA_DEVICE][HA_MANUFACTURER] = this->deviceManufacturer;
} }
if (this->deviceModel != nullptr) { if (this->deviceModel != nullptr) {
doc[FPSTR(HA_DEVICE)][FPSTR(HA_MODEL)] = this->deviceModel; doc[HA_DEVICE][HA_MODEL] = this->deviceModel;
} }
if (this->deviceName != nullptr) { if (this->deviceName != nullptr) {
doc[FPSTR(HA_DEVICE)][FPSTR(HA_NAME)] = this->deviceName; doc[HA_DEVICE][HA_NAME] = this->deviceName;
} }
if (this->deviceConfigUrl != nullptr) { if (this->deviceConfigUrl != nullptr) {
doc[FPSTR(HA_DEVICE)][FPSTR(HA_CONF_URL)] = this->deviceConfigUrl; doc[HA_DEVICE][HA_CONF_URL] = this->deviceConfigUrl;
} }
bool result = this->writer->publish(topic, doc, true); bool result = this->writer->publish(topic, doc, true);
@@ -110,7 +110,7 @@ public:
topic.concat(this->devicePrefix); topic.concat(this->devicePrefix);
topic.concat(nameSeparator); topic.concat(nameSeparator);
topic.concat(name); topic.concat(name);
topic.concat(F("/config")); topic.concat("/config");
return topic; return topic;
} }
+71 -74
View File
@@ -1,78 +1,75 @@
#pragma once #pragma once
#ifndef PROGMEM
#define PROGMEM // NOLINT
#endif
const char HA_ENTITY_BINARY_SENSOR[] PROGMEM = "binary_sensor"; const char HA_ENTITY_BINARY_SENSOR[] = "binary_sensor";
const char HA_ENTITY_BUTTON[] PROGMEM = "button"; const char HA_ENTITY_BUTTON[] = "button";
const char HA_ENTITY_FAN[] PROGMEM = "fan"; const char HA_ENTITY_FAN[] = "fan";
const char HA_ENTITY_CLIMATE[] PROGMEM = "climate"; const char HA_ENTITY_CLIMATE[] = "climate";
const char HA_ENTITY_NUMBER[] PROGMEM = "number"; const char HA_ENTITY_NUMBER[] = "number";
const char HA_ENTITY_SELECT[] PROGMEM = "select"; const char HA_ENTITY_SELECT[] = "select";
const char HA_ENTITY_SENSOR[] PROGMEM = "sensor"; const char HA_ENTITY_SENSOR[] = "sensor";
const char HA_ENTITY_SWITCH[] PROGMEM = "switch"; const char HA_ENTITY_SWITCH[] = "switch";
// https://www.home-assistant.io/integrations/mqtt/#supported-abbreviations-in-mqtt-discovery-messages // https://www.home-assistant.io/integrations/mqtt/#supported-abbreviations-in-mqtt-discovery-messages
const char HA_DEFAULT_ENTITY_ID[] PROGMEM = "def_ent_id"; // "default_entity_id " const char HA_DEFAULT_ENTITY_ID[] = "def_ent_id"; // "default_entity_id "
const char HA_DEVICE[] PROGMEM = "dev"; // "device" const char HA_DEVICE[] = "dev"; // "device"
const char HA_IDENTIFIERS[] PROGMEM = "ids"; // "identifiers" const char HA_IDENTIFIERS[] = "ids"; // "identifiers"
const char HA_SW_VERSION[] PROGMEM = "sw"; // "sw_version" const char HA_SW_VERSION[] = "sw"; // "sw_version"
const char HA_MANUFACTURER[] PROGMEM = "mf"; // "manufacturer" const char HA_MANUFACTURER[] = "mf"; // "manufacturer"
const char HA_MODEL[] PROGMEM = "mdl"; // "model" const char HA_MODEL[] = "mdl"; // "model"
const char HA_NAME[] PROGMEM = "name"; const char HA_NAME[] = "name";
const char HA_CONF_URL[] PROGMEM = "cu"; // "configuration_url" const char HA_CONF_URL[] = "cu"; // "configuration_url"
const char HA_COMMAND_TOPIC[] PROGMEM = "cmd_t"; // "command_topic" const char HA_COMMAND_TOPIC[] = "cmd_t"; // "command_topic"
const char HA_COMMAND_TEMPLATE[] PROGMEM = "cmd_tpl"; // "command_template" const char HA_COMMAND_TEMPLATE[] = "cmd_tpl"; // "command_template"
const char HA_ENABLED_BY_DEFAULT[] PROGMEM = "en"; // "enabled_by_default" const char HA_ENABLED_BY_DEFAULT[] = "en"; // "enabled_by_default"
const char HA_UNIQUE_ID[] PROGMEM = "uniq_id"; // "unique_id" const char HA_UNIQUE_ID[] = "uniq_id"; // "unique_id"
const char HA_ENTITY_CATEGORY[] PROGMEM = "ent_cat"; // "entity_category" const char HA_ENTITY_CATEGORY[] = "ent_cat"; // "entity_category"
const char HA_ENTITY_CATEGORY_DIAGNOSTIC[] PROGMEM = "diagnostic"; const char HA_ENTITY_CATEGORY_DIAGNOSTIC[] = "diagnostic";
const char HA_ENTITY_CATEGORY_CONFIG[] PROGMEM = "config"; const char HA_ENTITY_CATEGORY_CONFIG[] = "config";
const char HA_STATE_TOPIC[] PROGMEM = "stat_t"; // "state_topic" const char HA_STATE_TOPIC[] = "stat_t"; // "state_topic"
const char HA_VALUE_TEMPLATE[] PROGMEM = "val_tpl"; // "value_template" const char HA_VALUE_TEMPLATE[] = "val_tpl"; // "value_template"
const char HA_OPTIONS[] PROGMEM = "ops"; // "options" const char HA_OPTIONS[] = "ops"; // "options"
const char HA_AVAILABILITY[] PROGMEM = "avty"; // "availability" const char HA_AVAILABILITY[] = "avty"; // "availability"
const char HA_AVAILABILITY_MODE[] PROGMEM = "avty_mode"; // "availability_mode" const char HA_AVAILABILITY_MODE[] = "avty_mode"; // "availability_mode"
const char HA_TOPIC[] PROGMEM = "t"; // "topic" const char HA_TOPIC[] = "t"; // "topic"
const char HA_DEVICE_CLASS[] PROGMEM = "dev_cla"; // "device_class" const char HA_DEVICE_CLASS[] = "dev_cla"; // "device_class"
const char HA_UNIT_OF_MEASUREMENT[] PROGMEM = "unit_of_meas"; // "unit_of_measurement" const char HA_UNIT_OF_MEASUREMENT[] = "unit_of_meas"; // "unit_of_measurement"
const char HA_UNIT_OF_MEASUREMENT_C[] PROGMEM = "°C"; const char HA_UNIT_OF_MEASUREMENT_C[] = "°C";
const char HA_UNIT_OF_MEASUREMENT_F[] PROGMEM = "°F"; const char HA_UNIT_OF_MEASUREMENT_F[] = "°F";
const char HA_UNIT_OF_MEASUREMENT_PERCENT[] PROGMEM = "%"; const char HA_UNIT_OF_MEASUREMENT_PERCENT[] = "%";
const char HA_UNIT_OF_MEASUREMENT_L_MIN[] PROGMEM = "L/min"; const char HA_UNIT_OF_MEASUREMENT_L_MIN[] = "L/min";
const char HA_UNIT_OF_MEASUREMENT_GAL_MIN[] PROGMEM = "gal/min"; const char HA_UNIT_OF_MEASUREMENT_GAL_MIN[] = "gal/min";
const char HA_ICON[] PROGMEM = "ic"; // "icon" const char HA_ICON[] = "ic"; // "icon"
const char HA_MIN[] PROGMEM = "min"; const char HA_MIN[] = "min";
const char HA_MAX[] PROGMEM = "max"; const char HA_MAX[] = "max";
const char HA_STEP[] PROGMEM = "step"; const char HA_STEP[] = "step";
const char HA_MODE[] PROGMEM = "mode"; const char HA_MODE[] = "mode";
const char HA_MODE_BOX[] PROGMEM = "box"; const char HA_MODE_BOX[] = "box";
const char HA_STATE_ON[] PROGMEM = "stat_on"; // "state_on" const char HA_STATE_ON[] = "stat_on"; // "state_on"
const char HA_STATE_OFF[] PROGMEM = "stat_off"; // "state_off" const char HA_STATE_OFF[] = "stat_off"; // "state_off"
const char HA_PAYLOAD_ON[] PROGMEM = "pl_on"; // "payload_on" const char HA_PAYLOAD_ON[] = "pl_on"; // "payload_on"
const char HA_PAYLOAD_OFF[] PROGMEM = "pl_off"; // "payload_off" const char HA_PAYLOAD_OFF[] = "pl_off"; // "payload_off"
const char HA_STATE_CLASS[] PROGMEM = "stat_cla"; // "state_class" const char HA_STATE_CLASS[] = "stat_cla"; // "state_class"
const char HA_STATE_CLASS_MEASUREMENT[] PROGMEM = "measurement"; const char HA_STATE_CLASS_MEASUREMENT[] = "measurement";
const char HA_EXPIRE_AFTER[] PROGMEM = "exp_aft"; // "expire_after" const char HA_EXPIRE_AFTER[] = "exp_aft"; // "expire_after"
const char HA_CURRENT_TEMPERATURE_TOPIC[] PROGMEM = "curr_temp_t"; // "current_temperature_topic" const char HA_CURRENT_TEMPERATURE_TOPIC[] = "curr_temp_t"; // "current_temperature_topic"
const char HA_CURRENT_TEMPERATURE_TEMPLATE[] PROGMEM = "curr_temp_tpl"; // "current_temperature_template" const char HA_CURRENT_TEMPERATURE_TEMPLATE[] = "curr_temp_tpl"; // "current_temperature_template"
const char HA_TEMPERATURE_COMMAND_TOPIC[] PROGMEM = "temp_cmd_t"; // "temperature_command_topic" const char HA_TEMPERATURE_COMMAND_TOPIC[] = "temp_cmd_t"; // "temperature_command_topic"
const char HA_TEMPERATURE_COMMAND_TEMPLATE[] PROGMEM = "temp_cmd_tpl"; // "temperature_command_template" const char HA_TEMPERATURE_COMMAND_TEMPLATE[] = "temp_cmd_tpl"; // "temperature_command_template"
const char HA_TEMPERATURE_STATE_TOPIC[] PROGMEM = "temp_stat_t"; // "temperature_state_topic" const char HA_TEMPERATURE_STATE_TOPIC[] = "temp_stat_t"; // "temperature_state_topic"
const char HA_TEMPERATURE_STATE_TEMPLATE[] PROGMEM = "temp_stat_tpl"; // "temperature_state_template" const char HA_TEMPERATURE_STATE_TEMPLATE[] = "temp_stat_tpl"; // "temperature_state_template"
const char HA_TEMPERATURE_UNIT[] PROGMEM = "temp_unit"; // "temperature_unit" const char HA_TEMPERATURE_UNIT[] = "temp_unit"; // "temperature_unit"
const char HA_MODE_COMMAND_TOPIC[] PROGMEM = "mode_cmd_t"; // "mode_command_topic" const char HA_MODE_COMMAND_TOPIC[] = "mode_cmd_t"; // "mode_command_topic"
const char HA_MODE_COMMAND_TEMPLATE[] PROGMEM = "mode_cmd_tpl"; // "mode_command_template" const char HA_MODE_COMMAND_TEMPLATE[] = "mode_cmd_tpl"; // "mode_command_template"
const char HA_MODE_STATE_TOPIC[] PROGMEM = "mode_stat_t"; // "mode_state_topic" const char HA_MODE_STATE_TOPIC[] = "mode_stat_t"; // "mode_state_topic"
const char HA_MODE_STATE_TEMPLATE[] PROGMEM = "mode_stat_tpl"; // "mode_state_template" const char HA_MODE_STATE_TEMPLATE[] = "mode_stat_tpl"; // "mode_state_template"
const char HA_MODES[] PROGMEM = "modes"; const char HA_MODES[] = "modes";
const char HA_ACTION_TOPIC[] PROGMEM = "act_t"; // "action_topic" const char HA_ACTION_TOPIC[] = "act_t"; // "action_topic"
const char HA_ACTION_TEMPLATE[] PROGMEM = "act_tpl"; // "action_template" const char HA_ACTION_TEMPLATE[] = "act_tpl"; // "action_template"
const char HA_MIN_TEMP[] PROGMEM = "min_temp"; const char HA_MIN_TEMP[] = "min_temp";
const char HA_MAX_TEMP[] PROGMEM = "max_temp"; const char HA_MAX_TEMP[] = "max_temp";
const char HA_TEMP_STEP[] PROGMEM = "temp_step"; const char HA_TEMP_STEP[] = "temp_step";
const char HA_PRESET_MODE_COMMAND_TOPIC[] PROGMEM = "pr_mode_cmd_t"; // "preset_mode_command_topic" const char HA_PRESET_MODE_COMMAND_TOPIC[] = "pr_mode_cmd_t"; // "preset_mode_command_topic"
const char HA_PRESET_MODE_COMMAND_TEMPLATE[] PROGMEM = "pr_mode_cmd_tpl"; // "preset_mode_command_template" const char HA_PRESET_MODE_COMMAND_TEMPLATE[] = "pr_mode_cmd_tpl"; // "preset_mode_command_template"
const char HA_PRESET_MODE_STATE_TOPIC[] PROGMEM = "pr_mode_stat_t"; // "preset_mode_state_topic" const char HA_PRESET_MODE_STATE_TOPIC[] = "pr_mode_stat_t"; // "preset_mode_state_topic"
const char HA_PRESET_MODE_VALUE_TEMPLATE[] PROGMEM = "pr_mode_val_tpl"; // "preset_mode_value_template" const char HA_PRESET_MODE_VALUE_TEMPLATE[] = "pr_mode_val_tpl"; // "preset_mode_value_template"
const char HA_PRESET_MODES[] PROGMEM = "pr_modes"; // "preset_modes" const char HA_PRESET_MODES[] = "pr_modes"; // "preset_modes"
-24
View File
@@ -1,24 +0,0 @@
#include <WiFiClient.h>
class MqttWiFiClient : public WiFiClient {
public:
#ifdef ARDUINO_ARCH_ESP8266
void flush() override {
if (this->connected()) {
WiFiClient::flush(0);
}
}
void stop() override {
this->abort();
}
#endif
#ifdef ARDUINO_ARCH_ESP32
void setSync(bool) {}
bool getSync() {
return false;
}
#endif
};
-16
View File
@@ -1,9 +1,7 @@
#pragma once #pragma once
#include <Arduino.h> #include <Arduino.h>
#include <MqttClient.h> #include <MqttClient.h>
#ifdef ARDUINO_ARCH_ESP32
#include <mutex> #include <mutex>
#endif
class MqttWriter { class MqttWriter {
@@ -17,17 +15,13 @@ public:
this->bufferSize = bufferSize; this->bufferSize = bufferSize;
this->buffer = static_cast<uint8_t*>(malloc(bufferSize * sizeof(*this->buffer))); this->buffer = static_cast<uint8_t*>(malloc(bufferSize * sizeof(*this->buffer)));
#ifdef ARDUINO_ARCH_ESP32
this->mutex = new std::mutex(); this->mutex = new std::mutex();
#endif
} }
~MqttWriter() { ~MqttWriter() {
free(this->buffer); free(this->buffer);
#ifdef ARDUINO_ARCH_ESP32
delete this->mutex; delete this->mutex;
#endif
} }
MqttWriter* setYieldCallback(YieldCallback callback = nullptr) { MqttWriter* setYieldCallback(YieldCallback callback = nullptr) {
@@ -49,15 +43,9 @@ public:
} }
bool lock() { bool lock() {
#ifdef ARDUINO_ARCH_ESP32
if (!this->mutex->try_lock()) { if (!this->mutex->try_lock()) {
return false; return false;
} }
#else
if (this->isLocked()) {
return false;
}
#endif
this->locked = true; this->locked = true;
this->writeAfterLock = 0; this->writeAfterLock = 0;
@@ -72,9 +60,7 @@ public:
void unlock() { void unlock() {
this->locked = false; this->locked = false;
#if defined(ARDUINO_ARCH_ESP32)
this->mutex->unlock(); this->mutex->unlock();
#endif
} }
bool publish(const char* topic, const JsonVariantConst doc, bool retained = false) { bool publish(const char* topic, const JsonVariantConst doc, bool retained = false) {
@@ -212,9 +198,7 @@ protected:
size_t bufferSize = 64; size_t bufferSize = 64;
size_t bufferPos = 0; size_t bufferPos = 0;
bool locked = false; bool locked = false;
#ifdef ARDUINO_ARCH_ESP32
mutable std::mutex* mutex; mutable std::mutex* mutex;
#endif
unsigned long lockedTime = 0; unsigned long lockedTime = 0;
size_t writeAfterLock = 0; size_t writeAfterLock = 0;
}; };
-73
View File
@@ -4,11 +4,7 @@ using namespace NetworkUtils;
void NetworkConnection::setup(bool useDhcp) { void NetworkConnection::setup(bool useDhcp) {
setUseDhcp(useDhcp); setUseDhcp(useDhcp);
#if defined(ARDUINO_ARCH_ESP8266)
wifi_set_event_handler_cb(NetworkConnection::onEvent);
#elif defined(ARDUINO_ARCH_ESP32)
WiFi.onEvent(NetworkConnection::onEvent); WiFi.onEvent(NetworkConnection::onEvent);
#endif
} }
void NetworkConnection::reset() { void NetworkConnection::reset() {
@@ -29,57 +25,6 @@ NetworkConnection::DisconnectReason NetworkConnection::getDisconnectReason() {
return disconnectReason; return disconnectReason;
} }
#if defined(ARDUINO_ARCH_ESP8266)
void NetworkConnection::onEvent(System_Event_t *event) {
switch (event->event) {
case EVENT_STAMODE_CONNECTED:
status = useDhcp ? Status::CONNECTING : Status::CONNECTED;
rawDisconnectReason = 0;
disconnectReason = DisconnectReason::NONE;
break;
case EVENT_STAMODE_GOT_IP:
status = Status::CONNECTED;
rawDisconnectReason = 0;
disconnectReason = DisconnectReason::NONE;
break;
case EVENT_STAMODE_DHCP_TIMEOUT:
status = Status::DISCONNECTED;
rawDisconnectReason = 0;
disconnectReason = DisconnectReason::DHCP_TIMEOUT;
break;
case EVENT_STAMODE_DISCONNECTED:
status = Status::DISCONNECTED;
rawDisconnectReason = event->event_info.disconnected.reason;
disconnectReason = convertDisconnectReason(event->event_info.disconnected.reason);
// https://github.com/esp8266/Arduino/blob/d5eb265f78bff9deb7063d10030a02d021c8c66c/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp#L231
if ((wifi_station_get_connect_status() == STATION_GOT_IP) && !wifi_station_get_reconnect_policy()) {
wifi_station_disconnect();
}
break;
case EVENT_STAMODE_AUTHMODE_CHANGE:
// https://github.com/esp8266/Arduino/blob/d5eb265f78bff9deb7063d10030a02d021c8c66c/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp#L241
{
auto& src = event->event_info.auth_change;
if ((src.old_mode != AUTH_OPEN) && (src.new_mode == AUTH_OPEN)) {
status = Status::DISCONNECTED;
rawDisconnectReason = 0;
disconnectReason = DisconnectReason::OTHER;
wifi_station_disconnect();
}
}
break;
default:
break;
}
}
#elif defined(ARDUINO_ARCH_ESP32)
void NetworkConnection::onEvent(WiFiEvent_t event, WiFiEventInfo_t info) { void NetworkConnection::onEvent(WiFiEvent_t event, WiFiEventInfo_t info) {
switch (event) { switch (event) {
case ARDUINO_EVENT_WIFI_STA_CONNECTED: case ARDUINO_EVENT_WIFI_STA_CONNECTED:
@@ -111,26 +56,9 @@ void NetworkConnection::onEvent(WiFiEvent_t event, WiFiEventInfo_t info) {
break; break;
} }
} }
#endif
NetworkConnection::DisconnectReason NetworkConnection::convertDisconnectReason(uint8_t reason) { NetworkConnection::DisconnectReason NetworkConnection::convertDisconnectReason(uint8_t reason) {
switch (reason) { switch (reason) {
#if defined(ARDUINO_ARCH_ESP8266)
case REASON_BEACON_TIMEOUT:
return DisconnectReason::BEACON_TIMEOUT;
case REASON_NO_AP_FOUND:
return DisconnectReason::NO_AP_FOUND;
case REASON_AUTH_FAIL:
return DisconnectReason::AUTH_FAIL;
case REASON_ASSOC_FAIL:
return DisconnectReason::ASSOC_FAIL;
case REASON_HANDSHAKE_TIMEOUT:
return DisconnectReason::HANDSHAKE_TIMEOUT;
#elif defined(ARDUINO_ARCH_ESP32)
case WIFI_REASON_BEACON_TIMEOUT: case WIFI_REASON_BEACON_TIMEOUT:
return DisconnectReason::BEACON_TIMEOUT; return DisconnectReason::BEACON_TIMEOUT;
@@ -145,7 +73,6 @@ NetworkConnection::DisconnectReason NetworkConnection::convertDisconnectReason(u
case WIFI_REASON_HANDSHAKE_TIMEOUT: case WIFI_REASON_HANDSHAKE_TIMEOUT:
return DisconnectReason::HANDSHAKE_TIMEOUT; return DisconnectReason::HANDSHAKE_TIMEOUT;
#endif
default: default:
return DisconnectReason::OTHER; return DisconnectReason::OTHER;
+1 -10
View File
@@ -1,9 +1,4 @@
#if defined(ARDUINO_ARCH_ESP8266) #include <WiFi.h>
#include <ESP8266WiFi.h>
#include "lwip/etharp.h"
#elif defined(ARDUINO_ARCH_ESP32)
#include <WiFi.h>
#endif
namespace NetworkUtils { namespace NetworkUtils {
struct NetworkConnection { struct NetworkConnection {
@@ -34,11 +29,7 @@ namespace NetworkUtils {
static void reset(); static void reset();
static Status getStatus(); static Status getStatus();
static DisconnectReason getDisconnectReason(); static DisconnectReason getDisconnectReason();
#if defined(ARDUINO_ARCH_ESP8266)
static void onEvent(System_Event_t *evt);
#elif defined(ARDUINO_ARCH_ESP32)
static void onEvent(WiFiEvent_t event, WiFiEventInfo_t info); static void onEvent(WiFiEvent_t event, WiFiEventInfo_t info);
#endif
protected: protected:
static DisconnectReason convertDisconnectReason(uint8_t reason); static DisconnectReason convertDisconnectReason(uint8_t reason);
+16 -95
View File
@@ -1,10 +1,5 @@
#if defined(ARDUINO_ARCH_ESP8266)
#include <ESP8266WiFi.h>
#include "lwip/etharp.h"
#elif defined(ARDUINO_ARCH_ESP32)
#include <WiFi.h> #include <WiFi.h>
#include <esp_wifi.h> #include <esp_wifi.h>
#endif
#include <NetworkConnection.h> #include <NetworkConnection.h>
namespace NetworkUtils { namespace NetworkUtils {
@@ -147,44 +142,23 @@ namespace NetworkUtils {
bool resetWifi() { bool resetWifi() {
// set policy manual for work 13 ch // set policy manual for work 13 ch
{ {
#ifdef ARDUINO_ARCH_ESP8266
wifi_country_t country = {"JP", 1, 14, WIFI_COUNTRY_POLICY_MANUAL};
wifi_set_country(&country);
#elif defined(ARDUINO_ARCH_ESP32)
const wifi_country_t country = {"JP", 1, 14, CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER, WIFI_COUNTRY_POLICY_MANUAL}; const wifi_country_t country = {"JP", 1, 14, CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER, WIFI_COUNTRY_POLICY_MANUAL};
esp_wifi_set_country(&country); esp_wifi_set_country(&country);
#endif
} }
WiFi.persistent(false); WiFi.persistent(false);
#if !defined(ESP_ARDUINO_VERSION_MAJOR) || ESP_ARDUINO_VERSION_MAJOR < 3 #if ESP_ARDUINO_VERSION_MAJOR < 3
WiFi.setAutoConnect(false); WiFi.setAutoConnect(false);
#endif #endif
WiFi.setAutoReconnect(false); WiFi.setAutoReconnect(false);
#ifdef ARDUINO_ARCH_ESP8266
WiFi.setSleepMode(WIFI_NONE_SLEEP);
#elif defined(ARDUINO_ARCH_ESP32)
WiFi.setSleep(USE_BLE ? WIFI_PS_MIN_MODEM : WIFI_PS_NONE); WiFi.setSleep(USE_BLE ? WIFI_PS_MIN_MODEM : WIFI_PS_NONE);
#endif
WiFi.softAPdisconnect(); WiFi.softAPdisconnect();
#ifdef ARDUINO_ARCH_ESP8266
/*if (wifi_softap_dhcps_status() == DHCP_STARTED) {
wifi_softap_dhcps_stop();
}*/
#endif
WiFi.disconnect(false, true); WiFi.disconnect(false, true);
#ifdef ARDUINO_ARCH_ESP8266
/*if (wifi_station_dhcpc_status() == DHCP_STARTED) {
wifi_station_dhcpc_stop();
}*/
wifi_station_dhcpc_set_maxtry(5); #if ESP_ARDUINO_VERSION_MAJOR < 3
#endif
#if defined(ARDUINO_ARCH_ESP32) && ESP_ARDUINO_VERSION_MAJOR < 3
// Nothing. Because memory leaks when turn off WiFi on ESP32 SDK < 3.0.0 // Nothing. Because memory leaks when turn off WiFi on ESP32 SDK < 3.0.0
return true; return true;
#else #else
@@ -206,12 +180,6 @@ namespace NetworkUtils {
NetworkConnection::reset(); NetworkConnection::reset();
} else { } else {
/*#ifdef ARDUINO_ARCH_ESP8266
if (wifi_station_dhcpc_status() == DHCP_STARTED) {
wifi_station_dhcpc_stop();
}
#endif*/
this->disconnect(); this->disconnect();
} }
@@ -221,14 +189,12 @@ namespace NetworkUtils {
this->delayCallback(250); this->delayCallback(250);
#ifdef ARDUINO_ARCH_ESP32
if (this->setWifiHostname(this->hostname)) { if (this->setWifiHostname(this->hostname)) {
Log.straceln(FPSTR(L_NETWORK), F("Set hostname '%s': success"), this->hostname); Log.straceln(L_NETWORK, "Set hostname '%s': success", this->hostname);
} else { } else {
Log.serrorln(FPSTR(L_NETWORK), F("Set hostname '%s': fail"), this->hostname); Log.serrorln(L_NETWORK, "Set hostname '%s': fail", this->hostname);
} }
#endif
if (!WiFi.mode((WiFiMode_t)(WiFi.getMode() | WIFI_STA))) { if (!WiFi.mode((WiFiMode_t)(WiFi.getMode() | WIFI_STA))) {
return false; return false;
@@ -236,21 +202,8 @@ namespace NetworkUtils {
this->delayCallback(250); this->delayCallback(250);
#ifdef ARDUINO_ARCH_ESP8266
if (this->setWifiHostname(this->hostname)) {
Log.straceln(FPSTR(L_NETWORK), F("Set hostname '%s': success"), this->hostname);
} else {
Log.serrorln(FPSTR(L_NETWORK), F("Set hostname '%s': fail"), this->hostname);
}
this->delayCallback(250);
#endif
#ifdef ARDUINO_ARCH_ESP32
WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN); WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN);
WiFi.setSortMethod(WIFI_CONNECT_AP_BY_SIGNAL); WiFi.setSortMethod(WIFI_CONNECT_AP_BY_SIGNAL);
#endif
if (!this->useDhcp) { if (!this->useDhcp) {
WiFi.begin(this->staSsid, this->staPassword, this->staChannel, nullptr, false); WiFi.begin(this->staSsid, this->staPassword, this->staChannel, nullptr, false);
@@ -275,30 +228,26 @@ namespace NetworkUtils {
} }
void disconnect() { void disconnect() {
#ifdef ARDUINO_ARCH_ESP32
WiFi.disconnectAsync(false, true); WiFi.disconnectAsync(false, true);
const unsigned long start = millis(); const unsigned long start = millis();
while (WiFi.isConnected() && (millis() - start) < 5000) { while (WiFi.isConnected() && (millis() - start) < 5000) {
this->delayCallback(100); this->delayCallback(100);
} }
#else
WiFi.disconnect(false, true);
#endif
} }
void loop() { void loop() {
if (this->reconnectFlag) { if (this->reconnectFlag) {
this->delayCallback(5000); this->delayCallback(5000);
Log.sinfoln(FPSTR(L_NETWORK), F("Reconnecting...")); Log.sinfoln(L_NETWORK, "Reconnecting...");
this->reconnectFlag = false; this->reconnectFlag = false;
this->disconnect(); this->disconnect();
NetworkConnection::reset(); NetworkConnection::reset();
this->delayCallback(1000); this->delayCallback(1000);
} else if (this->isConnected() && !this->hasStaCredentials()) { } else if (this->isConnected() && !this->hasStaCredentials()) {
Log.sinfoln(FPSTR(L_NETWORK), F("Reset")); Log.sinfoln(L_NETWORK, "Reset");
this->resetWifi(); this->resetWifi();
NetworkConnection::reset(); NetworkConnection::reset();
this->delayCallback(1000); this->delayCallback(1000);
@@ -309,8 +258,8 @@ namespace NetworkUtils {
this->connected = true; this->connected = true;
Log.sinfoln( Log.sinfoln(
FPSTR(L_NETWORK), L_NETWORK,
F("Connected, downtime: %lu s., IP: %s, RSSI: %hhd"), "Connected, downtime: %lu s., IP: %s, RSSI: %hhd",
(millis() - this->disconnectedTime) / 1000, (millis() - this->disconnectedTime) / 1000,
WiFi.localIP().toString().c_str(), WiFi.localIP().toString().c_str(),
WiFi.RSSI() WiFi.RSSI()
@@ -318,58 +267,51 @@ namespace NetworkUtils {
} }
if (this->isApEnabled() && millis() - this->connectedTime > this->reconnectInterval && !this->hasApClients()) { if (this->isApEnabled() && millis() - this->connectedTime > this->reconnectInterval && !this->hasApClients()) {
Log.sinfoln(FPSTR(L_NETWORK), F("Stop AP because STA connected")); Log.sinfoln(L_NETWORK, "Stop AP because STA connected");
WiFi.mode(WIFI_STA); WiFi.mode(WIFI_STA);
return; return;
} }
#ifdef ARDUINO_ARCH_ESP8266
if (millis() - this->prevArpGratuitous > 60000) {
this->stationKeepAliveNow();
this->prevArpGratuitous = millis();
}
#endif
} else { } else {
if (this->connected) { if (this->connected) {
this->disconnectedTime = millis(); this->disconnectedTime = millis();
this->connected = false; this->connected = false;
Log.sinfoln( Log.sinfoln(
FPSTR(L_NETWORK), L_NETWORK,
F("Disconnected, reason: %d, uptime: %lu s."), "Disconnected, reason: %d, uptime: %lu s.",
NetworkConnection::getDisconnectReason(), NetworkConnection::getDisconnectReason(),
(millis() - this->connectedTime) / 1000 (millis() - this->connectedTime) / 1000
); );
} }
if (!this->hasStaCredentials() && !this->isApEnabled()) { if (!this->hasStaCredentials() && !this->isApEnabled()) {
Log.sinfoln(FPSTR(L_NETWORK), F("No STA credentials, start AP")); Log.sinfoln(L_NETWORK, "No STA credentials, start AP");
WiFi.mode(WIFI_AP_STA); WiFi.mode(WIFI_AP_STA);
this->delayCallback(250); this->delayCallback(250);
WiFi.softAP(this->apName, this->apPassword, this->apChannel); WiFi.softAP(this->apName, this->apPassword, this->apChannel);
} else if (!this->isApEnabled() && millis() - this->disconnectedTime > this->failedConnectTimeout) { } else if (!this->isApEnabled() && millis() - this->disconnectedTime > this->failedConnectTimeout) {
Log.sinfoln(FPSTR(L_NETWORK), F("Disconnected for a long time, start AP")); Log.sinfoln(L_NETWORK, "Disconnected for a long time, start AP");
WiFi.mode(WIFI_AP_STA); WiFi.mode(WIFI_AP_STA);
this->delayCallback(250); this->delayCallback(250);
WiFi.softAP(this->apName, this->apPassword, this->apChannel); WiFi.softAP(this->apName, this->apPassword, this->apChannel);
} else if (this->isConnecting() && millis() - this->prevReconnectingTime > this->resetConnectionTimeout) { } else if (this->isConnecting() && millis() - this->prevReconnectingTime > this->resetConnectionTimeout) {
Log.swarningln(FPSTR(L_NETWORK), F("Connection timeout, reset wifi...")); Log.swarningln(L_NETWORK, "Connection timeout, reset wifi...");
this->resetWifi(); this->resetWifi();
NetworkConnection::reset(); NetworkConnection::reset();
this->delayCallback(250); this->delayCallback(250);
} else if (!this->isConnecting() && this->hasStaCredentials() && (!this->prevReconnectingTime || millis() - this->prevReconnectingTime > this->reconnectInterval)) { } else if (!this->isConnecting() && this->hasStaCredentials() && (!this->prevReconnectingTime || millis() - this->prevReconnectingTime > this->reconnectInterval)) {
Log.sinfoln(FPSTR(L_NETWORK), F("Try connect...")); Log.sinfoln(L_NETWORK, "Try connect...");
NetworkConnection::reset(); NetworkConnection::reset();
if (!this->connect(true, this->connectionTimeout)) { if (!this->connect(true, this->connectionTimeout)) {
Log.straceln(FPSTR(L_NETWORK), F("Connection failed. Status: %d, reason: %d, raw reason: %d"), NetworkConnection::getStatus(), NetworkConnection::getDisconnectReason(), NetworkConnection::rawDisconnectReason); Log.straceln(L_NETWORK, "Connection failed. Status: %d, reason: %d, raw reason: %d", NetworkConnection::getStatus(), NetworkConnection::getDisconnectReason(), NetworkConnection::rawDisconnectReason);
} }
this->prevReconnectingTime = millis(); this->prevReconnectingTime = millis();
@@ -451,7 +393,6 @@ namespace NetworkUtils {
bool connected = false; bool connected = false;
bool reconnectFlag = false; bool reconnectFlag = false;
unsigned long prevArpGratuitous = 0;
unsigned long prevReconnectingTime = 0; unsigned long prevReconnectingTime = 0;
unsigned long connectedTime = 0; unsigned long connectedTime = 0;
unsigned long disconnectedTime = 0; unsigned long disconnectedTime = 0;
@@ -469,25 +410,5 @@ namespace NetworkUtils {
return WiFi.setHostname(hostname); return WiFi.setHostname(hostname);
} }
#ifdef ARDUINO_ARCH_ESP8266
/**
* @brief
* https://github.com/arendst/Tasmota/blob/e6515883f0ee5451931b6280ff847b117de5a231/tasmota/tasmota_support/support_wifi.ino#L1196
*/
static void stationKeepAliveNow(void) {
for (netif* interface = netif_list; interface != nullptr; interface = interface->next) {
if (
(interface->flags & NETIF_FLAG_LINK_UP)
&& (interface->flags & NETIF_FLAG_UP)
&& interface->num == STATION_IF
&& (!ip4_addr_isany_val(*netif_ip4_addr(interface)))
) {
etharp_gratuitous(interface);
break;
}
}
}
#endif
}; };
} }
+7 -13
View File
@@ -28,11 +28,9 @@ public:
return this; return this;
} }
#if defined(ARDUINO_ARCH_ESP32)
bool canHandle(WebServer &server, HTTPMethod method, const String &uri) override { bool canHandle(WebServer &server, HTTPMethod method, const String &uri) override {
return this->canHandle(method, uri); return this->canHandle(method, uri);
} }
#endif
bool canHandle(HTTPMethod method, const String& uri) override { bool canHandle(HTTPMethod method, const String& uri) override {
return method == HTTP_GET && uri.equals(this->uri) && (!this->canHandleCallback || this->canHandleCallback(method, uri)); return method == HTTP_GET && uri.equals(this->uri) && (!this->canHandleCallback || this->canHandleCallback(method, uri));
@@ -54,17 +52,17 @@ public:
} }
} }
if (!this->eTag.isEmpty() && server.header(F("If-None-Match")).equals(this->eTag.c_str())) { if (!this->eTag.isEmpty() && server.header("If-None-Match").equals(this->eTag.c_str())) {
server.send(304); server.send(304);
return true; return true;
} }
} }
if (!this->path.endsWith(FPSTR(mimeTable[gz].endsWith)) && !this->fs->exists(path)) { if (!this->path.endsWith(mimeTable[gz].endsWith) && !this->fs->exists(path)) {
String pathWithGz = this->path + FPSTR(mimeTable[gz].endsWith); String pathWithGz = this->path + mimeTable[gz].endsWith;
if (this->fs->exists(pathWithGz)) { if (this->fs->exists(pathWithGz)) {
this->path += FPSTR(mimeTable[gz].endsWith); this->path += mimeTable[gz].endsWith;
} }
} }
@@ -78,18 +76,14 @@ public:
} }
if (this->cacheHeader != nullptr) { if (this->cacheHeader != nullptr) {
server.sendHeader(F("Cache-Control"), this->cacheHeader); server.sendHeader("Cache-Control", this->cacheHeader);
} }
if (server._eTagEnabled && !this->eTag.isEmpty()) { if (server._eTagEnabled && !this->eTag.isEmpty()) {
server.sendHeader(F("ETag"), this->eTag); server.sendHeader("ETag", this->eTag);
} }
#if defined(ARDUINO_ARCH_ESP8266) server.streamFile(file, "text/html", 200);
server.streamFile(file, F("text/html"), method);
#else
server.streamFile(file, F("text/html"), 200);
#endif
return true; return true;
} }
+7 -7
View File
@@ -132,11 +132,11 @@ public:
result->status = UpgradeStatus::ERROR_ON_START; result->status = UpgradeStatus::ERROR_ON_START;
result->error = Update.errorString(); result->error = Update.errorString();
Log.serrorln(FPSTR(L_PORTAL_OTA), "File '%s', on start: %s", fileName.c_str(), result->error.c_str()); Log.serrorln(L_PORTAL_OTA, "File '%s', on start: %s", fileName.c_str(), result->error.c_str());
return; return;
} }
Log.sinfoln(FPSTR(L_PORTAL_OTA), "File '%s', started", fileName.c_str()); Log.sinfoln(L_PORTAL_OTA, "File '%s', started", fileName.c_str());
} }
if (dataLength) { if (dataLength) {
@@ -146,7 +146,7 @@ public:
result->error = Update.errorString(); result->error = Update.errorString();
Log.serrorln( Log.serrorln(
FPSTR(L_PORTAL_OTA), "File '%s', on write %d bytes, %d of %d bytes", L_PORTAL_OTA, "File '%s', on write %d bytes, %d of %d bytes",
fileName.c_str(), fileName.c_str(),
dataLength, dataLength,
result->progress + dataLength, result->progress + dataLength,
@@ -157,7 +157,7 @@ public:
result->progress += dataLength; result->progress += dataLength;
Log.sinfoln( Log.sinfoln(
FPSTR(L_PORTAL_OTA), "File '%s', write %d bytes, %d of %d bytes", L_PORTAL_OTA, "File '%s', write %d bytes, %d of %d bytes",
fileName.c_str(), fileName.c_str(),
dataLength, dataLength,
result->progress, result->progress,
@@ -171,7 +171,7 @@ public:
result->status = UpgradeStatus::SIZE_MISMATCH; result->status = UpgradeStatus::SIZE_MISMATCH;
Log.serrorln( Log.serrorln(
FPSTR(L_PORTAL_OTA), "File '%s', size mismatch: %d of %d bytes", L_PORTAL_OTA, "File '%s', size mismatch: %d of %d bytes",
fileName.c_str(), fileName.c_str(),
result->progress, result->progress,
result->size result->size
@@ -185,12 +185,12 @@ public:
result->status = UpgradeStatus::ERROR_ON_FINISH; result->status = UpgradeStatus::ERROR_ON_FINISH;
result->error = Update.errorString(); result->error = Update.errorString();
Log.serrorln(FPSTR(L_PORTAL_OTA), "File '%s', on finish: %s", fileName.c_str(), result->error); Log.serrorln(L_PORTAL_OTA, "File '%s', on finish: %s", fileName.c_str(), result->error.c_str());
return; return;
} }
result->status = UpgradeStatus::SUCCESS; result->status = UpgradeStatus::SUCCESS;
Log.sinfoln(FPSTR(L_PORTAL_OTA), "File '%s': finish", fileName.c_str()); Log.sinfoln(L_PORTAL_OTA, "File '%s': finish", fileName.c_str());
} }
} }
+1 -63
View File
@@ -1,20 +1,7 @@
#pragma once #pragma once
#include <Arduino.h> #include <Arduino.h>
#ifdef ARDUINO_ARCH_ESP32 #include "esp_err.h"
#include "esp_err.h"
#endif
#ifdef ARDUINO_ARCH_ESP8266
extern "C" {
#include <user_interface.h>
}
// https://github.com/espressif/ESP8266_RTOS_SDK/blob/master/components/esp8266/include/esp_attr.h
#define _COUNTER_STRINGIFY(COUNTER) #COUNTER
#define _SECTION_ATTR_IMPL(SECTION, COUNTER) __attribute__((section(SECTION "." _COUNTER_STRINGIFY(COUNTER))))
#define __NOINIT_ATTR _SECTION_ATTR_IMPL(".noinit", __COUNTER__)
#endif
namespace CrashRecorder { namespace CrashRecorder {
typedef struct { typedef struct {
@@ -42,7 +29,6 @@ namespace CrashRecorder {
uint8_t backtraceMaxLength = sizeof(backtrace.data) / sizeof(*backtrace.data); uint8_t backtraceMaxLength = sizeof(backtrace.data) / sizeof(*backtrace.data);
uint8_t epcMaxLength = sizeof(epc.data) / sizeof(*epc.data); uint8_t epcMaxLength = sizeof(epc.data) / sizeof(*epc.data);
#ifdef ARDUINO_ARCH_ESP32
void IRAM_ATTR panicHandler(arduino_panic_info_t *info, void *arg) {; void IRAM_ATTR panicHandler(arduino_panic_info_t *info, void *arg) {;
ext.core = info->core; ext.core = info->core;
ext.heap = ESP.getFreeHeap(); ext.heap = ESP.getFreeHeap();
@@ -69,7 +55,6 @@ namespace CrashRecorder {
epc.length = 0; epc.length = 0;
} }
} }
#endif
void init() { void init() {
if (backtrace.length > backtraceMaxLength) { if (backtrace.length > backtraceMaxLength) {
@@ -80,53 +65,6 @@ namespace CrashRecorder {
epc.length = 0; epc.length = 0;
} }
#ifdef ARDUINO_ARCH_ESP32
set_arduino_panic_handler(panicHandler, nullptr); set_arduino_panic_handler(panicHandler, nullptr);
#endif
} }
} }
#ifdef ARDUINO_ARCH_ESP8266
extern "C" void custom_crash_callback(struct rst_info *info, uint32_t stack, uint32_t stack_end) {
uint8_t _length = 0;
CrashRecorder::ext.core = 0;
CrashRecorder::ext.heap = ESP.getFreeHeap();
CrashRecorder::ext.uptime = millis() / 1000u;
// Backtrace
CrashRecorder::backtrace.continues = false;
uint32_t value;
for (uint32_t i = stack; i < stack_end; i += 4) {
value = *((uint32_t*) i); // NOLINT
// keep only addresses in code area
if ((value >= 0x40000000) && (value < 0x40300000)) {
if (_length >= CrashRecorder::backtraceMaxLength) {
CrashRecorder::backtrace.continues = true;
break;
}
CrashRecorder::backtrace.data[_length++] = value;
}
}
CrashRecorder::backtrace.length = _length;
// EPC
_length = 0;
if (info->epc1 > 0) {
CrashRecorder::epc.data[_length++] = info->epc1;
}
if (info->epc2 > 0) {
CrashRecorder::epc.data[_length++] = info->epc2;
}
if (info->epc3 > 0) {
CrashRecorder::epc.data[_length++] = info->epc3;
}
CrashRecorder::epc.length = _length;
}
#endif
+792 -792
View File
File diff suppressed because it is too large. Load diff
+38 -40
View File
@@ -42,7 +42,6 @@ protected:
bool emergencyDetected = false; bool emergencyDetected = false;
unsigned long emergencyFlipTime = 0; unsigned long emergencyFlipTime = 0;
#if defined(ARDUINO_ARCH_ESP32)
const char* getTaskName() override { const char* getTaskName() override {
return "Main"; return "Main";
} }
@@ -58,7 +57,6 @@ protected:
int getTaskPriority() override { int getTaskPriority() override {
return 3; return 3;
} }
#endif
void setup() {} void setup() {}
@@ -66,15 +64,15 @@ protected:
network->loop(); network->loop();
if (fsNetworkSettings.tick() == FD_WRITE) { if (fsNetworkSettings.tick() == FD_WRITE) {
Log.sinfoln(FPSTR(L_NETWORK_SETTINGS), F("Updated")); Log.sinfoln(L_NETWORK_SETTINGS, "Updated");
} }
if (fsSettings.tick() == FD_WRITE) { if (fsSettings.tick() == FD_WRITE) {
Log.sinfoln(FPSTR(L_SETTINGS), F("Updated")); Log.sinfoln(L_SETTINGS, "Updated");
} }
if (fsSensorsSettings.tick() == FD_WRITE) { if (fsSensorsSettings.tick() == FD_WRITE) {
Log.sinfoln(FPSTR(L_SENSORS_SETTINGS), F("Updated")); Log.sinfoln(L_SENSORS_SETTINGS, "Updated");
} }
if (vars.actions.restart) { if (vars.actions.restart) {
@@ -82,7 +80,7 @@ protected:
this->restartSignalReceived = true; this->restartSignalReceived = true;
vars.actions.restart = false; vars.actions.restart = false;
Log.sinfoln(FPSTR(L_MAIN), F("Received restart signal")); Log.sinfoln(L_MAIN, "Received restart signal");
} }
if (!vars.states.restarting && this->restartSignalReceived && millis() - this->restartSignalReceivedTime > 5000) { if (!vars.states.restarting && this->restartSignalReceived && millis() - this->restartSignalReceivedTime > 5000) {
@@ -99,7 +97,7 @@ protected:
fsNetworkSettings.write(); fsNetworkSettings.write();
} }
Log.sinfoln(FPSTR(L_MAIN), F("Restart scheduled in 10 sec.")); Log.sinfoln(L_MAIN, "Restart scheduled in 10 sec.");
} }
vars.mqtt.connected = tMqtt->isConnected(); vars.mqtt.connected = tMqtt->isConnected();
@@ -210,8 +208,8 @@ protected:
if (millis() - this->lastHeapInfo > 20000 || minFreeHeapDiff > 0 || minMaxFreeBlockHeapDiff > 0) { if (millis() - this->lastHeapInfo > 20000 || minFreeHeapDiff > 0 || minMaxFreeBlockHeapDiff > 0) {
Log.sverboseln( Log.sverboseln(
FPSTR(L_MAIN), L_MAIN,
F("Free heap size: %u of %u bytes (min: %u, diff: %u), max free block: %u (min: %u, diff: %u, frag: %hhu%%)"), "Free heap size: %u of %u bytes (min: %u, diff: %u), max free block: %u (min: %u, diff: %u, frag: %hhu%%)",
freeHeap, getTotalHeap(), this->minFreeHeap, minFreeHeapDiff, maxFreeBlockHeap, this->minMaxFreeBlockHeap, minMaxFreeBlockHeapDiff, getHeapFrag() freeHeap, getTotalHeap(), this->minFreeHeap, minFreeHeapDiff, maxFreeBlockHeap, this->minMaxFreeBlockHeap, minMaxFreeBlockHeapDiff, getHeapFrag()
); );
this->lastHeapInfo = millis(); this->lastHeapInfo = millis();
@@ -257,8 +255,8 @@ protected:
vars.master.heating.freezing = false; vars.master.heating.freezing = false;
Log.sinfoln( Log.sinfoln(
FPSTR(L_MAIN), L_MAIN,
F("No freezing detected. Current low temp: %.2f, threshold (high): %hhu"), "No freezing detected. Current low temp: %.2f, threshold (high): %hhu",
lowTemp, settings.heating.freezeProtection.highTemp lowTemp, settings.heating.freezeProtection.highTemp
); );
} }
@@ -273,8 +271,8 @@ protected:
} }
Log.sinfoln( Log.sinfoln(
FPSTR(L_MAIN), L_MAIN,
F("Freezing detected! Current low temp: %.2f, threshold (low): %hhu"), "Freezing detected! Current low temp: %.2f, threshold (low): %hhu",
lowTemp, settings.heating.freezeProtection.lowTemp lowTemp, settings.heating.freezeProtection.lowTemp
); );
} }
@@ -283,7 +281,7 @@ protected:
} else if (vars.master.heating.freezing) { } else if (vars.master.heating.freezing) {
vars.master.heating.freezing = false; vars.master.heating.freezing = false;
Log.sinfoln(FPSTR(L_MAIN), F("No sensors available, freeze protection unavailable!")); Log.sinfoln(L_MAIN, "No sensors available, freeze protection unavailable!");
} }
} }
} }
@@ -321,7 +319,7 @@ protected:
// enable emergency // enable emergency
if (millis() - this->emergencyFlipTime > (settings.emergency.tresholdTime * 1000)) { if (millis() - this->emergencyFlipTime > (settings.emergency.tresholdTime * 1000)) {
vars.emergency.state = true; vars.emergency.state = true;
Log.sinfoln(FPSTR(L_MAIN), F("Emergency mode enabled (%hhu)"), emergencyFlags); Log.sinfoln(L_MAIN, "Emergency mode enabled (%hhu)", emergencyFlags);
} }
} }
@@ -335,7 +333,7 @@ protected:
// disable emergency // disable emergency
if (millis() - this->emergencyFlipTime > (settings.emergency.tresholdTime * 1000)) { if (millis() - this->emergencyFlipTime > (settings.emergency.tresholdTime * 1000)) {
vars.emergency.state = false; vars.emergency.state = false;
Log.sinfoln(FPSTR(L_MAIN), F("Emergency mode disabled")); Log.sinfoln(L_MAIN, "Emergency mode disabled");
} }
} }
} }
@@ -435,19 +433,19 @@ protected:
pinMode(configuredInputGpio, OUTPUT); pinMode(configuredInputGpio, OUTPUT);
digitalWrite(configuredInputGpio, LOW); digitalWrite(configuredInputGpio, LOW);
Log.sinfoln(FPSTR(L_CASCADE_INPUT), F("Deinitialized on GPIO %hhu"), configuredInputGpio); Log.sinfoln(L_CASCADE_INPUT, "Deinitialized on GPIO %hhu", configuredInputGpio);
} }
if (GPIO_IS_VALID(settings.cascadeControl.input.gpio)) { if (GPIO_IS_VALID(settings.cascadeControl.input.gpio)) {
configuredInputGpio = settings.cascadeControl.input.gpio; configuredInputGpio = settings.cascadeControl.input.gpio;
pinMode(configuredInputGpio, INPUT); pinMode(configuredInputGpio, INPUT);
Log.sinfoln(FPSTR(L_CASCADE_INPUT), F("Initialized on GPIO %hhu"), configuredInputGpio); Log.sinfoln(L_CASCADE_INPUT, "Initialized on GPIO %hhu", configuredInputGpio);
} else if (configuredInputGpio != GPIO_IS_NOT_CONFIGURED) { } else if (configuredInputGpio != GPIO_IS_NOT_CONFIGURED) {
configuredInputGpio = GPIO_IS_NOT_CONFIGURED; configuredInputGpio = GPIO_IS_NOT_CONFIGURED;
Log.swarningln(FPSTR(L_CASCADE_INPUT), F("Failed initialize: GPIO %hhu is not valid!"), configuredInputGpio); Log.swarningln(L_CASCADE_INPUT, "Failed initialize: GPIO %hhu is not valid!", configuredInputGpio);
} }
} }
@@ -468,9 +466,9 @@ protected:
vars.cascadeControl.input = value; vars.cascadeControl.input = value;
Log.sinfoln( Log.sinfoln(
FPSTR(L_CASCADE_INPUT), L_CASCADE_INPUT,
F("State changed to %s"), "State changed to %s",
value ? F("TRUE") : F("FALSE") value ? "TRUE" : "FALSE"
); );
} }
@@ -485,9 +483,9 @@ protected:
vars.cascadeControl.input = true; vars.cascadeControl.input = true;
Log.sinfoln( Log.sinfoln(
FPSTR(L_CASCADE_INPUT), L_CASCADE_INPUT,
F("Disabled, state changed to %s"), "Disabled, state changed to %s",
vars.cascadeControl.input ? F("TRUE") : F("FALSE") vars.cascadeControl.input ? "TRUE" : "FALSE"
); );
} }
} }
@@ -500,7 +498,7 @@ protected:
pinMode(configuredOutputGpio, OUTPUT); pinMode(configuredOutputGpio, OUTPUT);
digitalWrite(configuredOutputGpio, LOW); digitalWrite(configuredOutputGpio, LOW);
Log.sinfoln(FPSTR(L_CASCADE_OUTPUT), F("Deinitialized on GPIO %hhu"), configuredOutputGpio); Log.sinfoln(L_CASCADE_OUTPUT, "Deinitialized on GPIO %hhu", configuredOutputGpio);
} }
if (GPIO_IS_VALID(settings.cascadeControl.output.gpio)) { if (GPIO_IS_VALID(settings.cascadeControl.output.gpio)) {
@@ -513,12 +511,12 @@ protected:
: LOW : LOW
); );
Log.sinfoln(FPSTR(L_CASCADE_OUTPUT), F("Initialized on GPIO %hhu"), configuredOutputGpio); Log.sinfoln(L_CASCADE_OUTPUT, "Initialized on GPIO %hhu", configuredOutputGpio);
} else if (configuredOutputGpio != GPIO_IS_NOT_CONFIGURED) { } else if (configuredOutputGpio != GPIO_IS_NOT_CONFIGURED) {
configuredOutputGpio = GPIO_IS_NOT_CONFIGURED; configuredOutputGpio = GPIO_IS_NOT_CONFIGURED;
Log.swarningln(FPSTR(L_CASCADE_OUTPUT), F("Failed initialize: GPIO %hhu is not valid!"), configuredOutputGpio); Log.swarningln(L_CASCADE_OUTPUT, "Failed initialize: GPIO %hhu is not valid!", configuredOutputGpio);
} }
} }
@@ -550,9 +548,9 @@ protected:
); );
Log.sinfoln( Log.sinfoln(
FPSTR(L_CASCADE_OUTPUT), L_CASCADE_OUTPUT,
F("State changed to %s"), "State changed to %s",
value ? F("TRUE") : F("FALSE") value ? "TRUE" : "FALSE"
); );
} }
@@ -576,9 +574,9 @@ protected:
} }
Log.sinfoln( Log.sinfoln(
FPSTR(L_CASCADE_OUTPUT), L_CASCADE_OUTPUT,
F("Disabled, state changed to %s"), "Disabled, state changed to %s",
vars.cascadeControl.output ? F("TRUE") : F("FALSE") vars.cascadeControl.output ? "TRUE" : "FALSE"
); );
} }
} }
@@ -612,7 +610,7 @@ protected:
vars.externalPump.state = false; vars.externalPump.state = false;
vars.externalPump.lastEnabledTime = millis(); vars.externalPump.lastEnabledTime = millis();
Log.sinfoln(FPSTR(L_EXTPUMP), F("Disabled: use = off")); Log.sinfoln(L_EXTPUMP, "Disabled: use = off");
} }
return; return;
@@ -638,7 +636,7 @@ protected:
vars.externalPump.state = false; vars.externalPump.state = false;
vars.externalPump.lastEnabledTime = millis(); vars.externalPump.lastEnabledTime = millis();
Log.sinfoln(FPSTR(L_EXTPUMP), F("Disabled: use = off")); Log.sinfoln(L_EXTPUMP, "Disabled: use = off");
} }
return; return;
@@ -656,7 +654,7 @@ protected:
vars.externalPump.state = false; vars.externalPump.state = false;
vars.externalPump.lastEnabledTime = millis(); vars.externalPump.lastEnabledTime = millis();
Log.sinfoln(FPSTR(L_EXTPUMP), F("Disabled: expired post circulation time")); Log.sinfoln(L_EXTPUMP, "Disabled: expired post circulation time");
} else if (this->extPumpStartReason == MainTask::PumpStartReason::ANTISTUCK && millis() - this->externalPumpStartTime >= (settings.externalPump.antiStuckTime * 1000u)) { } else if (this->extPumpStartReason == MainTask::PumpStartReason::ANTISTUCK && millis() - this->externalPumpStartTime >= (settings.externalPump.antiStuckTime * 1000u)) {
digitalWrite( digitalWrite(
@@ -669,7 +667,7 @@ protected:
vars.externalPump.state = false; vars.externalPump.state = false;
vars.externalPump.lastEnabledTime = millis(); vars.externalPump.lastEnabledTime = millis();
Log.sinfoln(FPSTR(L_EXTPUMP), F("Disabled: expired anti stuck time")); Log.sinfoln(L_EXTPUMP, "Disabled: expired anti stuck time");
} }
} else if (vars.externalPump.state && this->heatingEnabled && this->extPumpStartReason == MainTask::PumpStartReason::ANTISTUCK) { } else if (vars.externalPump.state && this->heatingEnabled && this->extPumpStartReason == MainTask::PumpStartReason::ANTISTUCK) {
@@ -687,7 +685,7 @@ protected:
: HIGH : HIGH
); );
Log.sinfoln(FPSTR(L_EXTPUMP), F("Enabled: heating on")); Log.sinfoln(L_EXTPUMP, "Enabled: heating on");
} else if (!vars.externalPump.state && (vars.externalPump.lastEnabledTime == 0 || millis() - vars.externalPump.lastEnabledTime >= (settings.externalPump.antiStuckInterval * 1000lu))) { } else if (!vars.externalPump.state && (vars.externalPump.lastEnabledTime == 0 || millis() - vars.externalPump.lastEnabledTime >= (settings.externalPump.antiStuckInterval * 1000lu))) {
vars.externalPump.state = true; vars.externalPump.state = true;
@@ -701,7 +699,7 @@ protected:
: HIGH : HIGH
); );
Log.sinfoln(FPSTR(L_EXTPUMP), F("Enabled: anti stuck")); Log.sinfoln(L_EXTPUMP, "Enabled: anti stuck");
} }
} }
}; };
+34 -68
View File
@@ -1,6 +1,6 @@
#include <unordered_map> #include <unordered_map>
#include <MqttClient.h> #include <MqttClient.h>
#include <MqttWiFiClient.h> #include <WiFiClient.h>
#include <MqttWriter.h> #include <MqttWriter.h>
#include "HaHelper.h" #include "HaHelper.h"
@@ -9,7 +9,7 @@ extern FileData fsSettings;
class MqttTask : public Task { class MqttTask : public Task {
public: public:
explicit MqttTask(bool _enabled = false, unsigned long _interval = 0) : Task(_enabled, _interval) { explicit MqttTask(bool _enabled = false, unsigned long _interval = 0) : Task(_enabled, _interval) {
this->wifiClient = new MqttWiFiClient(); this->wifiClient = new WiFiClient();
this->client = new MqttClient(this->wifiClient); this->client = new MqttClient(this->wifiClient);
this->writer = new MqttWriter(this->client, 256); this->writer = new MqttWriter(this->client, 256);
this->haHelper = new HaHelper(); this->haHelper = new HaHelper();
@@ -45,13 +45,13 @@ public:
Task::disable(); Task::disable();
Log.sinfoln(FPSTR(L_MQTT), F("Disabled")); Log.sinfoln(L_MQTT, "Disabled");
} }
void enable() { void enable() {
Task::enable(); Task::enable();
Log.sinfoln(FPSTR(L_MQTT), F("Enabled")); Log.sinfoln(L_MQTT, "Enabled");
} }
inline bool isConnected() { inline bool isConnected() {
@@ -75,7 +75,7 @@ public:
} }
protected: protected:
MqttWiFiClient* wifiClient = nullptr; WiFiClient* wifiClient = nullptr;
MqttClient* client = nullptr; MqttClient* client = nullptr;
HaHelper* haHelper = nullptr; HaHelper* haHelper = nullptr;
MqttWriter* writer = nullptr; MqttWriter* writer = nullptr;
@@ -92,7 +92,6 @@ protected:
bool connected = false; bool connected = false;
bool newConnection = false; bool newConnection = false;
#if defined(ARDUINO_ARCH_ESP32)
const char* getTaskName() override { const char* getTaskName() override {
return "Mqtt"; return "Mqtt";
} }
@@ -104,28 +103,17 @@ protected:
int getTaskPriority() override { int getTaskPriority() override {
return 2; return 2;
} }
#endif
inline bool isReadyForSend() { inline bool isReadyForSend() {
return millis() - this->connectedTime > this->readyForSendTime; return millis() - this->connectedTime > this->readyForSendTime;
} }
void setup() { void setup() {
Log.sinfoln(FPSTR(L_MQTT), F("Started")); Log.sinfoln(L_MQTT, "Started");
// wificlient settings
#ifdef ARDUINO_ARCH_ESP8266
this->wifiClient->setSync(true);
this->wifiClient->setNoDelay(true);
#endif
// client settings // client settings
this->client->setTxPayloadSize(256); this->client->setTxPayloadSize(256);
#ifdef ARDUINO_ARCH_ESP8266
this->client->setConnectionTimeout(1000);
#else
this->client->setConnectionTimeout(3000); this->client->setConnectionTimeout(3000);
#endif
this->client->onMessage([this] (void*, size_t length) { this->client->onMessage([this] (void*, size_t length) {
const String& topic = this->client->messageTopic(); const String& topic = this->client->messageTopic();
@@ -142,35 +130,17 @@ protected:
}); });
// writer settings // writer settings
#ifdef ARDUINO_ARCH_ESP32
this->writer->setYieldCallback([this] { this->writer->setYieldCallback([this] {
this->delay(10); this->delay(10);
}); });
#endif
this->writer->setPublishEventCallback([this] (const char* topic, size_t written, size_t length, bool result) { this->writer->setPublishEventCallback([this] (const char* topic, size_t written, size_t length, bool result) {
Log.straceln(FPSTR(L_MQTT), F("%s publish %u of %u bytes to topic: %s"), result ? F("Successfully") : F("Failed"), written, length, topic); Log.straceln(L_MQTT, "%s publish %u of %u bytes to topic: %s", result ? "Successfully" : "Failed", written, length, topic);
#ifdef ARDUINO_ARCH_ESP8266
::optimistic_yield(1000);
#endif
//this->client->poll(); //this->client->poll();
this->delay(250); this->delay(250);
}); });
#ifdef ARDUINO_ARCH_ESP8266
this->writer->setFlushEventCallback([this] (size_t, size_t) {
::optimistic_yield(1000);
if (this->wifiClient->connected()) {
this->wifiClient->flush();
}
::optimistic_yield(1000);
});
#endif
// ha helper settings // ha helper settings
this->haHelper->setDevicePrefix(settings.mqtt.prefix); this->haHelper->setDevicePrefix(settings.mqtt.prefix);
this->haHelper->setDeviceVersion(BUILD_VERSION); this->haHelper->setDeviceVersion(BUILD_VERSION);
@@ -192,7 +162,7 @@ protected:
this->onDisconnect(); this->onDisconnect();
} else if (!this->connected && millis() - this->lastReconnectTime >= MQTT_RECONNECT_INTERVAL) { } else if (!this->connected && millis() - this->lastReconnectTime >= MQTT_RECONNECT_INTERVAL) {
Log.sinfoln(FPSTR(L_MQTT), F("Connecting to %s:%u..."), settings.mqtt.server, settings.mqtt.port); Log.sinfoln(L_MQTT, "Connecting to %s:%u...", settings.mqtt.server, settings.mqtt.port);
this->haHelper->setDevicePrefix(settings.mqtt.prefix); this->haHelper->setDevicePrefix(settings.mqtt.prefix);
this->haHelper->updateCachedTopics(); this->haHelper->updateCachedTopics();
@@ -201,8 +171,8 @@ protected:
this->client->setKeepAliveInterval(settings.mqtt.interval * 10000); this->client->setKeepAliveInterval(settings.mqtt.interval * 10000);
this->client->setId(networkSettings.hostname); this->client->setId(networkSettings.hostname);
this->client->setUsernamePassword(settings.mqtt.user, settings.mqtt.password); this->client->setUsernamePassword(settings.mqtt.user, settings.mqtt.password);
this->client->beginWill(this->haHelper->getDeviceTopic(F("status")).c_str(), 7, true, 1); this->client->beginWill(this->haHelper->getDeviceTopic("status").c_str(), 7, true, 1);
this->client->print(F("offline")); this->client->print("offline");
this->client->endWill(); this->client->endWill();
this->client->connect(settings.mqtt.server, settings.mqtt.port); this->client->connect(settings.mqtt.server, settings.mqtt.port);
this->lastReconnectTime = millis(); this->lastReconnectTime = millis();
@@ -224,20 +194,16 @@ protected:
return; return;
} }
#ifdef ARDUINO_ARCH_ESP8266
::optimistic_yield(1000);
#endif
// publish variables and status // publish variables and status
if (this->newConnection || millis() - this->prevPubVarsTime > (settings.mqtt.interval * 1000u)) { if (this->newConnection || millis() - this->prevPubVarsTime > (settings.mqtt.interval * 1000u)) {
this->writer->publish(this->haHelper->getDeviceTopic(F("status")).c_str(), "online", false); this->writer->publish(this->haHelper->getDeviceTopic("status").c_str(), "online", false);
this->publishVariables(this->haHelper->getDeviceTopic(F("state")).c_str()); this->publishVariables(this->haHelper->getDeviceTopic("state").c_str());
this->prevPubVarsTime = millis(); this->prevPubVarsTime = millis();
} }
// publish settings // publish settings
if (this->newConnection || millis() - this->prevPubSettingsTime > (settings.mqtt.interval * 10000u)) { if (this->newConnection || millis() - this->prevPubSettingsTime > (settings.mqtt.interval * 10000u)) {
this->publishSettings(this->haHelper->getDeviceTopic(F("settings")).c_str()); this->publishSettings(this->haHelper->getDeviceTopic("settings").c_str());
this->prevPubSettingsTime = millis(); this->prevPubSettingsTime = millis();
} }
@@ -278,7 +244,7 @@ protected:
// rebuilding ha configs // rebuilding ha configs
for (auto& [sensorId, prevSettings] : this->queueReconfigureSensors) { for (auto& [sensorId, prevSettings] : this->queueReconfigureSensors) {
Log.sinfoln(FPSTR(L_MQTT_HA), F("Rebuilding config for sensor #%hhu '%s'"), sensorId, prevSettings.name); Log.sinfoln(L_MQTT_HA, "Rebuilding config for sensor #%hhu '%s'", sensorId, prevSettings.name);
// delete old config // delete old config
if (strlen(prevSettings.name) && prevSettings.enabled) { if (strlen(prevSettings.name) && prevSettings.enabled) {
@@ -357,9 +323,9 @@ protected:
if (prevSettings.type == Sensors::Type::MANUAL) { if (prevSettings.type == Sensors::Type::MANUAL) {
this->client->unsubscribe( this->client->unsubscribe(
this->haHelper->getDeviceTopic( this->haHelper->getDeviceTopic(
F("sensors"), "sensors",
Sensors::makeObjectId(prevSettings.name).c_str(), Sensors::makeObjectId(prevSettings.name).c_str(),
F("set") "set"
).c_str() ).c_str()
); );
} }
@@ -374,9 +340,9 @@ protected:
if (sSettings.type == Sensors::Type::MANUAL) { if (sSettings.type == Sensors::Type::MANUAL) {
this->client->subscribe( this->client->subscribe(
this->haHelper->getDeviceTopic( this->haHelper->getDeviceTopic(
F("sensors"), "sensors",
Sensors::makeObjectId(sSettings.name).c_str(), Sensors::makeObjectId(sSettings.name).c_str(),
F("set") "set"
).c_str() ).c_str()
); );
} }
@@ -394,10 +360,10 @@ protected:
this->connectedTime = millis(); this->connectedTime = millis();
this->newConnection = true; this->newConnection = true;
unsigned long downtime = (millis() - this->disconnectedTime) / 1000; unsigned long downtime = (millis() - this->disconnectedTime) / 1000;
Log.sinfoln(FPSTR(L_MQTT), F("Connected (downtime: %u s.)"), downtime); Log.sinfoln(L_MQTT, "Connected (downtime: %u s.)", downtime);
this->client->subscribe(this->haHelper->getDeviceTopic(F("settings/set")).c_str()); this->client->subscribe(this->haHelper->getDeviceTopic("settings/set").c_str());
this->client->subscribe(this->haHelper->getDeviceTopic(F("state/set")).c_str()); this->client->subscribe(this->haHelper->getDeviceTopic("state/set").c_str());
// subscribe to manual sensors // subscribe to manual sensors
for (uint8_t sensorId = 0; sensorId <= Sensors::getMaxSensorId(); sensorId++) { for (uint8_t sensorId = 0; sensorId <= Sensors::getMaxSensorId(); sensorId++) {
@@ -412,9 +378,9 @@ protected:
this->client->subscribe( this->client->subscribe(
this->haHelper->getDeviceTopic( this->haHelper->getDeviceTopic(
F("sensors"), "sensors",
Sensors::makeObjectId(sSettings.name).c_str(), Sensors::makeObjectId(sSettings.name).c_str(),
F("set") "set"
).c_str() ).c_str()
); );
} }
@@ -424,7 +390,7 @@ protected:
this->disconnectedTime = millis(); this->disconnectedTime = millis();
unsigned long uptime = (millis() - this->connectedTime) / 1000; unsigned long uptime = (millis() - this->connectedTime) / 1000;
Log.swarningln(FPSTR(L_MQTT), F("Disconnected (reason: %d uptime: %lu s.)"), this->client->connectError(), uptime); Log.swarningln(L_MQTT, "Disconnected (reason: %d uptime: %lu s.)", this->client->connectError(), uptime);
} }
void onMessage(const String& topic, uint8_t* payload, size_t length) { void onMessage(const String& topic, uint8_t* payload, size_t length) {
@@ -433,7 +399,7 @@ protected:
} }
if (settings.system.logLevel >= TinyLoggerLevel::TRACE) { if (settings.system.logLevel >= TinyLoggerLevel::TRACE) {
Log.strace(FPSTR(L_MQTT_MSG), F("Topic: %s\r\n> "), topic.c_str()); Log.strace(L_MQTT_MSG, "Topic: %s\r\n> ", topic.c_str());
if (Log.lock()) { if (Log.lock()) {
for (size_t i = 0; i < length; i++) { for (size_t i = 0; i < length; i++) {
if (payload[i] == 0) { if (payload[i] == 0) {
@@ -441,12 +407,12 @@ protected:
} else if (payload[i] == 13) { } else if (payload[i] == 13) {
continue; continue;
} else if (payload[i] == 10) { } else if (payload[i] == 10) {
Log.print(F("\r\n> ")); Log.print("\r\n> ");
} else { } else {
Log.print(static_cast<char>(payload[i])); Log.print(static_cast<char>(payload[i]));
} }
} }
Log.print(F("\r\n\n")); Log.print("\r\n\n");
Log.flush(); Log.flush();
Log.unlock(); Log.unlock();
} }
@@ -455,11 +421,11 @@ protected:
JsonDocument doc; JsonDocument doc;
DeserializationError dErr = deserializeJson(doc, payload, length); DeserializationError dErr = deserializeJson(doc, payload, length);
if (dErr != DeserializationError::Ok) { if (dErr != DeserializationError::Ok) {
Log.swarningln(FPSTR(L_MQTT_MSG), F("Error on deserialization: %s"), dErr.f_str()); Log.swarningln(L_MQTT_MSG, "Error on deserialization: %s", dErr.c_str());
return; return;
} else if (doc.isNull() || !doc.size()) { } else if (doc.isNull() || !doc.size()) {
Log.swarningln(FPSTR(L_MQTT_MSG), F("Not valid json")); Log.swarningln(L_MQTT_MSG, "Not valid json");
return; return;
} }
doc.shrinkToFit(); doc.shrinkToFit();
@@ -467,22 +433,22 @@ protected:
// delete topic // delete topic
this->writer->publish(topic.c_str(), nullptr, 0, true); this->writer->publish(topic.c_str(), nullptr, 0, true);
if (this->haHelper->getDeviceTopic(F("state/set")).equals(topic)) { if (this->haHelper->getDeviceTopic("state/set").equals(topic)) {
if (jsonToVars(doc, vars)) { if (jsonToVars(doc, vars)) {
this->resetPublishedVarsTime(); this->resetPublishedVarsTime();
} }
} else if (this->haHelper->getDeviceTopic(F("settings/set")).equals(topic)) { } else if (this->haHelper->getDeviceTopic("settings/set").equals(topic)) {
if (safeJsonToSettings(doc, settings)) { if (safeJsonToSettings(doc, settings)) {
this->resetPublishedSettingsTime(); this->resetPublishedSettingsTime();
fsSettings.update(); fsSettings.update();
} }
} else { } else {
const String& sensorsTopic = this->haHelper->getDeviceTopic(F("sensors/")); const String& sensorsTopic = this->haHelper->getDeviceTopic("sensors/");
auto stLength = sensorsTopic.length(); auto stLength = sensorsTopic.length();
if (topic.startsWith(sensorsTopic) && topic.endsWith(F("/set"))) { if (topic.startsWith(sensorsTopic) && topic.endsWith("/set")) {
if (topic.length() > stLength + 4) { if (topic.length() > stLength + 4) {
const String& name = topic.substring(stLength, topic.indexOf('/', stLength)); const String& name = topic.substring(stLength, topic.indexOf('/', stLength));
int16_t id = Sensors::getIdByObjectId(name.c_str()); int16_t id = Sensors::getIdByObjectId(name.c_str());
@@ -649,7 +615,7 @@ protected:
return this->writer->publish( return this->writer->publish(
this->haHelper->getDeviceTopic( this->haHelper->getDeviceTopic(
F("sensors"), "sensors",
Sensors::makeObjectId(sSettings.name).c_str() Sensors::makeObjectId(sSettings.name).c_str()
).c_str(), ).c_str(),
doc, doc,
+136 -138
View File
@@ -35,7 +35,6 @@ protected:
unsigned long roomSetTempCh2Time = 0; unsigned long roomSetTempCh2Time = 0;
uint8_t configuredRxLedGpio = GPIO_IS_NOT_CONFIGURED; uint8_t configuredRxLedGpio = GPIO_IS_NOT_CONFIGURED;
#if defined(ARDUINO_ARCH_ESP32)
const char* getTaskName() override { const char* getTaskName() override {
return "OpenTherm"; return "OpenTherm";
} }
@@ -51,7 +50,6 @@ protected:
int getTaskPriority() override { int getTaskPriority() override {
return 5; return 5;
} }
#endif
void setup() { void setup() {
// Convert defaults at start // Convert defaults at start
@@ -66,13 +64,13 @@ protected:
if (this->instance != nullptr) { if (this->instance != nullptr) {
delete this->instance; delete this->instance;
this->instance = nullptr; this->instance = nullptr;
Log.sinfoln(FPSTR(L_OT), F("Stopped")); Log.sinfoln(L_OT, "Stopped");
} }
if (!GPIO_IS_VALID(settings.opentherm.inGpio) || !GPIO_IS_VALID(settings.opentherm.outGpio)) { if (!GPIO_IS_VALID(settings.opentherm.inGpio) || !GPIO_IS_VALID(settings.opentherm.outGpio)) {
Log.swarningln( Log.swarningln(
FPSTR(L_OT), L_OT,
F("Not started. GPIO IN: %hhu or GPIO OUT: %hhu is not valid"), "Not started. GPIO IN: %hhu or GPIO OUT: %hhu is not valid",
settings.opentherm.inGpio, settings.opentherm.inGpio,
settings.opentherm.outGpio settings.opentherm.outGpio
); );
@@ -99,12 +97,12 @@ protected:
this->roomSetTempTime = 0; this->roomSetTempTime = 0;
this->roomSetTempCh2Time = 0; this->roomSetTempCh2Time = 0;
Log.sinfoln(FPSTR(L_OT), F("Started. GPIO IN: %hhu, GPIO OUT: %hhu"), settings.opentherm.inGpio, settings.opentherm.outGpio); Log.sinfoln(L_OT, "Started. GPIO IN: %hhu, GPIO OUT: %hhu", settings.opentherm.inGpio, settings.opentherm.outGpio);
this->instance->setAfterSendRequestCallback([this](unsigned long request, unsigned long response, OpenThermResponseStatus status, uint8_t attempt) { this->instance->setAfterSendRequestCallback([this](unsigned long request, unsigned long response, OpenThermResponseStatus status, uint8_t attempt) {
Log.sverboseln( Log.sverboseln(
FPSTR(L_OT), L_OT,
F("ID: %4d Request: %8lx Response: %8lx Msg type: %s Attempt: %2d Status: %s"), "ID: %4d Request: %8lx Response: %8lx Msg type: %s Attempt: %2d Status: %s",
CustomOpenTherm::getDataID(request), CustomOpenTherm::getDataID(request),
request, request,
response, response,
@@ -155,7 +153,7 @@ protected:
} else if (this->instance->status == OpenThermStatus::NOT_INITIALIZED) { } else if (this->instance->status == OpenThermStatus::NOT_INITIALIZED) {
if (!this->instance->begin()) { if (!this->instance->begin()) {
Log.swarningln(FPSTR(L_OT), F("Failed begin")); Log.swarningln(L_OT, "Failed begin");
this->delay(5000); this->delay(5000);
return; return;
@@ -241,8 +239,8 @@ protected:
if (!CustomOpenTherm::isValidResponse(response) || !CustomOpenTherm::isValidResponseId(response, OpenThermMessageID::Status)) { if (!CustomOpenTherm::isValidResponse(response) || !CustomOpenTherm::isValidResponseId(response, OpenThermMessageID::Status)) {
Log.swarningln( Log.swarningln(
FPSTR(L_OT), L_OT,
F("Failed receive boiler status: %s"), "Failed receive boiler status: %s",
CustomOpenTherm::statusToString(this->instance->getLastResponseStatus()) CustomOpenTherm::statusToString(this->instance->getLastResponseStatus())
); );
@@ -262,7 +260,7 @@ protected:
} }
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT), F("Received boiler status. Heating: %hhu; DHW: %hhu; flame: %hhu; cooling: %hhu; channel 2: %hhu; fault: %hhu; diag: %hhu"), L_OT, "Received boiler status. Heating: %hhu; DHW: %hhu; flame: %hhu; cooling: %hhu; channel 2: %hhu; fault: %hhu; diag: %hhu",
vars.slave.heating.active, vars.slave.dhw.active, vars.slave.heating.active, vars.slave.dhw.active,
vars.slave.flame, vars.slave.cooling.active, vars.slave.ch2.active, vars.slave.fault.active, vars.slave.diag.active vars.slave.flame, vars.slave.cooling.active, vars.slave.ch2.active, vars.slave.fault.active, vars.slave.diag.active
); );
@@ -275,8 +273,8 @@ protected:
// 5 * (1000 + 100) * 1.15 = 6325 ms // 5 * (1000 + 100) * 1.15 = 6325 ms
if (!vars.slave.connected && millis() - this->lastSuccessResponse < 6325) { if (!vars.slave.connected && millis() - this->lastSuccessResponse < 6325) {
Log.sinfoln( Log.sinfoln(
FPSTR(L_OT), L_OT,
F("Connected, downtime: %lu s."), "Connected, downtime: %lu s.",
(millis() - this->disconnectedTime) / 1000 (millis() - this->disconnectedTime) / 1000
); );
@@ -285,8 +283,8 @@ protected:
} else if (vars.slave.connected && millis() - this->lastSuccessResponse > 6325) { } else if (vars.slave.connected && millis() - this->lastSuccessResponse > 6325) {
Log.swarningln( Log.swarningln(
FPSTR(L_OT), L_OT,
F("Disconnected, uptime: %lu s."), "Disconnected, uptime: %lu s.",
(millis() - this->connectedTime) / 1000 (millis() - this->connectedTime) / 1000
); );
@@ -343,7 +341,7 @@ protected:
// reset bus // reset bus
if (millis() - this->disconnectedTime > this->resetBusInterval) { if (millis() - this->disconnectedTime > this->resetBusInterval) {
if (millis() - this->resetBusTime > this->resetBusInterval) { if (millis() - this->resetBusTime > this->resetBusInterval) {
Log.sinfoln(FPSTR(L_OT), F("Reset bus...")); Log.sinfoln(L_OT, "Reset bus...");
this->instance->end(); this->instance->end();
this->instance->status = OpenThermStatus::NOT_INITIALIZED; this->instance->status = OpenThermStatus::NOT_INITIALIZED;
@@ -358,7 +356,7 @@ protected:
} }
if (!this->initialized) { if (!this->initialized) {
Log.sinfoln(FPSTR(L_OT), F("Initializing...")); Log.sinfoln(L_OT, "Initializing...");
this->initialized = true; this->initialized = true;
this->initializedTime = millis(); this->initializedTime = millis();
this->initialize(); this->initialize();
@@ -367,13 +365,13 @@ protected:
if (vars.master.heating.enabled != vars.slave.heating.enabled) { if (vars.master.heating.enabled != vars.slave.heating.enabled) {
this->prevUpdateNonEssentialVars = 0; this->prevUpdateNonEssentialVars = 0;
vars.slave.heating.enabled = vars.master.heating.enabled; vars.slave.heating.enabled = vars.master.heating.enabled;
Log.sinfoln(FPSTR(L_OT_HEATING), vars.master.heating.enabled ? F("Enabled") : F("Disabled")); Log.sinfoln(L_OT_HEATING, vars.master.heating.enabled ? "Enabled" : "Disabled");
} }
if (vars.master.dhw.enabled != vars.slave.dhw.enabled) { if (vars.master.dhw.enabled != vars.slave.dhw.enabled) {
this->prevUpdateNonEssentialVars = 0; this->prevUpdateNonEssentialVars = 0;
vars.slave.dhw.enabled = vars.master.dhw.enabled; vars.slave.dhw.enabled = vars.master.dhw.enabled;
Log.sinfoln(FPSTR(L_OT_DHW), vars.master.dhw.enabled ? F("Enabled") : F("Disabled")); Log.sinfoln(L_OT_DHW, vars.master.dhw.enabled ? "Enabled" : "Disabled");
} }
// These parameters will be updated every minute // These parameters will be updated every minute
@@ -384,24 +382,24 @@ protected:
if (getLocalTime(&ti)) { if (getLocalTime(&ti)) {
if (this->setYear(&ti)) { if (this->setYear(&ti)) {
Log.sinfoln(FPSTR(L_OT), F("Year of date set successfully")); Log.sinfoln(L_OT, "Year of date set successfully");
} else { } else {
Log.sinfoln(FPSTR(L_OT), F("Failed set year of date")); Log.sinfoln(L_OT, "Failed set year of date");
} }
if (this->setDayAndMonth(&ti)) { if (this->setDayAndMonth(&ti)) {
Log.sinfoln(FPSTR(L_OT), F("Day and month of date set successfully")); Log.sinfoln(L_OT, "Day and month of date set successfully");
} else { } else {
Log.sinfoln(FPSTR(L_OT), F("Failed set day and month of date")); Log.sinfoln(L_OT, "Failed set day and month of date");
} }
if (this->setTime(&ti)) { if (this->setTime(&ti)) {
Log.sinfoln(FPSTR(L_OT), F("Time set successfully")); Log.sinfoln(L_OT, "Time set successfully");
} else { } else {
Log.sinfoln(FPSTR(L_OT), F("Failed set time")); Log.sinfoln(L_OT, "Failed set time");
} }
} }
} }
@@ -409,7 +407,7 @@ protected:
// Get min modulation level & max power // Get min modulation level & max power
if (this->updateMinModulationLevel()) { if (this->updateMinModulationLevel()) {
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT), F("Received min modulation: %hhu%%, max power: %.2f kW"), L_OT, "Received min modulation: %hhu%%, max power: %.2f kW",
vars.slave.modulation.min, vars.slave.power.max vars.slave.modulation.min, vars.slave.power.max
); );
@@ -418,7 +416,7 @@ protected:
fsSettings.update(); fsSettings.update();
Log.swarningln( Log.swarningln(
FPSTR(L_SETTINGS_HEATING), F("Updated min modulation: %hhu%%"), L_SETTINGS_HEATING, "Updated min modulation: %hhu%%",
settings.heating.maxModulation settings.heating.maxModulation
); );
} }
@@ -428,7 +426,7 @@ protected:
fsSettings.update(); fsSettings.update();
Log.swarningln( Log.swarningln(
FPSTR(L_SETTINGS_DHW), F("Updated min modulation: %hhu%%"), L_SETTINGS_DHW, "Updated min modulation: %hhu%%",
settings.dhw.maxModulation settings.dhw.maxModulation
); );
} }
@@ -439,13 +437,13 @@ protected:
fsSettings.update(); fsSettings.update();
Log.swarningln( Log.swarningln(
FPSTR(L_SETTINGS_OT), F("Updated power, min: %.2f kW, max: %.2f kW"), L_SETTINGS_OT, "Updated power, min: %.2f kW, max: %.2f kW",
settings.opentherm.minPower, settings.opentherm.maxPower settings.opentherm.minPower, settings.opentherm.maxPower
); );
} }
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive min modulation and max power")); Log.swarningln(L_OT, "Failed receive min modulation and max power");
} }
@@ -465,7 +463,7 @@ protected:
); );
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT_DHW), F("Received min temp: %hhu (converted: %hhu), max temp: %hhu (converted: %hhu)"), L_OT_DHW, "Received min temp: %hhu (converted: %hhu), max temp: %hhu (converted: %hhu)",
vars.slave.dhw.minTemp, convertedMinTemp, vars.slave.dhw.maxTemp, convertedMaxTemp vars.slave.dhw.minTemp, convertedMinTemp, vars.slave.dhw.maxTemp, convertedMaxTemp
); );
@@ -473,18 +471,18 @@ protected:
settings.dhw.minTemp = convertedMinTemp; settings.dhw.minTemp = convertedMinTemp;
fsSettings.update(); fsSettings.update();
Log.swarningln(FPSTR(L_SETTINGS_DHW), F("Updated min temp: %hhu"), settings.dhw.minTemp); Log.swarningln(L_SETTINGS_DHW, "Updated min temp: %hhu", settings.dhw.minTemp);
} }
if (settings.dhw.maxTemp > convertedMaxTemp) { if (settings.dhw.maxTemp > convertedMaxTemp) {
settings.dhw.maxTemp = convertedMaxTemp; settings.dhw.maxTemp = convertedMaxTemp;
fsSettings.update(); fsSettings.update();
Log.swarningln(FPSTR(L_SETTINGS_DHW), F("Updated max temp: %hhu"), settings.dhw.maxTemp); Log.swarningln(L_SETTINGS_DHW, "Updated max temp: %hhu", settings.dhw.maxTemp);
} }
} else { } else {
Log.swarningln(FPSTR(L_OT_DHW), F("Failed receive min/max temp")); Log.swarningln(L_OT_DHW, "Failed receive min/max temp");
} }
} }
@@ -511,7 +509,7 @@ protected:
); );
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT_HEATING), F("Received min temp: %hhu (converted: %hhu), max temp: %hhu (converted: %hhu)"), L_OT_HEATING, "Received min temp: %hhu (converted: %hhu), max temp: %hhu (converted: %hhu)",
vars.slave.heating.minTemp, convertedMinTemp, vars.slave.heating.maxTemp, convertedMaxTemp vars.slave.heating.minTemp, convertedMinTemp, vars.slave.heating.maxTemp, convertedMaxTemp
); );
@@ -519,18 +517,18 @@ protected:
settings.heating.minTemp = convertedMinTemp; settings.heating.minTemp = convertedMinTemp;
fsSettings.update(); fsSettings.update();
Log.swarningln(FPSTR(L_SETTINGS_HEATING), F("Updated min temp: %hhu"), settings.heating.minTemp); Log.swarningln(L_SETTINGS_HEATING, "Updated min temp: %hhu", settings.heating.minTemp);
} }
if (settings.heating.maxTemp > convertedMaxTemp) { if (settings.heating.maxTemp > convertedMaxTemp) {
settings.heating.maxTemp = convertedMaxTemp; settings.heating.maxTemp = convertedMaxTemp;
fsSettings.update(); fsSettings.update();
Log.swarningln(FPSTR(L_SETTINGS_HEATING), F("Updated max temp: %hhu"), settings.heating.maxTemp); Log.swarningln(L_SETTINGS_HEATING, "Updated max temp: %hhu", settings.heating.maxTemp);
} }
} else { } else {
Log.swarningln(FPSTR(L_OT_HEATING), F("Failed receive min/max temp")); Log.swarningln(L_OT_HEATING, "Failed receive min/max temp");
} }
} }
@@ -544,12 +542,12 @@ protected:
if (vars.slave.fault.active) { if (vars.slave.fault.active) {
if (this->updateFaultCode()) { if (this->updateFaultCode()) {
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT), F("Received fault code: %hhu (0x%02X)"), L_OT, "Received fault code: %hhu (0x%02X)",
vars.slave.fault.code, vars.slave.fault.code vars.slave.fault.code, vars.slave.fault.code
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive fault code")); Log.swarningln(L_OT, "Failed receive fault code");
} }
} else if (vars.slave.fault.code != 0) { } else if (vars.slave.fault.code != 0) {
@@ -560,12 +558,12 @@ protected:
if (vars.slave.fault.active || vars.slave.diag.active) { if (vars.slave.fault.active || vars.slave.diag.active) {
if (this->updateDiagCode()) { if (this->updateDiagCode()) {
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT), F("Received diag code: %hu (0x%02X)"), L_OT, "Received diag code: %hu (0x%02X)",
vars.slave.diag.code, vars.slave.diag.code vars.slave.diag.code, vars.slave.diag.code
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive diag code")); Log.swarningln(L_OT, "Failed receive diag code");
} }
} else if (vars.slave.diag.code != 0) { } else if (vars.slave.diag.code != 0) {
@@ -575,7 +573,7 @@ protected:
// Update burner starts // Update burner starts
if (Sensors::getAmountByType(Sensors::Type::OT_BURNER_STARTS, true)) { if (Sensors::getAmountByType(Sensors::Type::OT_BURNER_STARTS, true)) {
if (this->updateBurnerStarts()) { if (this->updateBurnerStarts()) {
Log.snoticeln(FPSTR(L_OT), F("Received burner starts: %hu"), vars.slave.stats.burnerStarts); Log.snoticeln(L_OT, "Received burner starts: %hu", vars.slave.stats.burnerStarts);
Sensors::setValueByType( Sensors::setValueByType(
Sensors::Type::OT_BURNER_STARTS, vars.slave.stats.burnerStarts, Sensors::Type::OT_BURNER_STARTS, vars.slave.stats.burnerStarts,
@@ -583,14 +581,14 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive burner starts")); Log.swarningln(L_OT, "Failed receive burner starts");
} }
} }
// Update DHW burner starts // Update DHW burner starts
if (Sensors::getAmountByType(Sensors::Type::OT_DHW_BURNER_STARTS, true)) { if (Sensors::getAmountByType(Sensors::Type::OT_DHW_BURNER_STARTS, true)) {
if (this->updateDhwBurnerStarts()) { if (this->updateDhwBurnerStarts()) {
Log.snoticeln(FPSTR(L_OT), F("Received DHW burner starts: %hu"), vars.slave.stats.dhwBurnerStarts); Log.snoticeln(L_OT, "Received DHW burner starts: %hu", vars.slave.stats.dhwBurnerStarts);
Sensors::setValueByType( Sensors::setValueByType(
Sensors::Type::OT_DHW_BURNER_STARTS, vars.slave.stats.dhwBurnerStarts, Sensors::Type::OT_DHW_BURNER_STARTS, vars.slave.stats.dhwBurnerStarts,
@@ -598,14 +596,14 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive DHW burner starts")); Log.swarningln(L_OT, "Failed receive DHW burner starts");
} }
} }
// Update heating pump starts // Update heating pump starts
if (Sensors::getAmountByType(Sensors::Type::OT_HEATING_PUMP_STARTS, true)) { if (Sensors::getAmountByType(Sensors::Type::OT_HEATING_PUMP_STARTS, true)) {
if (this->updateHeatingPumpStarts()) { if (this->updateHeatingPumpStarts()) {
Log.snoticeln(FPSTR(L_OT), F("Received heating pump starts: %hu"), vars.slave.stats.heatingPumpStarts); Log.snoticeln(L_OT, "Received heating pump starts: %hu", vars.slave.stats.heatingPumpStarts);
Sensors::setValueByType( Sensors::setValueByType(
Sensors::Type::OT_HEATING_PUMP_STARTS, vars.slave.stats.heatingPumpStarts, Sensors::Type::OT_HEATING_PUMP_STARTS, vars.slave.stats.heatingPumpStarts,
@@ -613,14 +611,14 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive heating pump starts")); Log.swarningln(L_OT, "Failed receive heating pump starts");
} }
} }
// Update DHW pump starts // Update DHW pump starts
if (Sensors::getAmountByType(Sensors::Type::OT_DHW_PUMP_STARTS, true)) { if (Sensors::getAmountByType(Sensors::Type::OT_DHW_PUMP_STARTS, true)) {
if (this->updateDhwPumpStarts()) { if (this->updateDhwPumpStarts()) {
Log.snoticeln(FPSTR(L_OT), F("Received DHW pump starts: %hu"), vars.slave.stats.dhwPumpStarts); Log.snoticeln(L_OT, "Received DHW pump starts: %hu", vars.slave.stats.dhwPumpStarts);
Sensors::setValueByType( Sensors::setValueByType(
Sensors::Type::OT_DHW_PUMP_STARTS, vars.slave.stats.dhwPumpStarts, Sensors::Type::OT_DHW_PUMP_STARTS, vars.slave.stats.dhwPumpStarts,
@@ -628,14 +626,14 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive DHW pump starts")); Log.swarningln(L_OT, "Failed receive DHW pump starts");
} }
} }
// Update burner hours // Update burner hours
if (Sensors::getAmountByType(Sensors::Type::OT_BURNER_HOURS, true)) { if (Sensors::getAmountByType(Sensors::Type::OT_BURNER_HOURS, true)) {
if (this->updateBurnerHours()) { if (this->updateBurnerHours()) {
Log.snoticeln(FPSTR(L_OT), F("Received burner hours: %hu"), vars.slave.stats.burnerHours); Log.snoticeln(L_OT, "Received burner hours: %hu", vars.slave.stats.burnerHours);
Sensors::setValueByType( Sensors::setValueByType(
Sensors::Type::OT_BURNER_HOURS, vars.slave.stats.burnerHours, Sensors::Type::OT_BURNER_HOURS, vars.slave.stats.burnerHours,
@@ -643,14 +641,14 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive burner hours")); Log.swarningln(L_OT, "Failed receive burner hours");
} }
} }
// Update DHW burner hours // Update DHW burner hours
if (Sensors::getAmountByType(Sensors::Type::OT_DHW_BURNER_HOURS, true)) { if (Sensors::getAmountByType(Sensors::Type::OT_DHW_BURNER_HOURS, true)) {
if (this->updateDhwBurnerHours()) { if (this->updateDhwBurnerHours()) {
Log.snoticeln(FPSTR(L_OT), F("Received DHW burner hours: %hu"), vars.slave.stats.dhwBurnerHours); Log.snoticeln(L_OT, "Received DHW burner hours: %hu", vars.slave.stats.dhwBurnerHours);
Sensors::setValueByType( Sensors::setValueByType(
Sensors::Type::OT_DHW_BURNER_HOURS, vars.slave.stats.dhwBurnerHours, Sensors::Type::OT_DHW_BURNER_HOURS, vars.slave.stats.dhwBurnerHours,
@@ -658,14 +656,14 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive DHW burner hours")); Log.swarningln(L_OT, "Failed receive DHW burner hours");
} }
} }
// Update heating pump hours // Update heating pump hours
if (Sensors::getAmountByType(Sensors::Type::OT_HEATING_PUMP_HOURS, true)) { if (Sensors::getAmountByType(Sensors::Type::OT_HEATING_PUMP_HOURS, true)) {
if (this->updateHeatingPumpHours()) { if (this->updateHeatingPumpHours()) {
Log.snoticeln(FPSTR(L_OT), F("Received heating pump hours: %hu"), vars.slave.stats.heatingPumpHours); Log.snoticeln(L_OT, "Received heating pump hours: %hu", vars.slave.stats.heatingPumpHours);
Sensors::setValueByType( Sensors::setValueByType(
Sensors::Type::OT_HEATING_PUMP_HOURS, vars.slave.stats.heatingPumpHours, Sensors::Type::OT_HEATING_PUMP_HOURS, vars.slave.stats.heatingPumpHours,
@@ -673,14 +671,14 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive heating pump hours")); Log.swarningln(L_OT, "Failed receive heating pump hours");
} }
} }
// Update DHW pump hours // Update DHW pump hours
if (Sensors::getAmountByType(Sensors::Type::OT_DHW_PUMP_HOURS, true)) { if (Sensors::getAmountByType(Sensors::Type::OT_DHW_PUMP_HOURS, true)) {
if (this->updateDhwPumpHours()) { if (this->updateDhwPumpHours()) {
Log.snoticeln(FPSTR(L_OT), F("Received DHW pump hours: %hu"), vars.slave.stats.dhwPumpHours); Log.snoticeln(L_OT, "Received DHW pump hours: %hu", vars.slave.stats.dhwPumpHours);
Sensors::setValueByType( Sensors::setValueByType(
Sensors::Type::OT_DHW_PUMP_HOURS, vars.slave.stats.dhwPumpHours, Sensors::Type::OT_DHW_PUMP_HOURS, vars.slave.stats.dhwPumpHours,
@@ -688,14 +686,14 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive DHW pump hours")); Log.swarningln(L_OT, "Failed receive DHW pump hours");
} }
} }
// Update cooling hours // Update cooling hours
if (Sensors::getAmountByType(Sensors::Type::OT_COOLING_HOURS, true)) { if (Sensors::getAmountByType(Sensors::Type::OT_COOLING_HOURS, true)) {
if (this->updateCoolingHours()) { if (this->updateCoolingHours()) {
Log.snoticeln(FPSTR(L_OT), F("Received cooling hours: %hu"), vars.slave.stats.coolingHours); Log.snoticeln(L_OT, "Received cooling hours: %hu", vars.slave.stats.coolingHours);
Sensors::setValueByType( Sensors::setValueByType(
Sensors::Type::OT_COOLING_HOURS, vars.slave.stats.coolingHours, Sensors::Type::OT_COOLING_HOURS, vars.slave.stats.coolingHours,
@@ -703,7 +701,7 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive cooling hours")); Log.swarningln(L_OT, "Failed receive cooling hours");
} }
} }
@@ -724,13 +722,13 @@ protected:
if (settings.opentherm.options.coolingSupport) { if (settings.opentherm.options.coolingSupport) {
if (this->setCoolingSetpoint(settings.heating.maxModulation)) { if (this->setCoolingSetpoint(settings.heating.maxModulation)) {
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT), F("Set cooling setpoint: %hhu%% (response: %hhu%%)"), L_OT, "Set cooling setpoint: %hhu%% (response: %hhu%%)",
settings.heating.maxModulation, vars.slave.cooling.setpoint settings.heating.maxModulation, vars.slave.cooling.setpoint
); );
} else { } else {
Log.swarningln( Log.swarningln(
FPSTR(L_OT), F("Failed set cooling setpoint: %hhu%% (response: %hhu%%)"), L_OT, "Failed set cooling setpoint: %hhu%% (response: %hhu%%)",
settings.heating.maxModulation, vars.slave.cooling.setpoint settings.heating.maxModulation, vars.slave.cooling.setpoint
); );
} }
@@ -759,13 +757,13 @@ protected:
if (this->setMaxModulationLevel(targetMaxModulation)) { if (this->setMaxModulationLevel(targetMaxModulation)) {
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT), F("Set max modulation: %hhu%% (response: %hhu%%)"), L_OT, "Set max modulation: %hhu%% (response: %hhu%%)",
targetMaxModulation, vars.slave.modulation.max targetMaxModulation, vars.slave.modulation.max
); );
} else { } else {
Log.swarningln( Log.swarningln(
FPSTR(L_OT), F("Failed set max modulation: %hhu%% (response: %hhu%%)"), L_OT, "Failed set max modulation: %hhu%% (response: %hhu%%)",
targetMaxModulation, vars.slave.modulation.max targetMaxModulation, vars.slave.modulation.max
); );
} }
@@ -790,7 +788,7 @@ protected:
vars.slave.power.current = power; vars.slave.power.current = power;
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT), F("Received modulation level: %hhu%%, power: %.2f of %.2f kW (min: %.2f kW)"), L_OT, "Received modulation level: %hhu%%, power: %.2f of %.2f kW (min: %.2f kW)",
vars.slave.modulation.current, vars.slave.power.current, vars.slave.modulation.current, vars.slave.power.current,
settings.opentherm.maxPower, settings.opentherm.minPower settings.opentherm.maxPower, settings.opentherm.minPower
); );
@@ -808,7 +806,7 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive modulation level")); Log.swarningln(L_OT, "Failed receive modulation level");
} }
} else { } else {
@@ -841,7 +839,7 @@ protected:
); );
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT_DHW), F("Received temp: %.2f (converted: %.2f)"), L_OT_DHW, "Received temp: %.2f (converted: %.2f)",
vars.slave.dhw.currentTemp, convertedDhwTemp vars.slave.dhw.currentTemp, convertedDhwTemp
); );
@@ -851,7 +849,7 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT_DHW), F("Failed receive temp")); Log.swarningln(L_OT_DHW, "Failed receive temp");
} }
} }
@@ -865,7 +863,7 @@ protected:
); );
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT_DHW), F("Received temp 2: %.2f (converted: %.2f)"), L_OT_DHW, "Received temp 2: %.2f (converted: %.2f)",
vars.slave.dhw.currentTemp2, convertedDhwTemp2 vars.slave.dhw.currentTemp2, convertedDhwTemp2
); );
@@ -875,7 +873,7 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT_DHW), F("Failed receive temp 2")); Log.swarningln(L_OT_DHW, "Failed receive temp 2");
} }
} }
@@ -889,7 +887,7 @@ protected:
); );
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT_DHW), F("Received flow rate: %.2f (converted: %.2f)"), L_OT_DHW, "Received flow rate: %.2f (converted: %.2f)",
vars.slave.dhw.flowRate, convertedDhwFlowRate vars.slave.dhw.flowRate, convertedDhwFlowRate
); );
@@ -899,7 +897,7 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT_DHW), F("Failed receive flow rate")); Log.swarningln(L_OT_DHW, "Failed receive flow rate");
} }
} }
@@ -913,7 +911,7 @@ protected:
); );
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT_HEATING), F("Received temp: %.2f"), L_OT_HEATING, "Received temp: %.2f",
vars.slave.heating.currentTemp, convertedHeatingTemp vars.slave.heating.currentTemp, convertedHeatingTemp
); );
@@ -923,7 +921,7 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT_HEATING), F("Failed receive temp")); Log.swarningln(L_OT_HEATING, "Failed receive temp");
} }
} }
@@ -937,7 +935,7 @@ protected:
); );
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT_HEATING), F("Received return temp: %.2f (converted: %.2f)"), L_OT_HEATING, "Received return temp: %.2f (converted: %.2f)",
vars.slave.heating.returnTemp, convertedHeatingReturnTemp vars.slave.heating.returnTemp, convertedHeatingReturnTemp
); );
@@ -947,7 +945,7 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT_HEATING), F("Failed receive return temp")); Log.swarningln(L_OT_HEATING, "Failed receive return temp");
} }
} }
@@ -962,7 +960,7 @@ protected:
); );
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT_CH2), F("Received temp: %.2f (converted: %.2f)"), L_OT_CH2, "Received temp: %.2f (converted: %.2f)",
vars.slave.ch2.currentTemp, convertedCh2Temp vars.slave.ch2.currentTemp, convertedCh2Temp
); );
@@ -972,7 +970,7 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT_CH2), F("Failed receive temp")); Log.swarningln(L_OT_CH2, "Failed receive temp");
} }
} }
} }
@@ -987,7 +985,7 @@ protected:
); );
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT), F("Received exhaust temp: %.2f (converted: %.2f)"), L_OT, "Received exhaust temp: %.2f (converted: %.2f)",
vars.slave.exhaust.temp, convertedExhaustTemp vars.slave.exhaust.temp, convertedExhaustTemp
); );
@@ -997,7 +995,7 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive exhaust temp")); Log.swarningln(L_OT, "Failed receive exhaust temp");
} }
} }
@@ -1011,7 +1009,7 @@ protected:
); );
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT), F("Received heat exchanger temp: %.2f (converted: %.2f)"), L_OT, "Received heat exchanger temp: %.2f (converted: %.2f)",
vars.slave.heatExchangerTemp, convertedHeatExchTemp vars.slave.heatExchangerTemp, convertedHeatExchTemp
); );
@@ -1021,7 +1019,7 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive heat exchanger temp")); Log.swarningln(L_OT, "Failed receive heat exchanger temp");
} }
} }
@@ -1035,7 +1033,7 @@ protected:
); );
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT), F("Received outdoor temp: %.2f (converted: %.2f)"), L_OT, "Received outdoor temp: %.2f (converted: %.2f)",
vars.slave.heating.outdoorTemp, convertedOutdoorTemp vars.slave.heating.outdoorTemp, convertedOutdoorTemp
); );
@@ -1045,7 +1043,7 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive outdoor temp")); Log.swarningln(L_OT, "Failed receive outdoor temp");
} }
} }
@@ -1059,7 +1057,7 @@ protected:
); );
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT), F("Received solar storage temp: %.2f (converted: %.2f)"), L_OT, "Received solar storage temp: %.2f (converted: %.2f)",
vars.slave.solar.storage, convertedSolarStorageTemp vars.slave.solar.storage, convertedSolarStorageTemp
); );
@@ -1069,7 +1067,7 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive solar storage temp")); Log.swarningln(L_OT, "Failed receive solar storage temp");
} }
} }
@@ -1083,7 +1081,7 @@ protected:
); );
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT), F("Received solar collector temp: %.2f (converted: %.2f)"), L_OT, "Received solar collector temp: %.2f (converted: %.2f)",
vars.slave.solar.collector, convertedSolarCollectorTemp vars.slave.solar.collector, convertedSolarCollectorTemp
); );
@@ -1093,7 +1091,7 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive solar collector temp")); Log.swarningln(L_OT, "Failed receive solar collector temp");
} }
} }
@@ -1104,7 +1102,7 @@ protected:
) { ) {
if (this->updateFanSpeed()) { if (this->updateFanSpeed()) {
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT), F("Received fan speed, setpoint: %hhu%%, current: %hhu%%"), L_OT, "Received fan speed, setpoint: %hhu%%, current: %hhu%%",
vars.slave.fanSpeed.setpoint, vars.slave.fanSpeed.current vars.slave.fanSpeed.setpoint, vars.slave.fanSpeed.current
); );
@@ -1129,7 +1127,7 @@ protected:
); );
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT), F("Received pressure: %.2f (converted: %.2f)"), L_OT, "Received pressure: %.2f (converted: %.2f)",
vars.slave.pressure, convertedPressure vars.slave.pressure, convertedPressure
); );
@@ -1139,7 +1137,7 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive pressure")); Log.swarningln(L_OT, "Failed receive pressure");
} }
} }
@@ -1147,7 +1145,7 @@ protected:
if (Sensors::getAmountByType(Sensors::Type::OT_EXHAUST_CO2, true)) { if (Sensors::getAmountByType(Sensors::Type::OT_EXHAUST_CO2, true)) {
if (this->updateExhaustCo2()) { if (this->updateExhaustCo2()) {
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT), F("Received exhaust CO2: %hu ppm"), L_OT, "Received exhaust CO2: %hu ppm",
vars.slave.exhaust.co2 vars.slave.exhaust.co2
); );
@@ -1157,7 +1155,7 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive exhaust CO2")); Log.swarningln(L_OT, "Failed receive exhaust CO2");
} }
} }
@@ -1165,7 +1163,7 @@ protected:
if (Sensors::getAmountByType(Sensors::Type::OT_EXHAUST_FAN_SPEED, true)) { if (Sensors::getAmountByType(Sensors::Type::OT_EXHAUST_FAN_SPEED, true)) {
if (this->updateExhaustFanSpeed()) { if (this->updateExhaustFanSpeed()) {
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT), F("Received exhaust fan speed: %hu rpm"), L_OT, "Received exhaust fan speed: %hu rpm",
vars.slave.exhaust.fanSpeed vars.slave.exhaust.fanSpeed
); );
@@ -1175,7 +1173,7 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive exhaust fan speed")); Log.swarningln(L_OT, "Failed receive exhaust fan speed");
} }
} }
@@ -1183,7 +1181,7 @@ protected:
if (Sensors::getAmountByType(Sensors::Type::OT_SUPPLY_FAN_SPEED, true)) { if (Sensors::getAmountByType(Sensors::Type::OT_SUPPLY_FAN_SPEED, true)) {
if (this->updateSupplyFanSpeed()) { if (this->updateSupplyFanSpeed()) {
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT), F("Received supply fan speed: %hu rpm"), L_OT, "Received supply fan speed: %hu rpm",
vars.slave.fanSpeed.supply vars.slave.fanSpeed.supply
); );
@@ -1193,7 +1191,7 @@ protected:
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive supply fan speed")); Log.swarningln(L_OT, "Failed receive supply fan speed");
} }
} }
@@ -1201,10 +1199,10 @@ protected:
if (vars.actions.resetFault) { if (vars.actions.resetFault) {
if (vars.slave.fault.active) { if (vars.slave.fault.active) {
if (this->instance->sendBoilerReset()) { if (this->instance->sendBoilerReset()) {
Log.sinfoln(FPSTR(L_OT), F("Boiler fault reset successfully")); Log.sinfoln(L_OT, "Boiler fault reset successfully");
} else { } else {
Log.serrorln(FPSTR(L_OT), F("Boiler fault reset failed")); Log.serrorln(L_OT, "Boiler fault reset failed");
} }
} }
@@ -1215,10 +1213,10 @@ protected:
if (vars.actions.resetDiagnostic) { if (vars.actions.resetDiagnostic) {
if (vars.slave.diag.active) { if (vars.slave.diag.active) {
if (this->instance->sendServiceReset()) { if (this->instance->sendServiceReset()) {
Log.sinfoln(FPSTR(L_OT), F("Boiler diagnostic reset successfully")); Log.sinfoln(L_OT, "Boiler diagnostic reset successfully");
} else { } else {
Log.serrorln(FPSTR(L_OT), F("Boiler diagnostic reset failed")); Log.serrorln(L_OT, "Boiler diagnostic reset failed");
} }
} }
@@ -1242,12 +1240,12 @@ protected:
this->dhwSetTempTime = millis(); this->dhwSetTempTime = millis();
Log.sinfoln( Log.sinfoln(
FPSTR(L_OT_DHW), F("Set temp: %.2f (converted: %.2f, response: %.2f)"), L_OT_DHW, "Set temp: %.2f (converted: %.2f, response: %.2f)",
targetTemp, convertedTemp, vars.slave.dhw.targetTemp targetTemp, convertedTemp, vars.slave.dhw.targetTemp
); );
} else { } else {
Log.swarningln(FPSTR(L_OT_DHW), F("Failed set temp")); Log.swarningln(L_OT_DHW, "Failed set temp");
} }
} }
} }
@@ -1263,24 +1261,24 @@ protected:
// Set current indoor temp // Set current indoor temp
if (this->setRoomTemp(convertedTemp)) { if (this->setRoomTemp(convertedTemp)) {
Log.sinfoln( Log.sinfoln(
FPSTR(L_OT_HEATING), F("Set current indoor temp: %.2f (converted: %.2f, response: %.2f)"), L_OT_HEATING, "Set current indoor temp: %.2f (converted: %.2f, response: %.2f)",
indoorTemp, convertedTemp, vars.slave.heating.indoorTemp indoorTemp, convertedTemp, vars.slave.heating.indoorTemp
); );
} else { } else {
Log.swarningln(FPSTR(L_OT_HEATING), F("Failed set current indoor temp")); Log.swarningln(L_OT_HEATING, "Failed set current indoor temp");
} }
// Set current CH2 indoor temp // Set current CH2 indoor temp
if (settings.opentherm.options.heatingToCh2) { if (settings.opentherm.options.heatingToCh2) {
if (this->setRoomTempCh2(convertedTemp)) { if (this->setRoomTempCh2(convertedTemp)) {
Log.sinfoln( Log.sinfoln(
FPSTR(L_OT_HEATING), F("Set current CH2 indoor temp: %.2f (converted: %.2f, response: %.2f)"), L_OT_HEATING, "Set current CH2 indoor temp: %.2f (converted: %.2f, response: %.2f)",
indoorTemp, convertedTemp, vars.slave.ch2.indoorTemp indoorTemp, convertedTemp, vars.slave.ch2.indoorTemp
); );
} else { } else {
Log.swarningln(FPSTR(L_OT_HEATING), F("Failed set current CH2 indoor temp")); Log.swarningln(L_OT_HEATING, "Failed set current CH2 indoor temp");
} }
} }
} }
@@ -1303,12 +1301,12 @@ protected:
this->roomSetTempTime = millis(); this->roomSetTempTime = millis();
Log.sinfoln( Log.sinfoln(
FPSTR(L_OT_HEATING), F("Set target indoor temp: %.2f (converted: %.2f, response: %.2f)"), L_OT_HEATING, "Set target indoor temp: %.2f (converted: %.2f, response: %.2f)",
targetTemp, convertedTemp, vars.slave.heating.roomTargetTemp targetTemp, convertedTemp, vars.slave.heating.roomTargetTemp
); );
} else { } else {
Log.swarningln(FPSTR(L_OT_HEATING), F("Failed set target indoor temp")); Log.swarningln(L_OT_HEATING, "Failed set target indoor temp");
} }
} }
@@ -1318,12 +1316,12 @@ protected:
this->roomSetTempCh2Time = millis(); this->roomSetTempCh2Time = millis();
Log.sinfoln( Log.sinfoln(
FPSTR(L_OT_HEATING), F("Set target CH2 indoor temp: %.2f (converted: %.2f, response: %.2f)"), L_OT_HEATING, "Set target CH2 indoor temp: %.2f (converted: %.2f, response: %.2f)",
targetTemp, convertedTemp, vars.slave.ch2.roomTargetTemp targetTemp, convertedTemp, vars.slave.ch2.roomTargetTemp
); );
} else { } else {
Log.swarningln(FPSTR(L_OT_HEATING), F("Failed set target CH2 indoor temp")); Log.swarningln(L_OT_HEATING, "Failed set target CH2 indoor temp");
} }
} }
} }
@@ -1347,13 +1345,13 @@ protected:
if (settings.opentherm.options.maxTempSyncWithTargetTemp) { if (settings.opentherm.options.maxTempSyncWithTargetTemp) {
if (this->setMaxHeatingTemp(convertedTemp)) { if (this->setMaxHeatingTemp(convertedTemp)) {
Log.sinfoln( Log.sinfoln(
FPSTR(L_OT_HEATING), F("Set max heating temp: %.2f (converted: %.2f)"), L_OT_HEATING, "Set max heating temp: %.2f (converted: %.2f)",
targetTemp, convertedTemp targetTemp, convertedTemp
); );
} else { } else {
Log.swarningln( Log.swarningln(
FPSTR(L_OT_HEATING), F("Failed set max heating temp: %.2f (converted: %.2f)"), L_OT_HEATING, "Failed set max heating temp: %.2f (converted: %.2f)",
targetTemp, convertedTemp targetTemp, convertedTemp
); );
} }
@@ -1364,12 +1362,12 @@ protected:
this->heatingSetTempTime = millis(); this->heatingSetTempTime = millis();
Log.sinfoln( Log.sinfoln(
FPSTR(L_OT_HEATING), F("Set target temp: %.2f (converted: %.2f, response: %.2f)"), L_OT_HEATING, "Set target temp: %.2f (converted: %.2f, response: %.2f)",
targetTemp, convertedTemp, vars.slave.heating.targetTemp targetTemp, convertedTemp, vars.slave.heating.targetTemp
); );
} else { } else {
Log.swarningln(FPSTR(L_OT_HEATING), F("Failed set target temp")); Log.swarningln(L_OT_HEATING, "Failed set target temp");
} }
} }
} }
@@ -1390,12 +1388,12 @@ protected:
this->ch2SetTempTime = millis(); this->ch2SetTempTime = millis();
Log.sinfoln( Log.sinfoln(
FPSTR(L_OT_CH2), F("Set temp: %.2f (converted: %.2f, response: %.2f)"), L_OT_CH2, "Set temp: %.2f (converted: %.2f, response: %.2f)",
targetTemp, convertedTemp, vars.slave.ch2.targetTemp targetTemp, convertedTemp, vars.slave.ch2.targetTemp
); );
} else { } else {
Log.swarningln(FPSTR(L_OT_CH2), F("Failed set temp")); Log.swarningln(L_OT_CH2, "Failed set temp");
} }
} }
} }
@@ -1418,7 +1416,7 @@ protected:
vars.master.heating.overheat = false; vars.master.heating.overheat = false;
Log.sinfoln( Log.sinfoln(
FPSTR(L_OT_HEATING), F("Overheating not detected. Current high temp: %.2f, threshold (low): %hhu"), L_OT_HEATING, "Overheating not detected. Current high temp: %.2f, threshold (low): %hhu",
highTemp, settings.heating.overheatProtection.lowTemp highTemp, settings.heating.overheatProtection.lowTemp
); );
} }
@@ -1428,7 +1426,7 @@ protected:
vars.master.heating.overheat = true; vars.master.heating.overheat = true;
Log.swarningln( Log.swarningln(
FPSTR(L_OT_HEATING), F("Overheating detected! Current high temp: %.2f, threshold (high): %hhu"), L_OT_HEATING, "Overheating detected! Current high temp: %.2f, threshold (high): %hhu",
highTemp, settings.heating.overheatProtection.highTemp highTemp, settings.heating.overheatProtection.highTemp
); );
} }
@@ -1458,7 +1456,7 @@ protected:
vars.master.dhw.overheat = false; vars.master.dhw.overheat = false;
Log.sinfoln( Log.sinfoln(
FPSTR(L_OT_DHW), F("Overheating not detected. Current high temp: %.2f, threshold (low): %hhu"), L_OT_DHW, "Overheating not detected. Current high temp: %.2f, threshold (low): %hhu",
highTemp, settings.dhw.overheatProtection.lowTemp highTemp, settings.dhw.overheatProtection.lowTemp
); );
} }
@@ -1468,7 +1466,7 @@ protected:
vars.master.dhw.overheat = true; vars.master.dhw.overheat = true;
Log.swarningln( Log.swarningln(
FPSTR(L_OT_DHW), F("Overheating detected! Current high temp: %.2f, threshold (high): %hhu"), L_OT_DHW, "Overheating detected! Current high temp: %.2f, threshold (high): %hhu",
highTemp, settings.dhw.overheatProtection.highTemp highTemp, settings.dhw.overheatProtection.highTemp
); );
} }
@@ -1483,69 +1481,69 @@ protected:
// Not all boilers support these, only try once when the boiler becomes connected // Not all boilers support these, only try once when the boiler becomes connected
if (this->updateSlaveVersion()) { if (this->updateSlaveVersion()) {
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT), F("Received slave app version: %u, type: %u"), L_OT, "Received slave app version: %u, type: %u",
vars.slave.appVersion, vars.slave.type vars.slave.appVersion, vars.slave.type
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive slave version")); Log.swarningln(L_OT, "Failed receive slave version");
} }
if (this->setMasterVersion(vars.master.appVersion, vars.master.type)) { if (this->setMasterVersion(vars.master.appVersion, vars.master.type)) {
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT), F("Set master version: %u, type: %u"), L_OT, "Set master version: %u, type: %u",
vars.master.appVersion, vars.master.type vars.master.appVersion, vars.master.type
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed set master version")); Log.swarningln(L_OT, "Failed set master version");
} }
if (this->updateSlaveOtVersion()) { if (this->updateSlaveOtVersion()) {
Log.snoticeln(FPSTR(L_OT), F("Received slave OT version: %f"), vars.slave.protocolVersion); Log.snoticeln(L_OT, "Received slave OT version: %f", vars.slave.protocolVersion);
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive slave OT version")); Log.swarningln(L_OT, "Failed receive slave OT version");
} }
if (this->setMasterOtVersion(vars.master.protocolVersion)) { if (this->setMasterOtVersion(vars.master.protocolVersion)) {
Log.snoticeln(FPSTR(L_OT), F("Set master OT version: %f"), vars.master.protocolVersion); Log.snoticeln(L_OT, "Set master OT version: %f", vars.master.protocolVersion);
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed set master OT version")); Log.swarningln(L_OT, "Failed set master OT version");
} }
if (this->updateSlaveConfig()) { if (this->updateSlaveConfig()) {
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT), F("Received slave member id: %u, flags: %u"), L_OT, "Received slave member id: %u, flags: %u",
vars.slave.memberId, vars.slave.flags vars.slave.memberId, vars.slave.flags
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive slave config")); Log.swarningln(L_OT, "Failed receive slave config");
} }
if (this->setMasterConfig(vars.master.memberId, vars.master.flags)) { if (this->setMasterConfig(vars.master.memberId, vars.master.flags)) {
Log.snoticeln( Log.snoticeln(
FPSTR(L_OT), F("Set master member id: %u, flags: %u"), L_OT, "Set master member id: %u, flags: %u",
vars.master.memberId, vars.master.flags vars.master.memberId, vars.master.flags
); );
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed set master config")); Log.swarningln(L_OT, "Failed set master config");
} }
/*char buf[100]; /*char buf[100];
if (this->instance->getStr(OpenThermMessageID::Brand, buf, sizeof(buf) - 1)) { if (this->instance->getStr(OpenThermMessageID::Brand, buf, sizeof(buf) - 1)) {
Log.snoticeln(FPSTR(L_OT), F("Slave brand: %s"), buf); Log.snoticeln(L_OT, "Slave brand: %s", buf);
} }
if (this->instance->getStr(OpenThermMessageID::BrandVersion, buf, sizeof(buf) - 1)) { if (this->instance->getStr(OpenThermMessageID::BrandVersion, buf, sizeof(buf) - 1)) {
Log.snoticeln(FPSTR(L_OT), F("Slave brand version: %s"), buf); Log.snoticeln(L_OT, "Slave brand version: %s", buf);
} }
if (this->instance->getStr(OpenThermMessageID::BrandSerialNumber, buf, sizeof(buf) - 1)) { if (this->instance->getStr(OpenThermMessageID::BrandSerialNumber, buf, sizeof(buf) - 1)) {
Log.snoticeln(FPSTR(L_OT), F("Slave brand s/n: %s"), buf); Log.snoticeln(L_OT, "Slave brand s/n: %s", buf);
}*/ }*/
} }
@@ -1624,7 +1622,7 @@ protected:
/*uint8_t flags = (response & 0xFFFF) >> 8; /*uint8_t flags = (response & 0xFFFF) >> 8;
Log.straceln( Log.straceln(
"OT", "OT",
F("MasterMemberIdCode:\r\n DHW present: %u\r\n Control type: %u\r\n Cooling configuration: %u\r\n DHW configuration: %u\r\n Pump control: %u\r\n CH2 present: %u\r\n Remote water filling function: %u\r\n Heat/cool mode control: %u\r\n Slave MemberID Code: %u\r\n Raw: %u"), "MasterMemberIdCode:\r\n DHW present: %u\r\n Control type: %u\r\n Cooling configuration: %u\r\n DHW configuration: %u\r\n Pump control: %u\r\n CH2 present: %u\r\n Remote water filling function: %u\r\n Heat/cool mode control: %u\r\n Slave MemberID Code: %u\r\n Raw: %u",
(bool) (flags & 0x01), (bool) (flags & 0x01),
(bool) (flags & 0x02), (bool) (flags & 0x02),
(bool) (flags & 0x04), (bool) (flags & 0x04),
+105 -107
View File
@@ -46,7 +46,6 @@ protected:
unsigned long webServerChangeState = 0; unsigned long webServerChangeState = 0;
bool mDnsState = false; bool mDnsState = false;
#if defined(ARDUINO_ARCH_ESP32)
const char* getTaskName() override { const char* getTaskName() override {
return "Portal"; return "Portal";
} }
@@ -58,7 +57,6 @@ protected:
int getTaskPriority() override { int getTaskPriority() override {
return 1; return 1;
} }
#endif
void setup() { void setup() {
this->dnsServer->setTTL(0); this->dnsServer->setTTL(0);
@@ -176,16 +174,16 @@ protected:
auto& doc = response->getRoot(); auto& doc = response->getRoot();
// add network settings // add network settings
auto networkDoc = doc[FPSTR(S_NETWORK)].to<JsonObject>(); auto networkDoc = doc[S_NETWORK].to<JsonObject>();
networkSettingsToJson(networkSettings, networkDoc); networkSettingsToJson(networkSettings, networkDoc);
// add main settings // add main settings
auto settingsDoc = doc[FPSTR(S_SETTINGS)].to<JsonObject>(); auto settingsDoc = doc[S_SETTINGS].to<JsonObject>();
settingsToJson(settings, settingsDoc); settingsToJson(settings, settingsDoc);
// add sensors settings // add sensors settings
for (uint8_t sensorId = 0; sensorId <= Sensors::getMaxSensorId(); sensorId++) { for (uint8_t sensorId = 0; sensorId <= Sensors::getMaxSensorId(); sensorId++) {
auto sensorsettingsDoc = doc[FPSTR(S_SENSORS)][sensorId].to<JsonObject>(); auto sensorsettingsDoc = doc[S_SENSORS][sensorId].to<JsonObject>();
sensorSettingsToJson(sensorId, Sensors::settings[sensorId], sensorsettingsDoc); sensorSettingsToJson(sensorId, Sensors::settings[sensorId], sensorsettingsDoc);
} }
@@ -193,10 +191,10 @@ protected:
getFilename(filename, sizeof(filename), "backup"); getFilename(filename, sizeof(filename), "backup");
char contentDispositionValue[128]; char contentDispositionValue[128];
snprintf_P( snprintf(
contentDispositionValue, contentDispositionValue,
sizeof(contentDispositionValue), sizeof(contentDispositionValue),
PSTR("attachment; filename=\"%s\""), "attachment; filename=\"%s\"",
filename filename
); );
@@ -220,7 +218,7 @@ protected:
bool changed = false; bool changed = false;
// restore network settings // restore network settings
if (!requestDoc[FPSTR(S_NETWORK)].isNull() && jsonToNetworkSettings(requestDoc[FPSTR(S_NETWORK)], networkSettings)) { if (!requestDoc[S_NETWORK].isNull() && jsonToNetworkSettings(requestDoc[S_NETWORK], networkSettings)) {
fsNetworkSettings.update(); fsNetworkSettings.update();
network->setHostname(networkSettings.hostname) network->setHostname(networkSettings.hostname)
->setStaCredentials(networkSettings.sta.ssid, networkSettings.sta.password, networkSettings.sta.channel) ->setStaCredentials(networkSettings.sta.ssid, networkSettings.sta.password, networkSettings.sta.channel)
@@ -236,14 +234,14 @@ protected:
} }
// restore main settings // restore main settings
if (!requestDoc[FPSTR(S_SETTINGS)].isNull() && jsonToSettings(requestDoc[FPSTR(S_SETTINGS)], settings)) { if (!requestDoc[S_SETTINGS].isNull() && jsonToSettings(requestDoc[S_SETTINGS], settings)) {
fsSettings.update(); fsSettings.update();
changed = true; changed = true;
} }
// restore sensors settings // restore sensors settings
if (!requestDoc[FPSTR(S_SENSORS)].isNull()) { if (!requestDoc[S_SENSORS].isNull()) {
for (auto sensor : requestDoc[FPSTR(S_SENSORS)].as<JsonObject>()) { for (auto sensor : requestDoc[S_SENSORS].as<JsonObject>()) {
uint8_t sensorId; uint8_t sensorId;
if (!Sensors::parseId(sensor.key().c_str(), sensorId)) { if (!Sensors::parseId(sensor.key().c_str(), sensorId)) {
continue; continue;
@@ -338,12 +336,12 @@ protected:
auto *response = new AsyncJsonResponse(true); auto *response = new AsyncJsonResponse(true);
auto& doc = response->getRoot(); auto& doc = response->getRoot();
for (short int i = 0; i < apCount; i++) { for (short int i = 0; i < apCount; i++) {
doc[i][FPSTR(S_SSID)] = WiFi.SSID(i); doc[i][S_SSID] = WiFi.SSID(i);
doc[i][FPSTR(S_BSSID)] = WiFi.BSSIDstr(i); doc[i][S_BSSID] = WiFi.BSSIDstr(i);
doc[i][FPSTR(S_SIGNAL_QUALITY)] = NetworkMgr::rssiToSignalQuality(WiFi.RSSI(i)); doc[i][S_SIGNAL_QUALITY] = NetworkMgr::rssiToSignalQuality(WiFi.RSSI(i));
doc[i][FPSTR(S_CHANNEL)] = WiFi.channel(i); doc[i][S_CHANNEL] = WiFi.channel(i);
doc[i][FPSTR(S_HIDDEN)] = !WiFi.SSID(i).length(); doc[i][S_HIDDEN] = !WiFi.SSID(i).length();
doc[i][FPSTR(S_AUTH)] = WiFi.encryptionType(i); doc[i][S_AUTH] = WiFi.encryptionType(i);
} }
// send response // send response
@@ -411,9 +409,9 @@ protected:
for (uint8_t sensorId = 0; sensorId <= Sensors::getMaxSensorId(); sensorId++) { for (uint8_t sensorId = 0; sensorId <= Sensors::getMaxSensorId(); sensorId++) {
if (detailed) { if (detailed) {
auto& sSensor = Sensors::settings[sensorId]; auto& sSensor = Sensors::settings[sensorId];
responseDoc[sensorId][FPSTR(S_ENABLED)] = sSensor.enabled; responseDoc[sensorId][S_ENABLED] = sSensor.enabled;
responseDoc[sensorId][FPSTR(S_NAME)] = sSensor.name; responseDoc[sensorId][S_NAME] = sSensor.name;
responseDoc[sensorId][FPSTR(S_PURPOSE)] = static_cast<uint8_t>(sSensor.purpose); responseDoc[sensorId][S_PURPOSE] = static_cast<uint8_t>(sSensor.purpose);
sensorResultToJson(sensorId, responseDoc[sensorId]); sensorResultToJson(sensorId, responseDoc[sensorId]);
} else { } else {
@@ -538,53 +536,53 @@ protected:
auto *response = new AsyncJsonResponse(); auto *response = new AsyncJsonResponse();
auto& doc = response->getRoot(); auto& doc = response->getRoot();
auto docSystem = doc[FPSTR(S_SYSTEM)].to<JsonObject>(); auto docSystem = doc[S_SYSTEM].to<JsonObject>();
docSystem[FPSTR(S_RESET_REASON)] = getResetReason(); docSystem[S_RESET_REASON] = getResetReason();
docSystem[FPSTR(S_UPTIME)] = millis() / 1000; docSystem[S_UPTIME] = millis() / 1000;
bool isConnected = network->isConnected(); bool isConnected = network->isConnected();
auto docNetwork = doc[FPSTR(S_NETWORK)].to<JsonObject>(); auto docNetwork = doc[S_NETWORK].to<JsonObject>();
docNetwork[FPSTR(S_HOSTNAME)] = networkSettings.hostname; docNetwork[S_HOSTNAME] = networkSettings.hostname;
docNetwork[FPSTR(S_MAC)] = network->getStaMac(); docNetwork[S_MAC] = network->getStaMac();
docNetwork[FPSTR(S_CONNECTED)] = isConnected; docNetwork[S_CONNECTED] = isConnected;
docNetwork[FPSTR(S_SSID)] = network->getStaSsid(); docNetwork[S_SSID] = network->getStaSsid();
docNetwork[FPSTR(S_SIGNAL_QUALITY)] = isConnected ? NetworkMgr::rssiToSignalQuality(network->getRssi()) : 0; docNetwork[S_SIGNAL_QUALITY] = isConnected ? NetworkMgr::rssiToSignalQuality(network->getRssi()) : 0;
docNetwork[FPSTR(S_CHANNEL)] = isConnected ? network->getStaChannel() : 0; docNetwork[S_CHANNEL] = isConnected ? network->getStaChannel() : 0;
docNetwork[FPSTR(S_IP)] = isConnected ? network->getStaIp().toString() : ""; docNetwork[S_IP] = isConnected ? network->getStaIp().toString() : "";
docNetwork[FPSTR(S_SUBNET)] = isConnected ? network->getStaSubnet().toString() : ""; docNetwork[S_SUBNET] = isConnected ? network->getStaSubnet().toString() : "";
docNetwork[FPSTR(S_GATEWAY)] = isConnected ? network->getStaGateway().toString() : ""; docNetwork[S_GATEWAY] = isConnected ? network->getStaGateway().toString() : "";
docNetwork[FPSTR(S_DNS)] = isConnected ? network->getStaDns().toString() : ""; docNetwork[S_DNS] = isConnected ? network->getStaDns().toString() : "";
auto docBuild = doc[FPSTR(S_BUILD)].to<JsonObject>(); auto docBuild = doc[S_BUILD].to<JsonObject>();
docBuild[FPSTR(S_VERSION)] = BUILD_VERSION; docBuild[S_VERSION] = BUILD_VERSION;
docBuild[FPSTR(S_COMMIT)] = BUILD_COMMIT; docBuild[S_COMMIT] = BUILD_COMMIT;
docBuild[FPSTR(S_DATE)] = __DATE__ " " __TIME__; docBuild[S_DATE] = __DATE__ " " __TIME__;
docBuild[FPSTR(S_ENV)] = BUILD_ENV; docBuild[S_ENV] = BUILD_ENV;
docBuild[FPSTR(S_CORE)] = ESP.getCoreVersion(); docBuild[S_CORE] = ESP.getCoreVersion();
docBuild[FPSTR(S_SDK)] = ESP.getSdkVersion(); docBuild[S_SDK] = ESP.getSdkVersion();
auto docHeap = doc[FPSTR(S_HEAP)].to<JsonObject>(); auto docHeap = doc[S_HEAP].to<JsonObject>();
docHeap[FPSTR(S_TOTAL)] = getTotalHeap(); docHeap[S_TOTAL] = getTotalHeap();
docHeap[FPSTR(S_FREE)] = getFreeHeap(); docHeap[S_FREE] = getFreeHeap();
docHeap[FPSTR(S_MIN_FREE)] = getFreeHeap(true); docHeap[S_MIN_FREE] = getFreeHeap(true);
docHeap[FPSTR(S_MAX_FREE_BLOCK)] = getMaxFreeBlockHeap(); docHeap[S_MAX_FREE_BLOCK] = getMaxFreeBlockHeap();
docHeap[FPSTR(S_MIN_MAX_FREE_BLOCK)] = getMaxFreeBlockHeap(true); docHeap[S_MIN_MAX_FREE_BLOCK] = getMaxFreeBlockHeap(true);
auto docPsram = doc[FPSTR(S_PSRAM)].to<JsonObject>(); auto docPsram = doc[S_PSRAM].to<JsonObject>();
docPsram[FPSTR(S_TOTAL)] = ESP.getPsramSize(); docPsram[S_TOTAL] = ESP.getPsramSize();
docPsram[FPSTR(S_FREE)] = ESP.getFreePsram(); docPsram[S_FREE] = ESP.getFreePsram();
docPsram[FPSTR(S_MIN_FREE)] = ESP.getMinFreePsram(); docPsram[S_MIN_FREE] = ESP.getMinFreePsram();
docPsram[FPSTR(S_MAX_FREE_BLOCK)] = ESP.getMaxAllocPsram(); docPsram[S_MAX_FREE_BLOCK] = ESP.getMaxAllocPsram();
auto docChip = doc[FPSTR(S_CHIP)].to<JsonObject>(); auto docChip = doc[S_CHIP].to<JsonObject>();
docChip[FPSTR(S_MODEL)] = ESP.getChipModel(); docChip[S_MODEL] = ESP.getChipModel();
docChip[FPSTR(S_REV)] = ESP.getChipRevision(); docChip[S_REV] = ESP.getChipRevision();
docChip[FPSTR(S_CORES)] = ESP.getChipCores(); docChip[S_CORES] = ESP.getChipCores();
docChip[FPSTR(S_FREQ)] = ESP.getCpuFreqMHz(); docChip[S_FREQ] = ESP.getCpuFreqMHz();
auto docFlash = doc[FPSTR(S_FLASH)].to<JsonObject>(); auto docFlash = doc[S_FLASH].to<JsonObject>();
docFlash[FPSTR(S_SIZE)] = ESP.getFlashChipSize(); docFlash[S_SIZE] = ESP.getFlashChipSize();
docFlash[FPSTR(S_REAL_SIZE)] = docFlash[FPSTR(S_SIZE)]; docFlash[S_REAL_SIZE] = docFlash[S_SIZE];
// send response // send response
response->setLength(); response->setLength();
@@ -596,60 +594,60 @@ protected:
auto *response = new AsyncJsonResponse(); auto *response = new AsyncJsonResponse();
auto& doc = response->getRoot(); auto& doc = response->getRoot();
auto docBuild = doc[FPSTR(S_BUILD)].to<JsonObject>(); auto docBuild = doc[S_BUILD].to<JsonObject>();
docBuild[FPSTR(S_VERSION)] = BUILD_VERSION; docBuild[S_VERSION] = BUILD_VERSION;
docBuild[FPSTR(S_COMMIT)] = BUILD_COMMIT; docBuild[S_COMMIT] = BUILD_COMMIT;
docBuild[FPSTR(S_DATE)] = __DATE__ " " __TIME__; docBuild[S_DATE] = __DATE__ " " __TIME__;
docBuild[FPSTR(S_ENV)] = BUILD_ENV; docBuild[S_ENV] = BUILD_ENV;
docBuild[FPSTR(S_CORE)] = ESP.getCoreVersion(); docBuild[S_CORE] = ESP.getCoreVersion();
docBuild[FPSTR(S_SDK)] = ESP.getSdkVersion(); docBuild[S_SDK] = ESP.getSdkVersion();
auto docHeap = doc[FPSTR(S_HEAP)].to<JsonObject>(); auto docHeap = doc[S_HEAP].to<JsonObject>();
docHeap[FPSTR(S_TOTAL)] = getTotalHeap(); docHeap[S_TOTAL] = getTotalHeap();
docHeap[FPSTR(S_FREE)] = getFreeHeap(); docHeap[S_FREE] = getFreeHeap();
docHeap[FPSTR(S_MIN_FREE)] = getFreeHeap(true); docHeap[S_MIN_FREE] = getFreeHeap(true);
docHeap[FPSTR(S_MAX_FREE_BLOCK)] = getMaxFreeBlockHeap(); docHeap[S_MAX_FREE_BLOCK] = getMaxFreeBlockHeap();
docHeap[FPSTR(S_MIN_MAX_FREE_BLOCK)] = getMaxFreeBlockHeap(true); docHeap[S_MIN_MAX_FREE_BLOCK] = getMaxFreeBlockHeap(true);
auto docChip = doc[FPSTR(S_CHIP)].to<JsonObject>(); auto docChip = doc[S_CHIP].to<JsonObject>();
docChip[FPSTR(S_MODEL)] = ESP.getChipModel(); docChip[S_MODEL] = ESP.getChipModel();
docChip[FPSTR(S_REV)] = ESP.getChipRevision(); docChip[S_REV] = ESP.getChipRevision();
docChip[FPSTR(S_CORES)] = ESP.getChipCores(); docChip[S_CORES] = ESP.getChipCores();
docChip[FPSTR(S_FREQ)] = ESP.getCpuFreqMHz(); docChip[S_FREQ] = ESP.getCpuFreqMHz();
auto docFlash = doc[FPSTR(S_FLASH)].to<JsonObject>(); auto docFlash = doc[S_FLASH].to<JsonObject>();
docFlash[FPSTR(S_SIZE)] = ESP.getFlashChipSize(); docFlash[S_SIZE] = ESP.getFlashChipSize();
docFlash[FPSTR(S_REAL_SIZE)] = docFlash[FPSTR(S_SIZE)]; docFlash[S_REAL_SIZE] = docFlash[S_SIZE];
auto reason = esp_reset_reason(); auto reason = esp_reset_reason();
if (reason != ESP_RST_UNKNOWN && reason != ESP_RST_POWERON && reason != ESP_RST_SW) { if (reason != ESP_RST_UNKNOWN && reason != ESP_RST_POWERON && reason != ESP_RST_SW) {
auto docCrash = doc[FPSTR(S_CRASH)].to<JsonObject>(); auto docCrash = doc[S_CRASH].to<JsonObject>();
docCrash[FPSTR(S_REASON)] = getResetReason(); docCrash[S_REASON] = getResetReason();
docCrash[FPSTR(S_CORE)] = CrashRecorder::ext.core; docCrash[S_CORE] = CrashRecorder::ext.core;
docCrash[FPSTR(S_HEAP)] = CrashRecorder::ext.heap; docCrash[S_HEAP] = CrashRecorder::ext.heap;
docCrash[FPSTR(S_UPTIME)] = CrashRecorder::ext.uptime; docCrash[S_UPTIME] = CrashRecorder::ext.uptime;
if (CrashRecorder::backtrace.length > 0 && CrashRecorder::backtrace.length <= CrashRecorder::backtraceMaxLength) { if (CrashRecorder::backtrace.length > 0 && CrashRecorder::backtrace.length <= CrashRecorder::backtraceMaxLength) {
String backtraceStr; String backtraceStr;
arr2str(backtraceStr, CrashRecorder::backtrace.data, CrashRecorder::backtrace.length); arr2str(backtraceStr, CrashRecorder::backtrace.data, CrashRecorder::backtrace.length);
docCrash[FPSTR(S_BACKTRACE)][FPSTR(S_DATA)] = backtraceStr; docCrash[S_BACKTRACE][S_DATA] = backtraceStr;
docCrash[FPSTR(S_BACKTRACE)][FPSTR(S_CONTINUES)] = CrashRecorder::backtrace.continues; docCrash[S_BACKTRACE][S_CONTINUES] = CrashRecorder::backtrace.continues;
} }
if (CrashRecorder::epc.length > 0 && CrashRecorder::epc.length <= CrashRecorder::epcMaxLength) { if (CrashRecorder::epc.length > 0 && CrashRecorder::epc.length <= CrashRecorder::epcMaxLength) {
String epcStr; String epcStr;
arr2str(epcStr, CrashRecorder::epc.data, CrashRecorder::epc.length); arr2str(epcStr, CrashRecorder::epc.data, CrashRecorder::epc.length);
docCrash[FPSTR(S_EPC)] = epcStr; docCrash[S_EPC] = epcStr;
} }
} }
char filename[64]; char filename[64];
getFilename(filename, sizeof(filename), "debug"); getFilename(filename, sizeof(filename), "debug");
char contentDispositionValue[128]; char contentDispositionValue[128];
snprintf_P( snprintf(
contentDispositionValue, contentDispositionValue,
sizeof(contentDispositionValue), sizeof(contentDispositionValue),
PSTR("attachment; filename=\"%s\""), "attachment; filename=\"%s\"",
filename filename
); );
@@ -663,7 +661,7 @@ protected:
// not found // not found
this->webServer->onNotFound([this](AsyncWebServerRequest *request) { this->webServer->onNotFound([this](AsyncWebServerRequest *request) {
const auto& url = request->url(); const auto& url = request->url();
Log.straceln(FPSTR(L_PORTAL_WEBSERVER), F("Page not found, uri: %s"), url.c_str()); Log.straceln(L_PORTAL_WEBSERVER, "Page not found, uri: %s", url.c_str());
if (url.equals("/")) { if (url.equals("/")) {
request->send(200, "text/plain", "The file system is not flashed!"); request->send(200, "text/plain", "The file system is not flashed!");
@@ -685,7 +683,7 @@ protected:
// web server // web server
if (!this->stateWebServer() && (network->isApEnabled() || network->isConnected()) && millis() - this->webServerChangeState >= this->changeStateInterval) { if (!this->stateWebServer() && (network->isApEnabled() || network->isConnected()) && millis() - this->webServerChangeState >= this->changeStateInterval) {
this->startWebServer(); this->startWebServer();
Log.straceln(FPSTR(L_PORTAL_WEBSERVER), F("Started: AP up or STA connected")); Log.straceln(L_PORTAL_WEBSERVER, "Started: AP up or STA connected");
// Enabling mDNS // Enabling mDNS
if (!this->mDnsState && settings.portal.mdns) { if (!this->mDnsState && settings.portal.mdns) {
@@ -693,20 +691,20 @@ protected:
MDNS.addService("http", "tcp", 80); MDNS.addService("http", "tcp", 80);
this->mDnsState = true; this->mDnsState = true;
Log.straceln(FPSTR(L_PORTAL_WEBSERVER), F("mDNS enabled and service added")); Log.straceln(L_PORTAL_WEBSERVER, "mDNS enabled and service added");
} }
} }
} else if (this->stateWebServer() && !network->isApEnabled() && !network->isStaEnabled()) { } else if (this->stateWebServer() && !network->isApEnabled() && !network->isStaEnabled()) {
this->stopWebServer(); this->stopWebServer();
Log.straceln(FPSTR(L_PORTAL_WEBSERVER), F("Stopped: AP and STA down")); Log.straceln(L_PORTAL_WEBSERVER, "Stopped: AP and STA down");
// Disabling mDNS // Disabling mDNS
if (this->mDnsState) { if (this->mDnsState) {
MDNS.end(); MDNS.end();
this->mDnsState = false; this->mDnsState = false;
Log.straceln(FPSTR(L_PORTAL_WEBSERVER), F("mDNS disabled")); Log.straceln(L_PORTAL_WEBSERVER, "mDNS disabled");
} }
} }
@@ -715,17 +713,17 @@ protected:
MDNS.end(); MDNS.end();
this->mDnsState = false; this->mDnsState = false;
Log.straceln(FPSTR(L_PORTAL_WEBSERVER), F("mDNS disabled")); Log.straceln(L_PORTAL_WEBSERVER, "mDNS disabled");
} }
// dns server // dns server
if (!this->stateDnsServer() && !network->isConnected() && network->isApEnabled() && this->stateWebServer()) { if (!this->stateDnsServer() && !network->isConnected() && network->isApEnabled() && this->stateWebServer()) {
this->startDnsServer(); this->startDnsServer();
Log.straceln(FPSTR(L_PORTAL_DNSSERVER), F("Started: AP up")); Log.straceln(L_PORTAL_DNSSERVER, "Started: AP up");
} else if (this->stateDnsServer() && (network->isConnected() || !network->isApEnabled() || !this->stateWebServer())) { } else if (this->stateDnsServer() && (network->isConnected() || !network->isApEnabled() || !this->stateWebServer())) {
this->stopDnsServer(); this->stopDnsServer();
Log.straceln(FPSTR(L_PORTAL_DNSSERVER), F("Stopped: AP down/STA connected")); Log.straceln(L_PORTAL_DNSSERVER, "Stopped: AP down/STA connected");
} }
if (this->stateDnsServer()) { if (this->stateDnsServer()) {
@@ -743,17 +741,17 @@ protected:
if (url.equals("/connecttest.txt")) { if (url.equals("/connecttest.txt")) {
request->redirect("http://logout.net", 302); request->redirect("http://logout.net", 302);
Log.straceln(FPSTR(L_PORTAL_CAPTIVE), F("Redirect to http://logout.net with 302 code")); Log.straceln(L_PORTAL_CAPTIVE, "Redirect to http://logout.net with 302 code");
} else if (url.equals(F("/wpad.dat"))) { } else if (url.equals("/wpad.dat")) {
request->send(404); request->send(404);
Log.straceln(FPSTR(L_PORTAL_CAPTIVE), F("Send empty page with 404 code")); Log.straceln(L_PORTAL_CAPTIVE, "Send empty page with 404 code");
} else if (url.equals(F("/success.txt"))) { } else if (url.equals("/success.txt")) {
request->send(200); request->send(200);
Log.straceln(FPSTR(L_PORTAL_CAPTIVE), F("Send empty page with 200 code")); Log.straceln(L_PORTAL_CAPTIVE, "Send empty page with 200 code");
} else { } else {
String portalUrl = "http://"; String portalUrl = "http://";
@@ -762,7 +760,7 @@ protected:
request->redirect(portalUrl, 302); request->redirect(portalUrl, 302);
Log.straceln(FPSTR(L_PORTAL_CAPTIVE), F("Redirect to portal page with 302 code")); Log.straceln(L_PORTAL_CAPTIVE, "Redirect to portal page with 302 code");
} }
} }
@@ -824,8 +822,8 @@ protected:
localtime_r(&now, &localNow); localtime_r(&now, &localNow);
char localNowValue[20]; char localNowValue[20];
strftime(localNowValue, sizeof(localNowValue), PSTR("%Y-%m-%d-%H-%M-%S"), &localNow); strftime(localNowValue, sizeof(localNowValue), "%Y-%m-%d-%H-%M-%S", &localNow);
snprintf_P(filename, maxSizeFilename, PSTR("%s_%s_%s.json"), networkSettings.hostname, localNowValue, type); snprintf(filename, maxSizeFilename, "%s_%s_%s.json", networkSettings.hostname, localNowValue, type);
} }
}; };
+8 -10
View File
@@ -15,7 +15,6 @@ protected:
bool indoorSensorsConnected = false; bool indoorSensorsConnected = false;
//bool outdoorSensorsConnected = false; //bool outdoorSensorsConnected = false;
#if defined(ARDUINO_ARCH_ESP32)
const char* getTaskName() override { const char* getTaskName() override {
return "Regulator"; return "Regulator";
} }
@@ -31,7 +30,6 @@ protected:
int getTaskPriority() override { int getTaskPriority() override {
return 4; return 4;
} }
#endif
void loop() { void loop() {
if (vars.states.restarting || vars.states.upgrading) { if (vars.states.restarting || vars.states.upgrading) {
@@ -55,7 +53,7 @@ protected:
if (!settings.pid.enabled && fabsf(pidRegulator.integral) > 0.01f) { if (!settings.pid.enabled && fabsf(pidRegulator.integral) > 0.01f) {
pidRegulator.integral = 0.0f; pidRegulator.integral = 0.0f;
Log.sinfoln(FPSTR(L_REGULATOR_PID), F("Integral sum has been reset")); Log.sinfoln(L_REGULATOR_PID, "Integral sum has been reset");
} }
this->turbo(); this->turbo();
@@ -87,7 +85,7 @@ protected:
} }
if (!settings.heating.turbo) { if (!settings.heating.turbo) {
Log.sinfoln(FPSTR(L_REGULATOR), F("Turbo mode auto disabled")); Log.sinfoln(L_REGULATOR, "Turbo mode auto disabled");
} }
} }
} }
@@ -128,11 +126,11 @@ protected:
if (fabsf(prevHeatingTarget - settings.heating.target) > 0.0001f) { if (fabsf(prevHeatingTarget - settings.heating.target) > 0.0001f) {
prevHeatingTarget = settings.heating.target; prevHeatingTarget = settings.heating.target;
Log.sinfoln(FPSTR(L_REGULATOR), F("New target: %.2f"), settings.heating.target); Log.sinfoln(L_REGULATOR, "New target: %.2f", settings.heating.target);
/*if (settings.pid.enabled) { /*if (settings.pid.enabled) {
pidRegulator.integral = 0.0f; pidRegulator.integral = 0.0f;
Log.sinfoln(FPSTR(L_REGULATOR_PID), F("Integral sum has been reset")); Log.sinfoln(L_REGULATOR_PID, "Integral sum has been reset");
}*/ }*/
} }
@@ -179,7 +177,7 @@ protected:
prevEtResult = etResult; prevEtResult = etResult;
newTemp += etResult; newTemp += etResult;
Log.sinfoln(FPSTR(L_REGULATOR_EQUITHERM), F("New result: %.2f"), etResult); Log.sinfoln(L_REGULATOR_EQUITHERM, "New result: %.2f", etResult);
} else { } else {
newTemp += prevEtResult; newTemp += prevEtResult;
@@ -204,7 +202,7 @@ protected:
pidRegulator.integral = 0.0f; pidRegulator.integral = 0.0f;
pidRegulator.getResultNow(); pidRegulator.getResultNow();
Log.sinfoln(FPSTR(L_REGULATOR_PID), F("Integral sum has been reset")); Log.sinfoln(L_REGULATOR_PID, "Integral sum has been reset");
}*/ }*/
float error = pidRegulator.setpoint - pidRegulator.input; float error = pidRegulator.setpoint - pidRegulator.input;
@@ -223,8 +221,8 @@ protected:
prevPidResult = pidResult; prevPidResult = pidResult;
newTemp += pidResult; newTemp += pidResult;
Log.sinfoln(FPSTR(L_REGULATOR_PID), F("New result: %.2f"), pidResult); Log.sinfoln(L_REGULATOR_PID, "New result: %.2f", pidResult);
Log.straceln(FPSTR(L_REGULATOR_PID), F("Integral: %.2f"), pidRegulator.integral); Log.straceln(L_REGULATOR_PID, "Integral: %.2f", pidRegulator.integral);
} else { } else {
newTemp += prevPidResult; newTemp += prevPidResult;
+4 -4
View File
@@ -253,13 +253,13 @@ public:
rSensor.connected = true; rSensor.connected = true;
Log.snoticeln( Log.snoticeln(
FPSTR(L_SENSORS), F("#%hhu '%s' new status: CONNECTED"), L_SENSORS, "#%hhu '%s' new status: CONNECTED",
sensorId, sSensor.name sensorId, sSensor.name
); );
} }
Log.snoticeln( Log.snoticeln(
FPSTR(L_SENSORS), F("#%hhu '%s' new value %hhu: %.2f, compensated: %.2f, raw: %.2f"), L_SENSORS, "#%hhu '%s' new value %hhu: %.2f, compensated: %.2f, raw: %.2f",
sensorId, sSensor.name, valueId, rSensor.values[valueId], compensatedValue, value sensorId, sSensor.name, valueId, rSensor.values[valueId], compensatedValue, value
); );
@@ -316,8 +316,8 @@ public:
if (rSensor.connected != status) { if (rSensor.connected != status) {
Log.snoticeln( Log.snoticeln(
FPSTR(L_SENSORS), F("#%hhu '%s' new status: %s"), L_SENSORS, "#%hhu '%s' new status: %s",
sensorId, sSensor.name, status ? F("CONNECTED") : F("DISCONNECTED") sensorId, sSensor.name, status ? "CONNECTED" : "DISCONNECTED"
); );
rSensor.connected = status; rSensor.connected = status;
+44 -50
View File
@@ -42,14 +42,14 @@ public:
auto deviceRssi = device->getRSSI(); auto deviceRssi = device->getRSSI();
Log.sinfoln( Log.sinfoln(
FPSTR(L_SENSORS_BLE), F("Sensor #%hhu '%s': discovered device %s, name: %s, RSSI: %hhd"), L_SENSORS_BLE, "Sensor #%hhu '%s': discovered device %s, name: %s, RSSI: %hhd",
sensorId, sSensor.name, sensorId, sSensor.name,
deviceAddress.toString().c_str(), deviceName.c_str(), deviceRssi deviceAddress.toString().c_str(), deviceName.c_str(), deviceRssi
); );
if (!device->haveServiceData()) { if (!device->haveServiceData()) {
Log.swarningln( Log.swarningln(
FPSTR(L_SENSORS_BLE), F("Sensor #%hhu '%s': not found service data!"), L_SENSORS_BLE, "Sensor #%hhu '%s': not found service data!",
sensorId, sSensor.name sensorId, sSensor.name
); );
return; return;
@@ -57,7 +57,7 @@ public:
auto serviceDataCount = device->getServiceDataCount(); auto serviceDataCount = device->getServiceDataCount();
Log.straceln( Log.straceln(
FPSTR(L_SENSORS_BLE), F("Sensor #%hhu '%s': found %hhu service data"), L_SENSORS_BLE, "Sensor #%hhu '%s': found %hhu service data",
sensorId, sSensor.name, serviceDataCount sensorId, sSensor.name, serviceDataCount
); );
@@ -67,7 +67,7 @@ public:
} else { } else {
Log.swarningln( Log.swarningln(
FPSTR(L_SENSORS_BLE), F("Sensor #%hhu '%s': unsupported data format!"), L_SENSORS_BLE, "Sensor #%hhu '%s': unsupported data format!",
sensorId, sSensor.name sensorId, sSensor.name
); );
} }
@@ -79,21 +79,21 @@ public:
auto serviceData = device->getServiceData(serviceUuid); auto serviceData = device->getServiceData(serviceUuid);
if (!serviceData.size()) { if (!serviceData.size()) {
Log.straceln( Log.straceln(
FPSTR(L_SENSORS_BLE), F("Sensor #%hhu, service %s: not found ATC1441 data"), L_SENSORS_BLE, "Sensor #%hhu, service %s: not found ATC1441 data",
sensorId, serviceUuid.toString().c_str() sensorId, serviceUuid.toString().c_str()
); );
return false; return false;
} else if (serviceData.size() != 13) { } else if (serviceData.size() != 13) {
Log.straceln( Log.straceln(
FPSTR(L_SENSORS_BLE), F("Sensor #%hhu, service %s: not in ATC1441 format"), L_SENSORS_BLE, "Sensor #%hhu, service %s: not in ATC1441 format",
sensorId, serviceUuid.toString().c_str() sensorId, serviceUuid.toString().c_str()
); );
return false; return false;
} }
Log.snoticeln( Log.snoticeln(
FPSTR(L_SENSORS_BLE), F("Sensor #%hhu, service %s: found ATC1441 format"), L_SENSORS_BLE, "Sensor #%hhu, service %s: found ATC1441 format",
sensorId, serviceUuid.toString().c_str() sensorId, serviceUuid.toString().c_str()
); );
@@ -116,8 +116,8 @@ public:
// Log // Log
Log.snoticeln( Log.snoticeln(
FPSTR(L_SENSORS_BLE), L_SENSORS_BLE,
F("Sensor #%hhu, received temp: %.2f; humidity: %.2f, battery voltage: %hu, battery level: %hhu"), "Sensor #%hhu, received temp: %.2f; humidity: %.2f, battery voltage: %hu, battery level: %hhu",
sensorId, temperature, humidity, batteryMv, batteryLevel sensorId, temperature, humidity, batteryMv, batteryLevel
); );
@@ -130,21 +130,21 @@ public:
auto serviceData = device->getServiceData(serviceUuid); auto serviceData = device->getServiceData(serviceUuid);
if (!serviceData.size()) { if (!serviceData.size()) {
Log.straceln( Log.straceln(
FPSTR(L_SENSORS_BLE), F("Sensor #%hhu, service %s: not found PVVX data"), L_SENSORS_BLE, "Sensor #%hhu, service %s: not found PVVX data",
sensorId, serviceUuid.toString().c_str() sensorId, serviceUuid.toString().c_str()
); );
return false; return false;
} else if (serviceData.size() != 15) { } else if (serviceData.size() != 15) {
Log.straceln( Log.straceln(
FPSTR(L_SENSORS_BLE), F("Sensor #%hhu, service %s: not in PVVX format"), L_SENSORS_BLE, "Sensor #%hhu, service %s: not in PVVX format",
sensorId, serviceUuid.toString().c_str() sensorId, serviceUuid.toString().c_str()
); );
return false; return false;
} }
Log.snoticeln( Log.snoticeln(
FPSTR(L_SENSORS_BLE), F("Sensor #%hhu, service %s: found PVVX format"), L_SENSORS_BLE, "Sensor #%hhu, service %s: found PVVX format",
sensorId, serviceUuid.toString().c_str() sensorId, serviceUuid.toString().c_str()
); );
@@ -169,8 +169,8 @@ public:
// Log // Log
Log.snoticeln( Log.snoticeln(
FPSTR(L_SENSORS_BLE), L_SENSORS_BLE,
F("Sensor #%hhu, received temp: %.2f; humidity: %.2f, battery voltage: %hu, battery level: %hhu"), "Sensor #%hhu, received temp: %.2f; humidity: %.2f, battery voltage: %hu, battery level: %hhu",
sensorId, temperature, humidity, batteryMv, batteryLevel sensorId, temperature, humidity, batteryMv, batteryLevel
); );
@@ -183,28 +183,28 @@ public:
auto serviceData = device->getServiceData(serviceUuid); auto serviceData = device->getServiceData(serviceUuid);
if (!serviceData.size()) { if (!serviceData.size()) {
Log.straceln( Log.straceln(
FPSTR(L_SENSORS_BLE), F("Sensor #%hhu, service %s: not found BTHome data"), L_SENSORS_BLE, "Sensor #%hhu, service %s: not found BTHome data",
sensorId, serviceUuid.toString().c_str() sensorId, serviceUuid.toString().c_str()
); );
return false; return false;
} else if ((serviceData[0] & 0xE0) != 0x40) { } else if ((serviceData[0] & 0xE0) != 0x40) {
Log.straceln( Log.straceln(
FPSTR(L_SENSORS_BLE), F("Sensor #%hhu, service %s: unsupported BTHome version"), L_SENSORS_BLE, "Sensor #%hhu, service %s: unsupported BTHome version",
sensorId, serviceUuid.toString().c_str() sensorId, serviceUuid.toString().c_str()
); );
return false; return false;
} else if ((serviceData[0] & 0x01) != 0) { } else if ((serviceData[0] & 0x01) != 0) {
Log.straceln( Log.straceln(
FPSTR(L_SENSORS_BLE), F("Sensor #%hhu, service %s: unsupported BTHome encrypted data"), L_SENSORS_BLE, "Sensor #%hhu, service %s: unsupported BTHome encrypted data",
sensorId, serviceUuid.toString().c_str() sensorId, serviceUuid.toString().c_str()
); );
return false; return false;
} }
Log.snoticeln( Log.snoticeln(
FPSTR(L_SENSORS_BLE), F("Sensor #%hhu, service %s: found BTHome format"), L_SENSORS_BLE, "Sensor #%hhu, service %s: found BTHome format",
sensorId, serviceUuid.toString().c_str() sensorId, serviceUuid.toString().c_str()
); );
@@ -231,7 +231,7 @@ public:
foundData = true; foundData = true;
Log.snoticeln( Log.snoticeln(
FPSTR(L_SENSORS_BLE), F("Sensor #%hhu, received battery level: %hhu"), L_SENSORS_BLE, "Sensor #%hhu, received battery level: %hhu",
sensorId, batteryLevel sensorId, batteryLevel
); );
break; break;
@@ -251,7 +251,7 @@ public:
foundData = true; foundData = true;
Log.snoticeln( Log.snoticeln(
FPSTR(L_SENSORS_BLE), F("Sensor #%hhu, received temp: %.2f"), L_SENSORS_BLE, "Sensor #%hhu, received temp: %.2f",
sensorId, temperature sensorId, temperature
); );
break; break;
@@ -271,7 +271,7 @@ public:
foundData = true; foundData = true;
Log.snoticeln( Log.snoticeln(
FPSTR(L_SENSORS_BLE), F("Sensor #%hhu, received humidity: %.2f"), L_SENSORS_BLE, "Sensor #%hhu, received humidity: %.2f",
sensorId, humidity sensorId, humidity
); );
break; break;
@@ -289,7 +289,7 @@ public:
foundData = true; foundData = true;
Log.snoticeln( Log.snoticeln(
FPSTR(L_SENSORS_BLE), F("Sensor #%hhu, received battery voltage: %hu"), L_SENSORS_BLE, "Sensor #%hhu, received battery voltage: %hu",
sensorId, batteryMv sensorId, batteryMv
); );
break; break;
@@ -359,7 +359,6 @@ protected:
#endif #endif
unsigned long globalLastPollingTime = 0; unsigned long globalLastPollingTime = 0;
#if defined(ARDUINO_ARCH_ESP32)
const char* getTaskName() override { const char* getTaskName() override {
return "Sensors"; return "Sensors";
} }
@@ -380,7 +379,6 @@ protected:
int getTaskPriority() override { int getTaskPriority() override {
return 4; return 4;
} }
#endif
void loop() { void loop() {
if (vars.states.restarting || vars.states.upgrading) { if (vars.states.restarting || vars.states.upgrading) {
@@ -493,7 +491,7 @@ protected:
instance.setOneWire(&owInstance); instance.setOneWire(&owInstance);
instance.setWaitForConversion(false); instance.setWaitForConversion(false);
Log.sinfoln(FPSTR(L_SENSORS_DALLAS), F("Started on GPIO %hhu"), sSensor.gpio); Log.sinfoln(L_SENSORS_DALLAS, "Started on GPIO %hhu", sSensor.gpio);
} }
} }
@@ -524,7 +522,7 @@ protected:
this->dallasPolling.erase(gpio); this->dallasPolling.erase(gpio);
this->gpioLastPollingTime.erase(gpio); this->gpioLastPollingTime.erase(gpio);
Log.sinfoln(FPSTR(L_SENSORS_DALLAS), F("Stopped on GPIO %hhu"), gpio); Log.sinfoln(L_SENSORS_DALLAS, "Stopped on GPIO %hhu", gpio);
continue; continue;
} }
@@ -549,8 +547,8 @@ protected:
instance.begin(); instance.begin();
Log.straceln( Log.straceln(
FPSTR(L_SENSORS_DALLAS), L_SENSORS_DALLAS,
F("GPIO %hhu, devices on bus: %hhu, DS18* devices: %hhu"), "GPIO %hhu, devices on bus: %hhu, DS18* devices: %hhu",
gpio, instance.getDeviceCount(), instance.getDS18Count() gpio, instance.getDeviceCount(), instance.getDS18Count()
); );
} }
@@ -616,7 +614,7 @@ protected:
fsSensorsSettings.update(); fsSensorsSettings.update();
Log.straceln( Log.straceln(
FPSTR(L_SENSORS_DALLAS), F("GPIO %hhu, sensor #%hhu '%s', set address: %hhX:%hhX:%hhX:%hhX:%hhX:%hhX:%hhX:%hhX"), L_SENSORS_DALLAS, "GPIO %hhu, sensor #%hhu '%s', set address: %hhX:%hhX:%hhX:%hhX:%hhX:%hhX:%hhX:%hhX",
sSensor.gpio, sensorId, sSensor.name, sSensor.gpio, sensorId, sSensor.name,
sSensor.address[0], sSensor.address[1], sSensor.address[2], sSensor.address[3], sSensor.address[0], sSensor.address[1], sSensor.address[2], sSensor.address[3],
sSensor.address[4], sSensor.address[5], sSensor.address[6], sSensor.address[7] sSensor.address[4], sSensor.address[5], sSensor.address[6], sSensor.address[7]
@@ -667,7 +665,7 @@ protected:
float value = instance.getTempC(sSensor.address); float value = instance.getTempC(sSensor.address);
if (value == DEVICE_DISCONNECTED_C) { if (value == DEVICE_DISCONNECTED_C) {
Log.swarningln( Log.swarningln(
FPSTR(L_SENSORS_DALLAS), F("GPIO %hhu, sensor #%hhu '%s': failed receiving data"), L_SENSORS_DALLAS, "GPIO %hhu, sensor #%hhu '%s': failed receiving data",
sSensor.gpio, sensorId, sSensor.name sSensor.gpio, sensorId, sSensor.name
); );
@@ -679,7 +677,7 @@ protected:
} }
Log.straceln( Log.straceln(
FPSTR(L_SENSORS_DALLAS), F("GPIO %hhu, sensor #%hhu '%s', received data: %.2f"), L_SENSORS_DALLAS, "GPIO %hhu, sensor #%hhu '%s', received data: %.2f",
sSensor.gpio, sensorId, sSensor.name, value sSensor.gpio, sensorId, sSensor.name, value
); );
@@ -708,7 +706,7 @@ protected:
this->dallasPolling[gpio] = true; this->dallasPolling[gpio] = true;
this->gpioLastPollingTime[gpio] = ts; this->gpioLastPollingTime[gpio] = ts;
Log.straceln(FPSTR(L_SENSORS_DALLAS), F("GPIO %hhu, polling..."), gpio); Log.straceln(L_SENSORS_DALLAS, "GPIO %hhu, polling...", gpio);
} }
} }
} }
@@ -741,7 +739,7 @@ protected:
auto& sSensor = Sensors::settings[sensorId]; auto& sSensor = Sensors::settings[sensorId];
Log.straceln( Log.straceln(
FPSTR(L_SENSORS_DHT), F("GPIO %hhu, sensor #%hhu '%s', temp: %.2f, humidity: %.2f%%"), L_SENSORS_DHT, "GPIO %hhu, sensor #%hhu '%s', temp: %.2f, humidity: %.2f%%",
sSensor.gpio, sensorId, sSensor.name, temperature, humidity sSensor.gpio, sensorId, sSensor.name, temperature, humidity
); );
@@ -764,7 +762,7 @@ protected:
auto& sSensor = Sensors::settings[sensorId]; auto& sSensor = Sensors::settings[sensorId];
Log.swarningln( Log.swarningln(
FPSTR(L_SENSORS_DHT), F("GPIO %hhu, sensor #%hhu '%s': failed receiving data (err: %s)"), L_SENSORS_DHT, "GPIO %hhu, sensor #%hhu '%s': failed receiving data (err: %s)",
sSensor.gpio, sensorId, sSensor.name, DHT::statusToString(this->dhtInstance.getStatus()) sSensor.gpio, sensorId, sSensor.name, DHT::statusToString(this->dhtInstance.getStatus())
); );
@@ -786,11 +784,11 @@ protected:
} }
if (this->dhtInstance.setup(sensorGpio, sType)) { if (this->dhtInstance.setup(sensorGpio, sType)) {
Log.sinfoln(FPSTR(L_SENSORS_DHT), F("Started on GPIO %hhu"), sSensor.gpio); Log.sinfoln(L_SENSORS_DHT, "Started on GPIO %hhu", sSensor.gpio);
} else { } else {
Log.swarningln( Log.swarningln(
FPSTR(L_SENSORS_DHT), F("Failed to start on GPIO %hhu (err: %s)"), L_SENSORS_DHT, "Failed to start on GPIO %hhu (err: %s)",
sSensor.gpio, DHT::statusToString(this->dhtInstance.getStatus()) sSensor.gpio, DHT::statusToString(this->dhtInstance.getStatus())
); );
} }
@@ -810,11 +808,7 @@ protected:
continue; continue;
} }
#ifdef ARDUINO_ARCH_ESP32
const auto value = analogReadMilliVolts(sSensor.gpio); const auto value = analogReadMilliVolts(sSensor.gpio);
#else
const auto value = analogRead(sSensor.gpio) / 1023 * DEFAULT_NTC_VREF;
#endif
if (value < DEFAULT_NTC_VLOW_TRESHOLD || value > DEFAULT_NTC_VHIGH_TRESHOLD) { if (value < DEFAULT_NTC_VLOW_TRESHOLD || value > DEFAULT_NTC_VHIGH_TRESHOLD) {
if (Sensors::getConnectionStatusById(sensorId)) { if (Sensors::getConnectionStatusById(sensorId)) {
@@ -822,7 +816,7 @@ protected:
} }
Log.swarningln( Log.swarningln(
FPSTR(L_SENSORS_NTC), F("GPIO %hhu, sensor #%hhu '%s', voltage is out of threshold: %.3f"), L_SENSORS_NTC, "GPIO %hhu, sensor #%hhu '%s', voltage is out of threshold: %.3f",
sSensor.gpio, sensorId, sSensor.name, (value / 1000.0f) sSensor.gpio, sensorId, sSensor.name, (value / 1000.0f)
); );
@@ -838,7 +832,7 @@ protected:
) - 273.15f; ) - 273.15f;
Log.straceln( Log.straceln(
FPSTR(L_SENSORS_NTC), F("GPIO %hhu, sensor #%hhu '%s', raw temp: %.2f, raw voltage: %.3f, raw resistance: %.2f"), L_SENSORS_NTC, "GPIO %hhu, sensor #%hhu '%s', raw temp: %.2f, raw voltage: %.3f, raw resistance: %.2f",
sSensor.gpio, sensorId, sSensor.name, rawTemp, (value / 1000.0f), sensorResistance sSensor.gpio, sensorId, sSensor.name, rawTemp, (value / 1000.0f), sensorResistance
); );
@@ -862,10 +856,10 @@ protected:
if (this->pBLEScan == nullptr) { if (this->pBLEScan == nullptr) {
if (NimBLEDevice::deinit(true)) { if (NimBLEDevice::deinit(true)) {
Log.sinfoln(FPSTR(L_SENSORS_BLE), F("Deinitialized")); Log.sinfoln(L_SENSORS_BLE, "Deinitialized");
} else { } else {
Log.swarningln(FPSTR(L_SENSORS_BLE), F("Unable to deinitialize!")); Log.swarningln(L_SENSORS_BLE, "Unable to deinitialize!");
} }
} }
} }
@@ -875,7 +869,7 @@ protected:
if (!NimBLEDevice::isInitialized() && millis() > 5000) { if (!NimBLEDevice::isInitialized() && millis() > 5000) {
if (NimBLEDevice::init(PROJECT_NAME)) { if (NimBLEDevice::init(PROJECT_NAME)) {
Log.sinfoln(FPSTR(L_SENSORS_BLE), F("Initialized")); Log.sinfoln(L_SENSORS_BLE, "Initialized");
#ifdef ESP_PWR_LVL_P20 #ifdef ESP_PWR_LVL_P20
NimBLEDevice::setPower(ESP_PWR_LVL_P20); NimBLEDevice::setPower(ESP_PWR_LVL_P20);
@@ -884,7 +878,7 @@ protected:
#endif #endif
} else { } else {
Log.swarningln(FPSTR(L_SENSORS_BLE), F("Unable to initialize!")); Log.swarningln(L_SENSORS_BLE, "Unable to initialize!");
return; return;
} }
} }
@@ -900,7 +894,7 @@ protected:
this->pBLEScan->setInterval(10000); this->pBLEScan->setInterval(10000);
this->pBLEScan->setWindow(10000); this->pBLEScan->setWindow(10000);
Log.sinfoln(FPSTR(L_SENSORS_BLE), F("Scanning initialized")); Log.sinfoln(L_SENSORS_BLE, "Scanning initialized");
} }
if (!this->pBLEScan->isScanning()) { if (!this->pBLEScan->isScanning()) {
@@ -909,13 +903,13 @@ protected:
if (this->pBLEScan->start(30000, false, false)) { if (this->pBLEScan->start(30000, false, false)) {
Log.sinfoln( Log.sinfoln(
FPSTR(L_SENSORS_BLE), L_SENSORS_BLE,
F("%s scanning started"), "%s scanning started",
this->activeScanBle ? "Active" : "Passive" this->activeScanBle ? "Active" : "Passive"
); );
} else { } else {
Log.sinfoln(FPSTR(L_SENSORS_BLE), F("Unable to start scanning")); Log.sinfoln(L_SENSORS_BLE, "Unable to start scanning");
} }
} }
} }
+1 -9
View File
@@ -146,15 +146,7 @@
#define DEFAULT_EXT_PUMP_GPIO GPIO_IS_NOT_CONFIGURED #define DEFAULT_EXT_PUMP_GPIO GPIO_IS_NOT_CONFIGURED
#endif #endif
#ifndef PROGMEM #include <driver/gpio.h>
#define PROGMEM // NOLINT
#endif
#ifdef ARDUINO_ARCH_ESP32
#include <driver/gpio.h>
#elif !defined(GPIO_IS_VALID_GPIO)
#define GPIO_IS_VALID_GPIO(gpioNum) (gpioNum >= 0 && gpioNum <= 17)
#endif
#define GPIO_IS_VALID(gpioNum) (gpioNum != GPIO_IS_NOT_CONFIGURED && GPIO_IS_VALID_GPIO(gpioNum)) #define GPIO_IS_VALID(gpioNum) (gpioNum != GPIO_IS_NOT_CONFIGURED && GPIO_IS_VALID_GPIO(gpioNum))
+19 -22
View File
@@ -1,4 +1,9 @@
#include <Arduino.h> #include <Arduino.h>
#if !defined(ARDUINO_ARCH_ESP32)
#error Only ESP32 boards are supported
#endif
#include <ArduinoJson.h> #include <ArduinoJson.h>
#include <FileData.h> #include <FileData.h>
#include <LittleFS.h> #include <LittleFS.h>
@@ -14,13 +19,7 @@
#include "Settings.h" #include "Settings.h"
#include "utils.h" #include "utils.h"
#if defined(ARDUINO_ARCH_ESP32) #include <ESP32Scheduler.h>
#include <ESP32Scheduler.h>
#elif defined(ARDUINO_ARCH_ESP8266)
#include <Scheduler.h>
#else
#error Wrong board. Supported boards: esp8266, esp32
#endif
#include <Task.h> #include <Task.h>
#include <LeanTask.h> #include <LeanTask.h>
@@ -83,17 +82,17 @@ void setup() {
// Network settings // Network settings
switch (fsNetworkSettings.read()) { switch (fsNetworkSettings.read()) {
case FD_FS_ERR: case FD_FS_ERR:
Log.swarningln(FPSTR(L_NETWORK_SETTINGS), F("Filesystem error, load default")); Log.swarningln(L_NETWORK_SETTINGS, "Filesystem error, load default");
break; break;
case FD_FILE_ERR: case FD_FILE_ERR:
Log.swarningln(FPSTR(L_NETWORK_SETTINGS), F("Bad data, load default")); Log.swarningln(L_NETWORK_SETTINGS, "Bad data, load default");
break; break;
case FD_WRITE: case FD_WRITE:
Log.sinfoln(FPSTR(L_NETWORK_SETTINGS), F("Not found, load default")); Log.sinfoln(L_NETWORK_SETTINGS, "Not found, load default");
break; break;
case FD_ADD: case FD_ADD:
case FD_READ: case FD_READ:
Log.sinfoln(FPSTR(L_NETWORK_SETTINGS), F("Loaded")); Log.sinfoln(L_NETWORK_SETTINGS, "Loaded");
break; break;
default: default:
break; break;
@@ -128,20 +127,20 @@ void setup() {
// Settings // Settings
switch (fsSettings.read()) { switch (fsSettings.read()) {
case FD_FS_ERR: case FD_FS_ERR:
Log.swarningln(FPSTR(L_SETTINGS), F("Filesystem error, load default")); Log.swarningln(L_SETTINGS, "Filesystem error, load default");
break; break;
case FD_FILE_ERR: case FD_FILE_ERR:
Log.swarningln(FPSTR(L_SETTINGS), F("Bad data, load default")); Log.swarningln(L_SETTINGS, "Bad data, load default");
break; break;
case FD_WRITE: case FD_WRITE:
Log.sinfoln(FPSTR(L_SETTINGS), F("Not found, load default")); Log.sinfoln(L_SETTINGS, "Not found, load default");
break; break;
case FD_ADD: case FD_ADD:
case FD_READ: case FD_READ:
Log.sinfoln(FPSTR(L_SETTINGS), F("Loaded")); Log.sinfoln(L_SETTINGS, "Loaded");
if (strcmp(SETTINGS_VALID_VALUE, settings.validationValue) != 0) { if (strcmp(SETTINGS_VALID_VALUE, settings.validationValue) != 0) {
Log.swarningln(FPSTR(L_SETTINGS), F("Not valid, set default and restart...")); Log.swarningln(L_SETTINGS, "Not valid, set default and restart...");
fsSettings.reset(); fsSettings.reset();
::delay(5000); ::delay(5000);
ESP.restart(); ESP.restart();
@@ -184,17 +183,17 @@ void setup() {
// Sensors settings // Sensors settings
switch (fsSensorsSettings.read()) { switch (fsSensorsSettings.read()) {
case FD_FS_ERR: case FD_FS_ERR:
Log.swarningln(FPSTR(L_SENSORS), F("Filesystem error, load default")); Log.swarningln(L_SENSORS, "Filesystem error, load default");
break; break;
case FD_FILE_ERR: case FD_FILE_ERR:
Log.swarningln(FPSTR(L_SENSORS), F("Bad data, load default")); Log.swarningln(L_SENSORS, "Bad data, load default");
break; break;
case FD_WRITE: case FD_WRITE:
Log.sinfoln(FPSTR(L_SENSORS), F("Not found, load default")); Log.sinfoln(L_SENSORS, "Not found, load default");
break; break;
case FD_ADD: case FD_ADD:
case FD_READ: case FD_READ:
Log.sinfoln(FPSTR(L_SENSORS), F("Loaded")); Log.sinfoln(L_SENSORS, "Loaded");
default: default:
break; break;
} }
@@ -223,7 +222,5 @@ void setup() {
} }
void loop() { void loop() {
#if defined(ARDUINO_ARCH_ESP32)
vTaskDelete(NULL); vTaskDelete(NULL);
#endif
} }
+222 -225
View File
@@ -1,229 +1,226 @@
#pragma once #pragma once
#ifndef PROGMEM
#define PROGMEM // NOLINT
#endif
const char L_SETTINGS[] PROGMEM = "SETTINGS"; const char L_SETTINGS[] = "SETTINGS";
const char L_SETTINGS_OT[] PROGMEM = "SETTINGS.OT"; const char L_SETTINGS_OT[] = "SETTINGS.OT";
const char L_SETTINGS_DHW[] PROGMEM = "SETTINGS.DHW"; const char L_SETTINGS_DHW[] = "SETTINGS.DHW";
const char L_SETTINGS_HEATING[] PROGMEM = "SETTINGS.HEATING"; const char L_SETTINGS_HEATING[] = "SETTINGS.HEATING";
const char L_NETWORK[] PROGMEM = "NETWORK"; const char L_NETWORK[] = "NETWORK";
const char L_NETWORK_SETTINGS[] PROGMEM = "NETWORK.SETTINGS"; const char L_NETWORK_SETTINGS[] = "NETWORK.SETTINGS";
const char L_PORTAL_WEBSERVER[] PROGMEM = "PORTAL.WEBSERVER"; const char L_PORTAL_WEBSERVER[] = "PORTAL.WEBSERVER";
const char L_PORTAL_DNSSERVER[] PROGMEM = "PORTAL.DNSSERVER"; const char L_PORTAL_DNSSERVER[] = "PORTAL.DNSSERVER";
const char L_PORTAL_CAPTIVE[] PROGMEM = "PORTAL.CAPTIVE"; const char L_PORTAL_CAPTIVE[] = "PORTAL.CAPTIVE";
const char L_PORTAL_OTA[] PROGMEM = "PORTAL.OTA"; const char L_PORTAL_OTA[] = "PORTAL.OTA";
const char L_MAIN[] PROGMEM = "MAIN"; const char L_MAIN[] = "MAIN";
const char L_MQTT[] PROGMEM = "MQTT"; const char L_MQTT[] = "MQTT";
const char L_MQTT_HA[] PROGMEM = "MQTT.HA"; const char L_MQTT_HA[] = "MQTT.HA";
const char L_MQTT_MSG[] PROGMEM = "MQTT.MSG"; const char L_MQTT_MSG[] = "MQTT.MSG";
const char L_OT[] PROGMEM = "OT"; const char L_OT[] = "OT";
const char L_OT_DHW[] PROGMEM = "OT.DHW"; const char L_OT_DHW[] = "OT.DHW";
const char L_OT_HEATING[] PROGMEM = "OT.HEATING"; const char L_OT_HEATING[] = "OT.HEATING";
const char L_OT_CH2[] PROGMEM = "OT.CH2"; const char L_OT_CH2[] = "OT.CH2";
const char L_SENSORS[] PROGMEM = "SENSORS"; const char L_SENSORS[] = "SENSORS";
const char L_SENSORS_SETTINGS[] PROGMEM = "SENSORS.SETTINGS"; const char L_SENSORS_SETTINGS[] = "SENSORS.SETTINGS";
const char L_SENSORS_DALLAS[] PROGMEM = "SENSORS.DALLAS"; const char L_SENSORS_DALLAS[] = "SENSORS.DALLAS";
const char L_SENSORS_DHT[] PROGMEM = "SENSORS.DHT"; const char L_SENSORS_DHT[] = "SENSORS.DHT";
const char L_SENSORS_NTC[] PROGMEM = "SENSORS.NTC"; const char L_SENSORS_NTC[] = "SENSORS.NTC";
const char L_SENSORS_BLE[] PROGMEM = "SENSORS.BLE"; const char L_SENSORS_BLE[] = "SENSORS.BLE";
const char L_REGULATOR[] PROGMEM = "REGULATOR"; const char L_REGULATOR[] = "REGULATOR";
const char L_REGULATOR_PID[] PROGMEM = "REGULATOR.PID"; const char L_REGULATOR_PID[] = "REGULATOR.PID";
const char L_REGULATOR_EQUITHERM[] PROGMEM = "REGULATOR.EQUITHERM"; const char L_REGULATOR_EQUITHERM[] = "REGULATOR.EQUITHERM";
const char L_CASCADE_INPUT[] PROGMEM = "CASCADE.INPUT"; const char L_CASCADE_INPUT[] = "CASCADE.INPUT";
const char L_CASCADE_OUTPUT[] PROGMEM = "CASCADE.OUTPUT"; const char L_CASCADE_OUTPUT[] = "CASCADE.OUTPUT";
const char L_EXTPUMP[] PROGMEM = "EXTPUMP"; const char L_EXTPUMP[] = "EXTPUMP";
const char S_ACTIONS[] PROGMEM = "actions"; const char S_ACTIONS[] = "actions";
const char S_ACTIVE[] PROGMEM = "active"; const char S_ACTIVE[] = "active";
const char S_ADDRESS[] PROGMEM = "address"; const char S_ADDRESS[] = "address";
const char S_ANTI_STUCK_INTERVAL[] PROGMEM = "antiStuckInterval"; const char S_ANTI_STUCK_INTERVAL[] = "antiStuckInterval";
const char S_ANTI_STUCK_TIME[] PROGMEM = "antiStuckTime"; const char S_ANTI_STUCK_TIME[] = "antiStuckTime";
const char S_AP[] PROGMEM = "ap"; const char S_AP[] = "ap";
const char S_APP_VERSION[] PROGMEM = "appVersion"; const char S_APP_VERSION[] = "appVersion";
const char S_AUTH[] PROGMEM = "auth"; const char S_AUTH[] = "auth";
const char S_AUTO_DIAG_RESET[] PROGMEM = "autoDiagReset"; const char S_AUTO_DIAG_RESET[] = "autoDiagReset";
const char S_AUTO_FAULT_RESET[] PROGMEM = "autoFaultReset"; const char S_AUTO_FAULT_RESET[] = "autoFaultReset";
const char S_BACKTRACE[] PROGMEM = "backtrace"; const char S_BACKTRACE[] = "backtrace";
const char S_BATTERY[] PROGMEM = "battery"; const char S_BATTERY[] = "battery";
const char S_BAUDRATE[] PROGMEM = "baudrate"; const char S_BAUDRATE[] = "baudrate";
const char S_BLOCKING[] PROGMEM = "blocking"; const char S_BLOCKING[] = "blocking";
const char S_BSSID[] PROGMEM = "bssid"; const char S_BSSID[] = "bssid";
const char S_BUILD[] PROGMEM = "build"; const char S_BUILD[] = "build";
const char S_CASCADE_CONTROL[] PROGMEM = "cascadeControl"; const char S_CASCADE_CONTROL[] = "cascadeControl";
const char S_CHANNEL[] PROGMEM = "channel"; const char S_CHANNEL[] = "channel";
const char S_CH2_ALWAYS_ENABLED[] PROGMEM = "ch2AlwaysEnabled"; const char S_CH2_ALWAYS_ENABLED[] = "ch2AlwaysEnabled";
const char S_CH2_DISABLING_ACTION[] PROGMEM = "ch2DisablingAction"; const char S_CH2_DISABLING_ACTION[] = "ch2DisablingAction";
const char S_CHIP[] PROGMEM = "chip"; const char S_CHIP[] = "chip";
const char S_CODE[] PROGMEM = "code"; const char S_CODE[] = "code";
const char S_COMMIT[] PROGMEM = "commit"; const char S_COMMIT[] = "commit";
const char S_CONNECTED[] PROGMEM = "connected"; const char S_CONNECTED[] = "connected";
const char S_CONTINUES[] PROGMEM = "continues"; const char S_CONTINUES[] = "continues";
const char S_COOLING[] PROGMEM = "cooling"; const char S_COOLING[] = "cooling";
const char S_COOLING_SUPPORT[] PROGMEM = "coolingSupport"; const char S_COOLING_SUPPORT[] = "coolingSupport";
const char S_CORE[] PROGMEM = "core"; const char S_CORE[] = "core";
const char S_CORES[] PROGMEM = "cores"; const char S_CORES[] = "cores";
const char S_CRASH[] PROGMEM = "crash"; const char S_CRASH[] = "crash";
const char S_CURRENT_TEMP[] PROGMEM = "currentTemp"; const char S_CURRENT_TEMP[] = "currentTemp";
const char S_DATA[] PROGMEM = "data"; const char S_DATA[] = "data";
const char S_DATE[] PROGMEM = "date"; const char S_DATE[] = "date";
const char S_DEADBAND[] PROGMEM = "deadband"; const char S_DEADBAND[] = "deadband";
const char S_DHW[] PROGMEM = "dhw"; const char S_DHW[] = "dhw";
const char S_DHW_BLOCKING[] PROGMEM = "dhwBlocking"; const char S_DHW_BLOCKING[] = "dhwBlocking";
const char S_DHW_DISABLING_ACTION[] PROGMEM = "dhwDisablingAction"; const char S_DHW_DISABLING_ACTION[] = "dhwDisablingAction";
const char S_DHW_STATE_AS_DHW_BLOCKING[] PROGMEM = "dhwStateAsDhwBlocking"; const char S_DHW_STATE_AS_DHW_BLOCKING[] = "dhwStateAsDhwBlocking";
const char S_DHW_SUPPORT[] PROGMEM = "dhwSupport"; const char S_DHW_SUPPORT[] = "dhwSupport";
const char S_DHW_TO_CH2[] PROGMEM = "dhwToCh2"; const char S_DHW_TO_CH2[] = "dhwToCh2";
const char S_DIAG[] PROGMEM = "diag"; const char S_DIAG[] = "diag";
const char S_DNS[] PROGMEM = "dns"; const char S_DNS[] = "dns";
const char S_DT[] PROGMEM = "dt"; const char S_DT[] = "dt";
const char S_D_FACTOR[] PROGMEM = "d_factor"; const char S_D_FACTOR[] = "d_factor";
const char S_D_MULTIPLIER[] PROGMEM = "d_multiplier"; const char S_D_MULTIPLIER[] = "d_multiplier";
const char S_EMERGENCY[] PROGMEM = "emergency"; const char S_EMERGENCY[] = "emergency";
const char S_ENABLED[] PROGMEM = "enabled"; const char S_ENABLED[] = "enabled";
const char S_ENV[] PROGMEM = "env"; const char S_ENV[] = "env";
const char S_EPC[] PROGMEM = "epc"; const char S_EPC[] = "epc";
const char S_EQUITHERM[] PROGMEM = "equitherm"; const char S_EQUITHERM[] = "equitherm";
const char S_EXPONENT[] PROGMEM = "exponent"; const char S_EXPONENT[] = "exponent";
const char S_EXTERNAL_PUMP[] PROGMEM = "externalPump"; const char S_EXTERNAL_PUMP[] = "externalPump";
const char S_FACTOR[] PROGMEM = "factor"; const char S_FACTOR[] = "factor";
const char S_FAULT[] PROGMEM = "fault"; const char S_FAULT[] = "fault";
const char S_FREEZE_PROTECTION[] PROGMEM = "freezeProtection"; const char S_FREEZE_PROTECTION[] = "freezeProtection";
const char S_FREEZING[] PROGMEM = "freezing"; const char S_FREEZING[] = "freezing";
const char S_FILTERING[] PROGMEM = "filtering"; const char S_FILTERING[] = "filtering";
const char S_FILTERING_FACTOR[] PROGMEM = "filteringFactor"; const char S_FILTERING_FACTOR[] = "filteringFactor";
const char S_FLAGS[] PROGMEM = "flags"; const char S_FLAGS[] = "flags";
const char S_FLAME[] PROGMEM = "flame"; const char S_FLAME[] = "flame";
const char S_FLASH[] PROGMEM = "flash"; const char S_FLASH[] = "flash";
const char S_FREE[] PROGMEM = "free"; const char S_FREE[] = "free";
const char S_FREQ[] PROGMEM = "freq"; const char S_FREQ[] = "freq";
const char S_GATEWAY[] PROGMEM = "gateway"; const char S_GATEWAY[] = "gateway";
const char S_GET_MIN_MAX_TEMP[] PROGMEM = "getMinMaxTemp"; const char S_GET_MIN_MAX_TEMP[] = "getMinMaxTemp";
const char S_GPIO[] PROGMEM = "gpio"; const char S_GPIO[] = "gpio";
const char S_HEAP[] PROGMEM = "heap"; const char S_HEAP[] = "heap";
const char S_HEATING[] PROGMEM = "heating"; const char S_HEATING[] = "heating";
const char S_HEATING_DISABLING_ACTION[] PROGMEM = "heatingDisablingAction"; const char S_HEATING_DISABLING_ACTION[] = "heatingDisablingAction";
const char S_HEATING_TO_CH2[] PROGMEM = "heatingToCh2"; const char S_HEATING_TO_CH2[] = "heatingToCh2";
const char S_HEATING_STATE_TO_SUMMER_WINTER_MODE[] PROGMEM = "heatingStateToSummerWinterMode"; const char S_HEATING_STATE_TO_SUMMER_WINTER_MODE[] = "heatingStateToSummerWinterMode";
const char S_HIDDEN[] PROGMEM = "hidden"; const char S_HIDDEN[] = "hidden";
const char S_HIGH_TEMP[] PROGMEM = "highTemp"; const char S_HIGH_TEMP[] = "highTemp";
const char S_HOME_ASSISTANT_DISCOVERY[] PROGMEM = "homeAssistantDiscovery"; const char S_HOME_ASSISTANT_DISCOVERY[] = "homeAssistantDiscovery";
const char S_HOSTNAME[] PROGMEM = "hostname"; const char S_HOSTNAME[] = "hostname";
const char S_HUMIDITY[] PROGMEM = "humidity"; const char S_HUMIDITY[] = "humidity";
const char S_HYSTERESIS[] PROGMEM = "hysteresis"; const char S_HYSTERESIS[] = "hysteresis";
const char S_ID[] PROGMEM = "id"; const char S_ID[] = "id";
const char S_IGNORE_DIAG_STATE[] PROGMEM = "ignoreDiagState"; const char S_IGNORE_DIAG_STATE[] = "ignoreDiagState";
const char S_IMMERGAS_FIX[] PROGMEM = "immergasFix"; const char S_IMMERGAS_FIX[] = "immergasFix";
const char S_ALWAYS_SEND_INDOOR_TEMP[] PROGMEM = "alwaysSendIndoorTemp"; const char S_ALWAYS_SEND_INDOOR_TEMP[] = "alwaysSendIndoorTemp";
const char S_INDOOR_TEMP[] PROGMEM = "indoorTemp"; const char S_INDOOR_TEMP[] = "indoorTemp";
const char S_INDOOR_TEMP_AVG_TYPE[] PROGMEM = "indoorTempAvgType"; const char S_INDOOR_TEMP_AVG_TYPE[] = "indoorTempAvgType";
const char S_INDOOR_TEMP_CONTROL[] PROGMEM = "indoorTempControl"; const char S_INDOOR_TEMP_CONTROL[] = "indoorTempControl";
const char S_IN_GPIO[] PROGMEM = "inGpio"; const char S_IN_GPIO[] = "inGpio";
const char S_INPUT[] PROGMEM = "input"; const char S_INPUT[] = "input";
const char S_INTERVAL[] PROGMEM = "interval"; const char S_INTERVAL[] = "interval";
const char S_INVERT_STATE[] PROGMEM = "invertState"; const char S_INVERT_STATE[] = "invertState";
const char S_IP[] PROGMEM = "ip"; const char S_IP[] = "ip";
const char S_I_FACTOR[] PROGMEM = "i_factor"; const char S_I_FACTOR[] = "i_factor";
const char S_I_MULTIPLIER[] PROGMEM = "i_multiplier"; const char S_I_MULTIPLIER[] = "i_multiplier";
const char S_LOGIN[] PROGMEM = "login"; const char S_LOGIN[] = "login";
const char S_LOG_LEVEL[] PROGMEM = "logLevel"; const char S_LOG_LEVEL[] = "logLevel";
const char S_LOW_TEMP[] PROGMEM = "lowTemp"; const char S_LOW_TEMP[] = "lowTemp";
const char S_MAC[] PROGMEM = "mac"; const char S_MAC[] = "mac";
const char S_MASTER[] PROGMEM = "master"; const char S_MASTER[] = "master";
const char S_MAX[] PROGMEM = "max"; const char S_MAX[] = "max";
const char S_MAX_FREE_BLOCK[] PROGMEM = "maxFreeBlock"; const char S_MAX_FREE_BLOCK[] = "maxFreeBlock";
const char S_MAX_MODULATION[] PROGMEM = "maxModulation"; const char S_MAX_MODULATION[] = "maxModulation";
const char S_MAX_POWER[] PROGMEM = "maxPower"; const char S_MAX_POWER[] = "maxPower";
const char S_MAX_TEMP[] PROGMEM = "maxTemp"; const char S_MAX_TEMP[] = "maxTemp";
const char S_MAX_TEMP_SYNC_WITH_TARGET_TEMP[] PROGMEM = "maxTempSyncWithTargetTemp"; const char S_MAX_TEMP_SYNC_WITH_TARGET_TEMP[] = "maxTempSyncWithTargetTemp";
const char S_MDNS[] PROGMEM = "mdns"; const char S_MDNS[] = "mdns";
const char S_MEMBER_ID[] PROGMEM = "memberId"; const char S_MEMBER_ID[] = "memberId";
const char S_MIN[] PROGMEM = "min"; const char S_MIN[] = "min";
const char S_MIN_FREE[] PROGMEM = "minFree"; const char S_MIN_FREE[] = "minFree";
const char S_MIN_MAX_FREE_BLOCK[] PROGMEM = "minMaxFreeBlock"; const char S_MIN_MAX_FREE_BLOCK[] = "minMaxFreeBlock";
const char S_MIN_POWER[] PROGMEM = "minPower"; const char S_MIN_POWER[] = "minPower";
const char S_MIN_TEMP[] PROGMEM = "minTemp"; const char S_MIN_TEMP[] = "minTemp";
const char S_MODEL[] PROGMEM = "model"; const char S_MODEL[] = "model";
const char S_MODULATION[] PROGMEM = "modulation"; const char S_MODULATION[] = "modulation";
const char S_MQTT[] PROGMEM = "mqtt"; const char S_MQTT[] = "mqtt";
const char S_NAME[] PROGMEM = "name"; const char S_NAME[] = "name";
const char S_NATIVE_OTC[] PROGMEM = "nativeOTC"; const char S_NATIVE_OTC[] = "nativeOTC";
const char S_NETWORK[] PROGMEM = "network"; const char S_NETWORK[] = "network";
const char S_NTP[] PROGMEM = "ntp"; const char S_NTP[] = "ntp";
const char S_OFFSET[] PROGMEM = "offset"; const char S_OFFSET[] = "offset";
const char S_ON_ENABLED_HEATING[] PROGMEM = "onEnabledHeating"; const char S_ON_ENABLED_HEATING[] = "onEnabledHeating";
const char S_ON_FAULT[] PROGMEM = "onFault"; const char S_ON_FAULT[] = "onFault";
const char S_ON_LOSS_CONNECTION[] PROGMEM = "onLossConnection"; const char S_ON_LOSS_CONNECTION[] = "onLossConnection";
const char S_OPENTHERM[] PROGMEM = "opentherm"; const char S_OPENTHERM[] = "opentherm";
const char S_OPTIONS[] PROGMEM = "options"; const char S_OPTIONS[] = "options";
const char S_OUTDOOR_TEMP[] PROGMEM = "outdoorTemp"; const char S_OUTDOOR_TEMP[] = "outdoorTemp";
const char S_OUTDOOR_TEMP_AVG_TYPE[] PROGMEM = "outdoorTempAvgType"; const char S_OUTDOOR_TEMP_AVG_TYPE[] = "outdoorTempAvgType";
const char S_OUT_GPIO[] PROGMEM = "outGpio"; const char S_OUT_GPIO[] = "outGpio";
const char S_OUTPUT[] PROGMEM = "output"; const char S_OUTPUT[] = "output";
const char S_OVERHEAT[] PROGMEM = "overheat"; const char S_OVERHEAT[] = "overheat";
const char S_OVERHEAT_PROTECTION[] PROGMEM = "overheatProtection"; const char S_OVERHEAT_PROTECTION[] = "overheatProtection";
const char S_PASSWORD[] PROGMEM = "password"; const char S_PASSWORD[] = "password";
const char S_PID[] PROGMEM = "pid"; const char S_PID[] = "pid";
const char S_PORT[] PROGMEM = "port"; const char S_PORT[] = "port";
const char S_PORTAL[] PROGMEM = "portal"; const char S_PORTAL[] = "portal";
const char S_POST_CIRCULATION_TIME[] PROGMEM = "postCirculationTime"; const char S_POST_CIRCULATION_TIME[] = "postCirculationTime";
const char S_POWER[] PROGMEM = "power"; const char S_POWER[] = "power";
const char S_PREFIX[] PROGMEM = "prefix"; const char S_PREFIX[] = "prefix";
const char S_PROTOCOL_VERSION[] PROGMEM = "protocolVersion"; const char S_PROTOCOL_VERSION[] = "protocolVersion";
const char S_PURPOSE[] PROGMEM = "purpose"; const char S_PURPOSE[] = "purpose";
const char S_PSRAM[] PROGMEM = "psram"; const char S_PSRAM[] = "psram";
const char S_P_FACTOR[] PROGMEM = "p_factor"; const char S_P_FACTOR[] = "p_factor";
const char S_P_MULTIPLIER[] PROGMEM = "p_multiplier"; const char S_P_MULTIPLIER[] = "p_multiplier";
const char S_REAL_SIZE[] PROGMEM = "realSize"; const char S_REAL_SIZE[] = "realSize";
const char S_REASON[] PROGMEM = "reason"; const char S_REASON[] = "reason";
const char S_RESET_DIAGNOSTIC[] PROGMEM = "resetDiagnostic"; const char S_RESET_DIAGNOSTIC[] = "resetDiagnostic";
const char S_RESET_FAULT[] PROGMEM = "resetFault"; const char S_RESET_FAULT[] = "resetFault";
const char S_RESET_REASON[] PROGMEM = "resetReason"; const char S_RESET_REASON[] = "resetReason";
const char S_RESTART[] PROGMEM = "restart"; const char S_RESTART[] = "restart";
const char S_RETURN_TEMP[] PROGMEM = "returnTemp"; const char S_RETURN_TEMP[] = "returnTemp";
const char S_REV[] PROGMEM = "rev"; const char S_REV[] = "rev";
const char S_RSSI[] PROGMEM = "rssi"; const char S_RSSI[] = "rssi";
const char S_RX_LED_GPIO[] PROGMEM = "rxLedGpio"; const char S_RX_LED_GPIO[] = "rxLedGpio";
const char S_SDK[] PROGMEM = "sdk"; const char S_SDK[] = "sdk";
const char S_SENSORS[] PROGMEM = "sensors"; const char S_SENSORS[] = "sensors";
const char S_SERIAL[] PROGMEM = "serial"; const char S_SERIAL[] = "serial";
const char S_SERVER[] PROGMEM = "server"; const char S_SERVER[] = "server";
const char S_SETTINGS[] PROGMEM = "settings"; const char S_SETTINGS[] = "settings";
const char S_SET_DATE_AND_TIME[] PROGMEM = "setDateAndTime"; const char S_SET_DATE_AND_TIME[] = "setDateAndTime";
const char S_SHIFT[] PROGMEM = "shift"; const char S_SHIFT[] = "shift";
const char S_SIGNAL_QUALITY[] PROGMEM = "signalQuality"; const char S_SIGNAL_QUALITY[] = "signalQuality";
const char S_SIZE[] PROGMEM = "size"; const char S_SIZE[] = "size";
const char S_SLAVE[] PROGMEM = "slave"; const char S_SLAVE[] = "slave";
const char S_SLOPE[] PROGMEM = "slope"; const char S_SLOPE[] = "slope";
const char S_SSID[] PROGMEM = "ssid"; const char S_SSID[] = "ssid";
const char S_STA[] PROGMEM = "sta"; const char S_STA[] = "sta";
const char S_STATE[] PROGMEM = "state"; const char S_STATE[] = "state";
const char S_STATIC_CONFIG[] PROGMEM = "staticConfig"; const char S_STATIC_CONFIG[] = "staticConfig";
const char S_STATUS_LED_GPIO[] PROGMEM = "statusLedGpio"; const char S_STATUS_LED_GPIO[] = "statusLedGpio";
const char S_SETPOINT[] PROGMEM = "setpoint"; const char S_SETPOINT[] = "setpoint";
const char S_SETPOINT_TEMP[] PROGMEM = "setpointTemp"; const char S_SETPOINT_TEMP[] = "setpointTemp";
const char S_SUBNET[] PROGMEM = "subnet"; const char S_SUBNET[] = "subnet";
const char S_SUMMER_WINTER_MODE[] PROGMEM = "summerWinterMode"; const char S_SUMMER_WINTER_MODE[] = "summerWinterMode";
const char S_SYSTEM[] PROGMEM = "system"; const char S_SYSTEM[] = "system";
const char S_TARGET[] PROGMEM = "target"; const char S_TARGET[] = "target";
const char S_TARGET_DIFF_FACTOR[] PROGMEM = "targetDiffFactor"; const char S_TARGET_DIFF_FACTOR[] = "targetDiffFactor";
const char S_TARGET_TEMP[] PROGMEM = "targetTemp"; const char S_TARGET_TEMP[] = "targetTemp";
const char S_TEMPERATURE[] PROGMEM = "temperature"; const char S_TEMPERATURE[] = "temperature";
const char S_THRESHOLD_HIGH[] PROGMEM = "thresholdHigh"; const char S_THRESHOLD_HIGH[] = "thresholdHigh";
const char S_THRESHOLD_LOW[] PROGMEM = "thresholdLow"; const char S_THRESHOLD_LOW[] = "thresholdLow";
const char S_THRESHOLD_TIME[] PROGMEM = "thresholdTime"; const char S_THRESHOLD_TIME[] = "thresholdTime";
const char S_TIMEZONE[] PROGMEM = "timezone"; const char S_TIMEZONE[] = "timezone";
const char S_TOTAL[] PROGMEM = "total"; const char S_TOTAL[] = "total";
const char S_TRESHOLD_TIME[] PROGMEM = "tresholdTime"; const char S_TRESHOLD_TIME[] = "tresholdTime";
const char S_TURBO[] PROGMEM = "turbo"; const char S_TURBO[] = "turbo";
const char S_TURBO_FACTOR[] PROGMEM = "turboFactor"; const char S_TURBO_FACTOR[] = "turboFactor";
const char S_TYPE[] PROGMEM = "type"; const char S_TYPE[] = "type";
const char S_UNIT_SYSTEM[] PROGMEM = "unitSystem"; const char S_UNIT_SYSTEM[] = "unitSystem";
const char S_UPTIME[] PROGMEM = "uptime"; const char S_UPTIME[] = "uptime";
const char S_USE[] PROGMEM = "use"; const char S_USE[] = "use";
const char S_USE_DHCP[] PROGMEM = "useDhcp"; const char S_USE_DHCP[] = "useDhcp";
const char S_USER[] PROGMEM = "user"; const char S_USER[] = "user";
const char S_VALUE[] PROGMEM = "value"; const char S_VALUE[] = "value";
const char S_VERSION[] PROGMEM = "version"; const char S_VERSION[] = "version";
const char S_WEBSERIAL[] PROGMEM = "webSerial"; const char S_WEBSERIAL[] = "webSerial";
+511 -547
View File
File diff suppressed because it is too large. Load diff