mirror of
https://github.com/Laxilef/OTGateway.git
synced 2025-12-11 02:34:29 +05:00
use TinyLogger lib
This commit is contained in:
@@ -20,6 +20,7 @@ lib_deps =
|
||||
gyverlibs/GyverPID@^3.3
|
||||
gyverlibs/GyverBlinker@^1.0
|
||||
milesburton/DallasTemperature@^3.11.0
|
||||
laxilef/TinyLogger@^1.0.2
|
||||
https://github.com/Laxilef/WiFiManager/archive/refs/heads/patch-1.zip
|
||||
;https://github.com/tzapu/WiFiManager.git#v2.0.16-rc.2
|
||||
build_flags = -D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH -mtext-section-literals
|
||||
|
||||
@@ -14,6 +14,7 @@ protected:
|
||||
unsigned long firstFailConnect = 0;
|
||||
unsigned int heapSize = 0;
|
||||
unsigned int minFreeHeapSize = 0;
|
||||
unsigned long restartSignalTime = 0;
|
||||
|
||||
const char* getTaskName() {
|
||||
return "Main";
|
||||
@@ -41,21 +42,20 @@ protected:
|
||||
|
||||
void loop() {
|
||||
if (eeSettings.tick()) {
|
||||
INFO("Settings updated (EEPROM)");
|
||||
Log.sinfoln("MAIN", "Settings updated (EEPROM)");
|
||||
}
|
||||
|
||||
if (vars.parameters.restartAfterTime > 0 && millis() - vars.parameters.restartSignalTime > vars.parameters.restartAfterTime) {
|
||||
vars.parameters.restartAfterTime = 0;
|
||||
|
||||
INFO("Received restart message...");
|
||||
if (vars.actions.restart) {
|
||||
Log.sinfoln("MAIN", "Restart signal received. Restart after 10 sec.");
|
||||
eeSettings.updateNow();
|
||||
INFO("Restart...");
|
||||
delay(1000);
|
||||
|
||||
ESP.restart();
|
||||
restartSignalTime = millis();
|
||||
vars.actions.restart = false;
|
||||
}
|
||||
|
||||
if (WiFi.status() == WL_CONNECTED) {
|
||||
//timeClient.update();
|
||||
vars.states.rssi = WiFi.RSSI();
|
||||
|
||||
if (!tMqtt->isEnabled() && strlen(settings.mqtt.server) > 0) {
|
||||
tMqtt->enable();
|
||||
}
|
||||
@@ -64,7 +64,12 @@ protected:
|
||||
firstFailConnect = 0;
|
||||
}
|
||||
|
||||
vars.states.rssi = WiFi.RSSI();
|
||||
if ( Log.getLevel() == TinyLogger::Level::VERBOSE && !settings.debug ) {
|
||||
Log.setLevel(TinyLogger::Level::INFO);
|
||||
|
||||
} else if ( Log.getLevel() != TinyLogger::Level::VERBOSE && settings.debug ) {
|
||||
Log.setLevel(TinyLogger::Level::VERBOSE);
|
||||
}
|
||||
|
||||
} else {
|
||||
if (tMqtt->isEnabled()) {
|
||||
@@ -78,7 +83,7 @@ protected:
|
||||
|
||||
if (millis() - firstFailConnect > EMERGENCY_TIME_TRESHOLD) {
|
||||
vars.states.emergency = true;
|
||||
INFO("Emergency mode enabled");
|
||||
Log.sinfoln("MAIN", "Emergency mode enabled");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -89,7 +94,9 @@ protected:
|
||||
|
||||
#ifdef LED_STATUS_PIN
|
||||
ledStatus(LED_STATUS_PIN);
|
||||
yield();
|
||||
#endif
|
||||
heap();
|
||||
|
||||
#if USE_TELNET
|
||||
yield();
|
||||
@@ -101,19 +108,28 @@ protected:
|
||||
}
|
||||
#endif
|
||||
|
||||
if (settings.debug) {
|
||||
unsigned int freeHeapSize = ESP.getFreeHeap();
|
||||
unsigned int minFreeHeapSizeDiff = 0;
|
||||
if (restartSignalTime > 0 && millis() - restartSignalTime > 10000) {
|
||||
restartSignalTime = 0;
|
||||
ESP.restart();
|
||||
}
|
||||
}
|
||||
|
||||
if (freeHeapSize < minFreeHeapSize) {
|
||||
minFreeHeapSizeDiff = minFreeHeapSize - freeHeapSize;
|
||||
minFreeHeapSize = freeHeapSize;
|
||||
}
|
||||
void heap() {
|
||||
if (!settings.debug) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (millis() - lastHeapInfo > 10000 || minFreeHeapSizeDiff > 0) {
|
||||
DEBUG_F("Free heap size: %u of %u bytes, min: %u bytes (diff: %u bytes)\n", freeHeapSize, heapSize, minFreeHeapSize, minFreeHeapSizeDiff);
|
||||
lastHeapInfo = millis();
|
||||
}
|
||||
unsigned int freeHeapSize = ESP.getFreeHeap();
|
||||
unsigned int minFreeHeapSizeDiff = 0;
|
||||
|
||||
if (freeHeapSize < minFreeHeapSize) {
|
||||
minFreeHeapSizeDiff = minFreeHeapSize - freeHeapSize;
|
||||
minFreeHeapSize = freeHeapSize;
|
||||
}
|
||||
|
||||
if (millis() - lastHeapInfo > 60000 || minFreeHeapSizeDiff > 0) {
|
||||
Log.sverboseln("MAIN", "Free heap size: %u of %u bytes, min: %u bytes (diff: %u bytes)", freeHeapSize, heapSize, minFreeHeapSize, minFreeHeapSizeDiff);
|
||||
lastHeapInfo = millis();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -24,13 +24,13 @@ protected:
|
||||
}
|
||||
|
||||
void setup() {
|
||||
DEBUG("[MQTT] Started");
|
||||
Log.sinfoln("MQTT", "Started");
|
||||
|
||||
client.setCallback(__callback);
|
||||
haHelper.setDevicePrefix(settings.mqtt.prefix);
|
||||
haHelper.setDeviceVersion(OT_GATEWAY_VERSION);
|
||||
haHelper.setDeviceModel("Opentherm Gateway");
|
||||
haHelper.setDeviceName("Opentherm Gateway");
|
||||
haHelper.setDeviceVersion(PROJECT_VERSION);
|
||||
haHelper.setDeviceModel(PROJECT_NAME);
|
||||
haHelper.setDeviceName(PROJECT_NAME);
|
||||
|
||||
sprintf(buffer, CONFIG_URL, WiFi.localIP().toString().c_str());
|
||||
haHelper.setDeviceConfigUrl(buffer);
|
||||
@@ -38,11 +38,11 @@ protected:
|
||||
|
||||
void loop() {
|
||||
if (!client.connected() && millis() - lastReconnectAttempt >= MQTT_RECONNECT_INTERVAL) {
|
||||
INFO_F("Mqtt not connected, state: %i, connecting to server %s...\n", client.state(), settings.mqtt.server);
|
||||
Log.sinfoln("MQTT", "Not connected, state: %i, connecting to server %s...", client.state(), settings.mqtt.server);
|
||||
|
||||
client.setServer(settings.mqtt.server, settings.mqtt.port);
|
||||
if (client.connect(settings.hostname, settings.mqtt.user, settings.mqtt.password)) {
|
||||
INFO("Connected to MQTT server");
|
||||
Log.sinfoln("MQTT", "Connected");
|
||||
|
||||
client.subscribe(getTopicPath("settings/set").c_str());
|
||||
client.subscribe(getTopicPath("state/set").c_str());
|
||||
@@ -53,7 +53,7 @@ protected:
|
||||
lastReconnectAttempt = 0;
|
||||
|
||||
} else {
|
||||
INFO("Failed to connect to MQTT server\n");
|
||||
Log.swarningln("MQTT", "Failed to connect to server");
|
||||
|
||||
if (settings.emergency.enable && !vars.states.emergency) {
|
||||
if (firstFailConnect == 0) {
|
||||
@@ -62,7 +62,7 @@ protected:
|
||||
|
||||
if (millis() - firstFailConnect > EMERGENCY_TIME_TRESHOLD) {
|
||||
vars.states.emergency = true;
|
||||
INFO("Emergency mode enabled");
|
||||
Log.sinfoln("MQTT", "Emergency mode enabled");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ protected:
|
||||
if (vars.states.emergency) {
|
||||
vars.states.emergency = false;
|
||||
|
||||
INFO("Emergency mode disabled");
|
||||
Log.sinfoln("MQTT", "Emergency mode disabled");
|
||||
}
|
||||
|
||||
client.loop();
|
||||
@@ -323,9 +323,16 @@ protected:
|
||||
}
|
||||
}
|
||||
|
||||
if (!doc["restart"].isNull() && doc["restart"].is<bool>() && doc["restart"].as<bool>()) {
|
||||
vars.parameters.restartAfterTime = 5000;
|
||||
vars.parameters.restartSignalTime = millis();
|
||||
if (!doc["actions"]["restart"].isNull() && doc["actions"]["restart"].is<bool>() && doc["actions"]["restart"].as<bool>()) {
|
||||
vars.actions.restart = true;
|
||||
}
|
||||
|
||||
if (!doc["actions"]["faultReset"].isNull() && doc["actions"]["faultReset"].is<bool>() && doc["actions"]["faultReset"].as<bool>()) {
|
||||
vars.actions.faultReset = true;
|
||||
}
|
||||
|
||||
if (!doc["actions"]["diagnosticReset"].isNull() && doc["actions"]["diagnosticReset"].is<bool>() && doc["actions"]["diagnosticReset"].as<bool>()) {
|
||||
vars.actions.diagnosticReset = true;
|
||||
}
|
||||
|
||||
if (flag) {
|
||||
@@ -412,6 +419,7 @@ protected:
|
||||
haHelper.publishBinSensorDiagnostic();
|
||||
haHelper.publishSensorFaultCode();
|
||||
haHelper.publishSensorRssi(false);
|
||||
haHelper.publishSensorUptime(false);
|
||||
|
||||
// sensors
|
||||
haHelper.publishSensorModulation(false);
|
||||
@@ -421,6 +429,11 @@ protected:
|
||||
haHelper.publishNumberIndoorTemp();
|
||||
//haHelper.publishNumberOutdoorTemp();
|
||||
haHelper.publishSensorHeatingTemp();
|
||||
|
||||
// buttons
|
||||
haHelper.publishButtonRestart(false);
|
||||
haHelper.publishButtonFaultReset();
|
||||
haHelper.publishButtonDiagnosticReset();
|
||||
}
|
||||
|
||||
static bool publishNonStaticHaEntities(bool force = false) {
|
||||
@@ -556,9 +569,6 @@ protected:
|
||||
doc["sensors"]["indoor"]["offset"] = settings.sensors.indoor.offset;
|
||||
|
||||
client.beginPublish(topic, measureJson(doc), false);
|
||||
//BufferingPrint bufferedClient(client, 32);
|
||||
//serializeJson(doc, bufferedClient);
|
||||
//bufferedClient.flush();
|
||||
serializeJson(doc, client);
|
||||
return client.endPublish();
|
||||
}
|
||||
@@ -577,6 +587,7 @@ protected:
|
||||
doc["states"]["diagnostic"] = vars.states.diagnostic;
|
||||
doc["states"]["faultCode"] = vars.states.faultCode;
|
||||
doc["states"]["rssi"] = vars.states.rssi;
|
||||
doc["states"]["uptime"] = (unsigned long) (millis() / 1000);
|
||||
|
||||
doc["sensors"]["modulation"] = vars.sensors.modulation;
|
||||
doc["sensors"]["pressure"] = vars.sensors.pressure;
|
||||
@@ -594,9 +605,6 @@ protected:
|
||||
doc["parameters"]["dhwMaxTemp"] = vars.parameters.dhwMaxTemp;
|
||||
|
||||
client.beginPublish(topic, measureJson(doc), false);
|
||||
//BufferingPrint bufferedClient(client, 32);
|
||||
//serializeJson(doc, bufferedClient);
|
||||
//bufferedClient.flush();
|
||||
serializeJson(doc, client);
|
||||
return client.endPublish();
|
||||
}
|
||||
@@ -611,11 +619,17 @@ protected:
|
||||
}
|
||||
|
||||
if (settings.debug) {
|
||||
DEBUG_F("MQTT received message\n\r Topic: %s\n\r Data: ", topic);
|
||||
String payloadStr;
|
||||
payloadStr.reserve(length);
|
||||
for (unsigned int i = 0; i < length; i++) {
|
||||
DEBUG_STREAM.print((char)payload[i]);
|
||||
if ( payload[i] == 10 ) {
|
||||
payloadStr += "\r\n> ";
|
||||
} else {
|
||||
payloadStr += (char) payload[i];
|
||||
}
|
||||
}
|
||||
DEBUG_STREAM.print("\n");
|
||||
|
||||
Log.strace("MQTT.MSG", "Topic: %s\r\n> %s\n\r\n", topic, payloadStr.c_str());
|
||||
}
|
||||
|
||||
StaticJsonDocument<2048> doc;
|
||||
|
||||
@@ -40,11 +40,11 @@ protected:
|
||||
unsigned long localResponse;
|
||||
|
||||
if (setMasterMemberIdCode()) {
|
||||
DEBUG_F("Slave member id code: %u\r\n", vars.parameters.slaveMemberIdCode);
|
||||
DEBUG_F("Master member id code: %u\r\n", settings.opentherm.memberIdCode > 0 ? settings.opentherm.memberIdCode : vars.parameters.slaveMemberIdCode);
|
||||
Log.straceln("OT", "Slave member id code: %u", vars.parameters.slaveMemberIdCode);
|
||||
Log.straceln("OT", "Master member id code: %u", settings.opentherm.memberIdCode > 0 ? settings.opentherm.memberIdCode : vars.parameters.slaveMemberIdCode);
|
||||
|
||||
} else {
|
||||
WARN("Slave member id failed");
|
||||
Log.swarningln("OT", "Slave member id failed");
|
||||
}
|
||||
|
||||
bool heatingEnabled = (vars.states.emergency || settings.heating.enable) && pump && isReady();
|
||||
@@ -64,13 +64,13 @@ protected:
|
||||
);
|
||||
|
||||
if (!ot->isValidResponse(localResponse)) {
|
||||
WARN_F("Invalid response after setBoilerStatus: %s\r\n", ot->statusToString(ot->getLastResponseStatus()));
|
||||
Log.swarningln("OT", "Invalid response after setBoilerStatus: %s", ot->statusToString(ot->getLastResponseStatus()));
|
||||
return;
|
||||
}
|
||||
|
||||
if (vars.parameters.heatingEnabled != heatingEnabled) {
|
||||
vars.parameters.heatingEnabled = heatingEnabled;
|
||||
INFO_F("Heating enabled: %s\r\n", heatingEnabled ? "on\0" : "off\0");
|
||||
Log.sinfoln("OT.HEATING", "%s", heatingEnabled ? "Enabled" : "Disabled");
|
||||
}
|
||||
|
||||
vars.states.heating = ot->isCentralHeatingActive(localResponse);
|
||||
@@ -87,29 +87,35 @@ protected:
|
||||
updateSlaveParameters();
|
||||
updateMasterParameters();
|
||||
|
||||
DEBUG_F("Master type: %u, version: %u\r\n", vars.parameters.masterType, vars.parameters.masterVersion);
|
||||
DEBUG_F("Slave type: %u, version: %u\r\n", vars.parameters.slaveType, vars.parameters.slaveVersion);
|
||||
Log.straceln("OT", "Master type: %u, version: %u", vars.parameters.masterType, vars.parameters.masterVersion);
|
||||
Log.straceln("OT", "Slave type: %u, version: %u", vars.parameters.slaveType, vars.parameters.slaveVersion);
|
||||
|
||||
if (settings.opentherm.dhwPresent) {
|
||||
if (updateMinMaxDhwTemp()) {
|
||||
if (settings.dhw.minTemp < vars.parameters.dhwMinTemp || settings.dhw.maxTemp > vars.parameters.dhwMaxTemp) {
|
||||
if (settings.dhw.minTemp < vars.parameters.dhwMinTemp) {
|
||||
settings.dhw.minTemp = vars.parameters.dhwMinTemp;
|
||||
}
|
||||
|
||||
if (settings.dhw.maxTemp > vars.parameters.dhwMaxTemp) {
|
||||
settings.dhw.maxTemp = vars.parameters.dhwMaxTemp;
|
||||
}
|
||||
|
||||
} else {
|
||||
WARN("Failed get min/max DHW temp");
|
||||
Log.swarningln("OT.DHW", "Failed get min/max temp");
|
||||
}
|
||||
}
|
||||
|
||||
if (updateMinMaxHeatingTemp()) {
|
||||
if (settings.heating.minTemp < vars.parameters.heatingMinTemp || settings.heating.maxTemp > vars.parameters.heatingMaxTemp) {
|
||||
if (settings.heating.minTemp < vars.parameters.heatingMinTemp) {
|
||||
settings.heating.minTemp = vars.parameters.heatingMinTemp;
|
||||
settings.heating.maxTemp = vars.parameters.heatingMaxTemp;
|
||||
|
||||
} else {
|
||||
WARN("Failed get min/max heating temp");
|
||||
}
|
||||
|
||||
if (settings.heating.maxTemp > vars.parameters.heatingMaxTemp) {
|
||||
settings.heating.maxTemp = vars.parameters.heatingMaxTemp;
|
||||
}
|
||||
|
||||
} else {
|
||||
Log.swarningln("OT.HEATING", "Failed get min/max temp");
|
||||
}
|
||||
|
||||
// force
|
||||
@@ -121,11 +127,6 @@ protected:
|
||||
|
||||
if (vars.states.fault) {
|
||||
updateFaultCode();
|
||||
ot->sendBoilerReset();
|
||||
}
|
||||
|
||||
if (vars.states.diagnostic) {
|
||||
ot->sendServiceReset();
|
||||
}
|
||||
|
||||
prevUpdateNonEssentialVars = millis();
|
||||
@@ -150,6 +151,36 @@ protected:
|
||||
updateHeatingTemp();
|
||||
yield();
|
||||
|
||||
// fault reset action
|
||||
if (vars.actions.faultReset) {
|
||||
if (vars.states.fault) {
|
||||
if (ot->sendBoilerReset()) {
|
||||
Log.sinfoln("OT", "Boiler fault reset successfully");
|
||||
|
||||
} else {
|
||||
Log.serrorln("OT", "Boiler fault reset failed");
|
||||
}
|
||||
}
|
||||
|
||||
vars.actions.faultReset = false;
|
||||
yield();
|
||||
}
|
||||
|
||||
// diag reset action
|
||||
if (vars.actions.diagnosticReset) {
|
||||
if (vars.states.diagnostic) {
|
||||
if (ot->sendServiceReset()) {
|
||||
Log.sinfoln("OT", "Boiler diagnostic reset successfully");
|
||||
|
||||
} else {
|
||||
Log.serrorln("OT", "Boiler diagnostic reset failed");
|
||||
}
|
||||
}
|
||||
|
||||
vars.actions.diagnosticReset = false;
|
||||
yield();
|
||||
}
|
||||
|
||||
//
|
||||
// Температура ГВС
|
||||
byte newDHWTemp = settings.dhw.target;
|
||||
@@ -158,7 +189,7 @@ protected:
|
||||
newDHWTemp = constrain(newDHWTemp, settings.dhw.minTemp, settings.dhw.maxTemp);
|
||||
}
|
||||
|
||||
INFO_F("Set DHW temp = %u\r\n", newDHWTemp);
|
||||
Log.sinfoln("OT.DHW", "Set temp = %u", newDHWTemp);
|
||||
|
||||
// Записываем заданную температуру ГВС
|
||||
if (ot->setDHWSetpoint(newDHWTemp)) {
|
||||
@@ -166,14 +197,14 @@ protected:
|
||||
dhwSetTempTime = millis();
|
||||
|
||||
} else {
|
||||
WARN("Failed set DHW temp");
|
||||
Log.swarningln("OT.DHW", "Failed set temp");
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Температура отопления
|
||||
if (heatingEnabled && (needSetHeatingTemp() || fabs(vars.parameters.heatingSetpoint - currentHeatingTemp) > 0.0001)) {
|
||||
INFO_F("Setting heating temp = %u \n", vars.parameters.heatingSetpoint);
|
||||
Log.sinfoln("OT.HEATING", "Set temp = %u", vars.parameters.heatingSetpoint);
|
||||
|
||||
// Записываем заданную температуру
|
||||
if (ot->setBoilerTemperature(vars.parameters.heatingSetpoint)) {
|
||||
@@ -181,12 +212,12 @@ protected:
|
||||
heatingSetTempTime = millis();
|
||||
|
||||
} else {
|
||||
WARN("Failed set heating temp");
|
||||
Log.swarningln("OT.HEATING", "Failed set temp");
|
||||
}
|
||||
|
||||
if (settings.opentherm.heatingCh1ToCh2) {
|
||||
if (!ot->setBoilerTemperature2(vars.parameters.heatingSetpoint)) {
|
||||
WARN("Failed set ch2 heating temp");
|
||||
Log.swarningln("OT.HEATING", "Failed set ch2 temp");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -268,13 +299,7 @@ protected:
|
||||
}
|
||||
|
||||
void static printRequestDetail(OpenThermMessageID id, OpenThermResponseStatus status, unsigned long request, unsigned long response, byte attempt) {
|
||||
sprintf(buffer, "OT REQUEST ID: %4d Request: %8lx Response: %8lx Attempt: %2d Status: %s", id, request, response, attempt, ot->statusToString(status));
|
||||
if (status != OpenThermResponseStatus::SUCCESS) {
|
||||
//WARN(buffer);
|
||||
DEBUG(buffer);
|
||||
} else {
|
||||
DEBUG(buffer);
|
||||
}
|
||||
Log.straceln("OT", "OT REQUEST ID: %4d Request: %8lx Response: %8lx Attempt: %2d Status: %s", id, request, response, attempt, ot->statusToString(status));
|
||||
}
|
||||
|
||||
bool setMasterMemberIdCode() {
|
||||
@@ -293,7 +318,8 @@ protected:
|
||||
vars.parameters.slaveMemberIdCode = response & 0xFF;
|
||||
|
||||
/*uint8_t flags = (response & 0xFFFF) >> 8;
|
||||
DEBUG_F(
|
||||
Log.strace(
|
||||
"OT",
|
||||
"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",
|
||||
flags & 0x01,
|
||||
flags & 0x02,
|
||||
@@ -331,13 +357,11 @@ protected:
|
||||
if (!ot->isValidResponse(response)) {
|
||||
return false;
|
||||
}
|
||||
// INFO_F("Opentherm version slave: %f\n", ot->getFloat(response));
|
||||
|
||||
response = ot->sendRequest(ot->buildRequest(OpenThermRequestType::WRITE_DATA, OpenThermMessageID::OpenThermVersionMaster, response));
|
||||
if (!ot->isValidResponse(response)) {
|
||||
return false;
|
||||
}
|
||||
// INFO_F("Opentherm version master: %f\n", ot->getFloat(response));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ protected:
|
||||
if (settings.heating.turbo) {
|
||||
settings.heating.turbo = false;
|
||||
|
||||
INFO("[REGULATOR] Turbo mode auto disabled");
|
||||
Log.sinfoln("REGULATOR", "Turbo mode auto disabled");
|
||||
}
|
||||
|
||||
newTemp = getEmergencyModeTemp();
|
||||
@@ -43,7 +43,7 @@ protected:
|
||||
if (settings.heating.turbo) {
|
||||
settings.heating.turbo = false;
|
||||
|
||||
INFO("[REGULATOR] Turbo mode auto disabled");
|
||||
Log.sinfoln("REGULATOR", "Turbo mode auto disabled");
|
||||
}
|
||||
|
||||
newTemp = getTuningModeTemp();
|
||||
@@ -57,7 +57,7 @@ protected:
|
||||
if (settings.heating.turbo && (fabs(settings.heating.target - vars.temperatures.indoor) < 1 || (settings.equitherm.enable && settings.pid.enable))) {
|
||||
settings.heating.turbo = false;
|
||||
|
||||
INFO("[REGULATOR] Turbo mode auto disabled");
|
||||
Log.sinfoln("REGULATOR", "Turbo mode auto disabled");
|
||||
}
|
||||
|
||||
newTemp = getNormalModeTemp();
|
||||
@@ -86,7 +86,7 @@ protected:
|
||||
prevEtResult = etResult;
|
||||
newTemp += etResult;
|
||||
|
||||
INFO_F("[REGULATOR][EQUITHERM] New emergency result: %u (%f) \n", (int)round(etResult), etResult);
|
||||
Log.sinfoln("REGULATOR.EQUITHERM", "New emergency result: %u (%f)", (int)round(etResult), etResult);
|
||||
|
||||
} else {
|
||||
newTemp += prevEtResult;
|
||||
@@ -105,11 +105,11 @@ protected:
|
||||
|
||||
if (fabs(prevHeatingTarget - settings.heating.target) > 0.0001) {
|
||||
prevHeatingTarget = settings.heating.target;
|
||||
INFO_F("[REGULATOR] New target: %f \n", settings.heating.target);
|
||||
Log.sinfoln("REGULATOR", "New target: %f", settings.heating.target);
|
||||
|
||||
if (settings.equitherm.enable && settings.pid.enable) {
|
||||
pidRegulator.integral = 0;
|
||||
INFO_F("[REGULATOR][PID] Integral sum has been reset");
|
||||
Log.sinfoln("REGULATOR.PID", "Integral sum has been reset");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -121,7 +121,7 @@ protected:
|
||||
prevEtResult = etResult;
|
||||
newTemp += etResult;
|
||||
|
||||
INFO_F("[REGULATOR][EQUITHERM] New result: %u (%f) \n", (int)round(etResult), etResult);
|
||||
Log.sinfoln("REGULATOR.EQUITHERM", "New result: %u (%f)", (int)round(etResult), etResult);
|
||||
|
||||
} else {
|
||||
newTemp += prevEtResult;
|
||||
@@ -139,7 +139,7 @@ protected:
|
||||
prevPidResult = pidResult;
|
||||
newTemp += pidResult;
|
||||
|
||||
INFO_F("[REGULATOR][PID] New result: %d (%f) \n", (int)round(pidResult), pidResult);
|
||||
Log.sinfoln("REGULATOR.PID", "New result: %d (%f)", (int)round(pidResult), pidResult);
|
||||
|
||||
} else {
|
||||
newTemp += prevPidResult;
|
||||
@@ -168,7 +168,7 @@ protected:
|
||||
tunerInit = false;
|
||||
tunerRegulator = 0;
|
||||
tunerState = 0;
|
||||
INFO(F("[REGULATOR][TUNING] Stopped"));
|
||||
Log.sinfoln("REGULATOR.TUNING", "Stopped");
|
||||
}
|
||||
|
||||
if (!vars.tuning.enable) {
|
||||
@@ -178,7 +178,7 @@ protected:
|
||||
|
||||
if (vars.tuning.regulator == 0) {
|
||||
// @TODO дописать
|
||||
INFO(F("[REGULATOR][TUNING][EQUITHERM] Not implemented"));
|
||||
Log.sinfoln("REGULATOR.TUNING.EQUITHERM", "Not implemented");
|
||||
return 0;
|
||||
|
||||
} else if (vars.tuning.regulator == 1) {
|
||||
@@ -188,8 +188,10 @@ protected:
|
||||
: settings.heating.target;
|
||||
|
||||
if (tunerInit && pidTuner.getState() == 3) {
|
||||
INFO(F("[REGULATOR][TUNING][PID] Finished"));
|
||||
pidTuner.debugText(&INFO_STREAM);
|
||||
Log.sinfoln("REGULATOR.TUNING.PID", "Finished");
|
||||
for (Stream* stream : Log.getStreams()) {
|
||||
pidTuner.debugText(stream);
|
||||
}
|
||||
|
||||
pidTuner.reset();
|
||||
tunerInit = false;
|
||||
@@ -197,7 +199,7 @@ protected:
|
||||
tunerState = 0;
|
||||
|
||||
if (pidTuner.getAccuracy() < 90) {
|
||||
WARN(F("[REGULATOR][TUNING][PID] Bad result, try again..."));
|
||||
Log.swarningln("REGULATOR.TUNING.PID", "Bad result, try again...");
|
||||
|
||||
} else {
|
||||
settings.pid.p_factor = pidTuner.getPID_p();
|
||||
@@ -209,7 +211,7 @@ protected:
|
||||
}
|
||||
|
||||
if (!tunerInit) {
|
||||
INFO(F("[REGULATOR][TUNING][PID] Start..."));
|
||||
Log.sinfoln("REGULATOR.TUNING.PID", "Start...");
|
||||
|
||||
float step;
|
||||
if (vars.temperatures.indoor - vars.temperatures.outdoor > 10) {
|
||||
@@ -219,7 +221,7 @@ protected:
|
||||
}
|
||||
|
||||
float startTemp = step;
|
||||
INFO_F("[REGULATOR][TUNING][PID] Started. Start value: %f, step: %f \n", startTemp, step);
|
||||
Log.sinfoln("REGULATOR.TUNING.PID", "Started. Start value: %f, step: %f", startTemp, step);
|
||||
pidTuner.setParameters(NORMAL, startTemp, step, 20 * 60 * 1000, 0.15, 60 * 1000, 10000);
|
||||
tunerInit = true;
|
||||
tunerRegulator = 1;
|
||||
@@ -229,8 +231,11 @@ protected:
|
||||
pidTuner.compute();
|
||||
|
||||
if (tunerState > 0 && pidTuner.getState() != tunerState) {
|
||||
INFO(F("[REGULATOR][TUNING][PID] Log:"));
|
||||
pidTuner.debugText(&INFO_STREAM);
|
||||
Log.sinfoln("REGULATOR.TUNING.PID", "Log:");
|
||||
for (Stream* stream : Log.getStreams()) {
|
||||
pidTuner.debugText(stream);
|
||||
}
|
||||
|
||||
tunerState = pidTuner.getState();
|
||||
}
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ protected:
|
||||
outdoorSensor->requestTemperatures();
|
||||
startConversionTime = millis();
|
||||
|
||||
ERROR("[SENSORS][OUTDOOR] Could not read temperature data (no response)");
|
||||
Log.serrorln("SENSORS.OUTDOOR", "Could not read temperature data (no response)");
|
||||
}
|
||||
|
||||
if (!completed) {
|
||||
@@ -68,10 +68,10 @@ protected:
|
||||
|
||||
float rawTemp = outdoorSensor->getTempCByIndex(0);
|
||||
if (rawTemp == DEVICE_DISCONNECTED_C) {
|
||||
ERROR("[SENSORS][OUTDOOR] Could not read temperature data (not connected)");
|
||||
Log.serrorln("SENSORS.OUTDOOR", "Could not read temperature data (not connected)");
|
||||
|
||||
} else {
|
||||
DEBUG_F("[SENSORS][OUTDOOR] Raw temp: %f \n", rawTemp);
|
||||
Log.straceln("SENSORS.OUTDOOR", "Raw temp: %f", rawTemp);
|
||||
|
||||
if (emptyOutdoorTemp) {
|
||||
filteredOutdoorTemp = rawTemp;
|
||||
@@ -85,7 +85,7 @@ protected:
|
||||
|
||||
if (fabs(vars.temperatures.outdoor - filteredOutdoorTemp) > 0.099) {
|
||||
vars.temperatures.outdoor = filteredOutdoorTemp + settings.sensors.outdoor.offset;
|
||||
INFO_F("[SENSORS][OUTDOOR] New temp: %f \n", filteredOutdoorTemp);
|
||||
Log.sinfoln("SENSORS.OUTDOOR", "New temp: %f", filteredOutdoorTemp);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,8 +115,8 @@ protected:
|
||||
// fail, retry
|
||||
indoorSensor->requestTemperatures();
|
||||
startConversionTime = millis();
|
||||
|
||||
ERROR("[SENSORS][INDOOR] Could not read temperature data (no response)");
|
||||
|
||||
Log.serrorln("SENSORS.INDOOR", "Could not read temperature data (no response)");
|
||||
}
|
||||
|
||||
if (!completed) {
|
||||
@@ -125,10 +125,10 @@ protected:
|
||||
|
||||
float rawTemp = indoorSensor->getTempCByIndex(0);
|
||||
if (rawTemp == DEVICE_DISCONNECTED_C) {
|
||||
ERROR("[SENSORS][INDOOR] Could not read temperature data (not connected)");
|
||||
Log.serrorln("SENSORS.INDOOR", "Could not read temperature data (not connected)");
|
||||
|
||||
} else {
|
||||
DEBUG_F("[SENSORS][INDOOR] Raw temp: %f \n", rawTemp);
|
||||
Log.straceln("SENSORS.INDOOR", "Raw temp: %f", rawTemp);
|
||||
|
||||
if (emptyIndoorTemp) {
|
||||
filteredIndoorTemp = rawTemp;
|
||||
@@ -142,7 +142,7 @@ protected:
|
||||
|
||||
if (fabs(vars.temperatures.indoor - filteredIndoorTemp) > 0.099) {
|
||||
vars.temperatures.indoor = filteredIndoorTemp + settings.sensors.indoor.offset;
|
||||
INFO_F("[SENSORS][INDOOR] New temp: %f \n", filteredIndoorTemp);
|
||||
Log.sinfoln("SENSORS.INDOOR", "New temp: %f", filteredIndoorTemp);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -109,8 +109,6 @@ struct Variables {
|
||||
} temperatures;
|
||||
|
||||
struct {
|
||||
unsigned long restartSignalTime = 0;
|
||||
unsigned int restartAfterTime = 0;
|
||||
bool heatingEnabled = false;
|
||||
byte heatingMinTemp = 20;
|
||||
byte heatingMaxTemp = 90;
|
||||
@@ -123,4 +121,10 @@ struct Variables {
|
||||
uint8_t masterType;
|
||||
uint8_t masterVersion;
|
||||
} parameters;
|
||||
|
||||
struct {
|
||||
bool restart = false;
|
||||
bool faultReset = false;
|
||||
bool diagnosticReset = false;
|
||||
} actions;
|
||||
} vars;
|
||||
@@ -48,12 +48,12 @@ protected:
|
||||
#endif
|
||||
|
||||
wm.setDebugOutput(settings.debug, (wm_debuglevel_t) WM_DEBUG_MODE);
|
||||
wm.setTitle("OpenTherm Gateway");
|
||||
wm.setTitle(PROJECT_NAME);
|
||||
wm.setCustomMenuHTML(PSTR(
|
||||
"<style>.wrap h1 {display: none;} .wrap h3 {display: none;} .nh {margin: 0 0 1em 0;} .nh .logo {font-size: 1.8em; margin: 0.5em; text-align: center;} .nh .links {text-align: center;}</style>"
|
||||
"<div class=\"nh\">"
|
||||
"<div class=\"logo\">OpenTherm Gateway</div>"
|
||||
"<div class=\"links\"><a href=\"" OT_GATEWAY_REPO "\" target=\"_blank\">Repo</a> | <a href=\"" OT_GATEWAY_REPO "/issues\" target=\"_blank\">Issues</a> | <a href=\"" OT_GATEWAY_REPO "/releases\" target=\"_blank\">Releases</a> | <small>v" OT_GATEWAY_VERSION " (" __DATE__ ")</small></div>"
|
||||
"<div class=\"logo\">" PROJECT_NAME "</div>"
|
||||
"<div class=\"links\"><a href=\"" PROJECT_REPO "\" target=\"_blank\">Repo</a> | <a href=\"" PROJECT_REPO "/issues\" target=\"_blank\">Issues</a> | <a href=\"" PROJECT_REPO "/releases\" target=\"_blank\">Releases</a> | <small>v" PROJECT_VERSION " (" __DATE__ ")</small></div>"
|
||||
"</div>"
|
||||
));
|
||||
|
||||
@@ -146,7 +146,7 @@ protected:
|
||||
TelnetStream.stop();
|
||||
#endif
|
||||
|
||||
INFO("[wifi] Disconnected");
|
||||
Log.sinfoln("WIFI", "Disconnected");
|
||||
|
||||
} else if (!connected && WiFi.status() == WL_CONNECTED) {
|
||||
connected = true;
|
||||
@@ -166,7 +166,7 @@ protected:
|
||||
TelnetStream.begin();
|
||||
#endif
|
||||
|
||||
INFO_F("[wifi] Connected. IP address: %s, RSSI: %d\n", WiFi.localIP().toString().c_str(), WiFi.RSSI());
|
||||
Log.sinfoln("WIFI", "Connected. IP: %s, RSSI: %d", WiFi.localIP().toString().c_str(), WiFi.RSSI());
|
||||
}
|
||||
|
||||
#if defined(ESP8266)
|
||||
@@ -273,11 +273,11 @@ protected:
|
||||
}
|
||||
|
||||
if (needRestart) {
|
||||
vars.parameters.restartAfterTime = 5000;
|
||||
vars.parameters.restartSignalTime = millis();
|
||||
vars.actions.restart = true;
|
||||
}
|
||||
|
||||
INFO_F(
|
||||
Log.sinfo(
|
||||
"WIFI",
|
||||
"New settings:\r\n"
|
||||
" Hostname: %s\r\n"
|
||||
" Mqtt server: %s:%d\r\n"
|
||||
@@ -313,7 +313,6 @@ protected:
|
||||
);
|
||||
|
||||
eeSettings.updateNow();
|
||||
INFO(F("Settings saved"));
|
||||
}
|
||||
|
||||
static void arpGratuitous() {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#define OT_GATEWAY_VERSION "1.3.4"
|
||||
#define OT_GATEWAY_REPO "https://github.com/Laxilef/OTGateway"
|
||||
#define PROJECT_NAME "OpenTherm Gateway"
|
||||
#define PROJECT_VERSION "1.3.4"
|
||||
#define PROJECT_REPO "https://github.com/Laxilef/OTGateway"
|
||||
#define AP_SSID "OpenTherm Gateway"
|
||||
#define AP_PASSWORD "otgateway123456"
|
||||
|
||||
@@ -44,26 +45,4 @@
|
||||
#define SENSOR_INDOOR_PIN_DEFAULT 0
|
||||
#endif
|
||||
|
||||
#if USE_TELNET
|
||||
#define INFO_STREAM TelnetStream
|
||||
#define WARN_STREAM TelnetStream
|
||||
#define ERROR_STREAM TelnetStream
|
||||
#define DEBUG_STREAM if (settings.debug) TelnetStream
|
||||
#define WM_DEBUG_PORT TelnetStream
|
||||
#else
|
||||
#define INFO_STREAM Serial
|
||||
#define WARN_STREAM Serial
|
||||
#define ERROR_STREAM Serial
|
||||
#define DEBUG_STREAM if (settings.debug) Serial
|
||||
#define WM_DEBUG_PORT Serial
|
||||
#endif
|
||||
|
||||
#define INFO(...) INFO_STREAM.print("\r[INFO] "); INFO_STREAM.println(__VA_ARGS__);
|
||||
#define INFO_F(...) INFO_STREAM.print("\r[INFO] "); INFO_STREAM.printf(__VA_ARGS__);
|
||||
#define WARN(...) WARN_STREAM.print("\r[WARN] "); WARN_STREAM.println(__VA_ARGS__);
|
||||
#define WARN_F(...) WARN_STREAM.print("\r[WARN] "); WARN_STREAM.printf(__VA_ARGS__);
|
||||
#define ERROR(...) ERROR_STREAM.print("\r[ERROR] "); ERROR_STREAM.println(__VA_ARGS__);
|
||||
#define DEBUG(...) DEBUG_STREAM.print("\r[DEBUG] "); DEBUG_STREAM.println(__VA_ARGS__);
|
||||
#define DEBUG_F(...) DEBUG_STREAM.print("\r[DEBUG] "); DEBUG_STREAM.printf(__VA_ARGS__);
|
||||
|
||||
char buffer[255];
|
||||
23
src/main.cpp
23
src/main.cpp
@@ -3,6 +3,7 @@
|
||||
#include <ArduinoJson.h>
|
||||
#include <TelnetStream.h>
|
||||
#include <EEManager.h>
|
||||
#include <TinyLogger.h>
|
||||
#include "Settings.h"
|
||||
|
||||
EEManager eeSettings(settings, 30000);
|
||||
@@ -36,30 +37,38 @@ MainTask* tMain;
|
||||
|
||||
|
||||
void setup() {
|
||||
#if !USE_TELNET
|
||||
Serial.begin(115200);
|
||||
Serial.println("\n\n");
|
||||
#if USE_TELNET
|
||||
TelnetStream.begin();
|
||||
Log.begin(&TelnetStream, TinyLogger::Level::VERBOSE);
|
||||
delay(1000);
|
||||
#else
|
||||
Serial.begin(115200);
|
||||
Log.begin(&Serial, TinyLogger::Level::VERBOSE);
|
||||
Serial.println("\n\n");
|
||||
#endif
|
||||
//Log.setNtpClient(&timeClient);
|
||||
|
||||
EEPROM.begin(eeSettings.blockSize());
|
||||
uint8_t eeSettingsResult = eeSettings.begin(0, 's');
|
||||
if (eeSettingsResult == 0) {
|
||||
INFO("Settings loaded");
|
||||
Log.sinfoln("MAIN", "Settings loaded");
|
||||
|
||||
if (strcmp(SETTINGS_VALID_VALUE, settings.validationValue) != 0) {
|
||||
INFO("Settings not valid, reset and restart...");
|
||||
Log.swarningln("MAIN", "Settings not valid, reset and restart...");
|
||||
eeSettings.reset();
|
||||
delay(1000);
|
||||
ESP.restart();
|
||||
}
|
||||
|
||||
} else if (eeSettingsResult == 1) {
|
||||
INFO("Settings NOT loaded, first start");
|
||||
Log.sinfoln("MAIN", "Settings NOT loaded, first start");
|
||||
|
||||
} else if (eeSettingsResult == 2) {
|
||||
INFO("Settings NOT loaded (error)");
|
||||
Log.serrorln("MAIN", "Settings NOT loaded (error)");
|
||||
}
|
||||
|
||||
Log.setLevel(settings.debug ? TinyLogger::Level::VERBOSE : TinyLogger::Level::INFO);
|
||||
|
||||
tWm = new WifiManagerTask(true);
|
||||
Scheduler.start(tWm);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user