mirror of
https://github.com/Laxilef/OTGateway.git
synced 2026-11-11 17:04:46 +05:00
refactor: remove ESP8266 support and legacy flash wrappers
This commit is contained in:
1 parent
959a15c11f
commit
b72bccb3d7
24 files changed
+2027
-2415
No files matched your search
@@ -14,6 +14,8 @@
|
|||||||

|

|
||||||
|
|
||||||
## 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.
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -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
|
|
||||||
};
|
|
||||||
@@ -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;
|
||||||
};
|
};
|
||||||
@@ -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,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);
|
||||||
|
|||||||
@@ -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
|
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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
File diff suppressed because it is too large.
Load diff
+38
-40
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
File diff suppressed because it is too large.
Load diff
Reference in new issue
Block a user