diff --git a/src/OpenThermTask.h b/src/OpenThermTask.h index 7005acd..7a676a8 100644 --- a/src/OpenThermTask.h +++ b/src/OpenThermTask.h @@ -185,10 +185,14 @@ protected: } else if (vars.states.otStatus && millis() - this->lastSuccessResponse > 1150) { Log.swarningln(FPSTR(L_OT), F("Disconnected")); - if (settings.sensors.outdoor.type == SensorType::BOILER) { + if (settings.sensors.outdoor.type == SensorType::BOILER_OUTDOOR) { vars.sensors.outdoor.connected = false; } + if (settings.sensors.indoor.type == SensorType::BOILER_RETURN) { + vars.sensors.indoor.connected = false; + } + vars.states.otStatus = false; this->isInitialized = false; } @@ -396,7 +400,7 @@ protected: // update these parameters once a minute if (!settings.opentherm.filterNumValues.enable) { // Get outdoor temp (if necessary) - if (settings.sensors.outdoor.type == SensorType::BOILER) { + if (settings.sensors.outdoor.type == SensorType::BOILER_OUTDOOR) { if (this->updateOutdoorTemp()) { if (!vars.sensors.outdoor.connected) { vars.sensors.outdoor.connected = true; @@ -486,9 +490,21 @@ protected: // Get heating return temp if (this->updateHeatingReturnTemp()) { + if (settings.sensors.indoor.type == SensorType::BOILER_RETURN) { + vars.temperatures.indoor = settings.sensors.outdoor.offset + vars.temperatures.heatingReturn; + + if (!vars.sensors.outdoor.connected) { + vars.sensors.indoor.connected = true; + } + } + Log.snoticeln(FPSTR(L_OT_HEATING), F("Received return temp: %.2f"), vars.temperatures.heatingReturn); } else { + if (settings.sensors.indoor.type == SensorType::BOILER_RETURN && vars.sensors.outdoor.connected) { + vars.sensors.indoor.connected = false; + } + Log.swarningln(FPSTR(L_OT_HEATING), F("Failed receive return temp")); } @@ -504,7 +520,7 @@ protected: // must be updated every time. if (settings.opentherm.filterNumValues.enable) { // Get outdoor temp (if necessary) - if (settings.sensors.outdoor.type == SensorType::BOILER) { + if (settings.sensors.outdoor.type == SensorType::BOILER_OUTDOOR) { if (this->updateOutdoorTemp()) { if (!vars.sensors.outdoor.connected) { vars.sensors.outdoor.connected = true; diff --git a/src/Settings.h b/src/Settings.h index 4d9a37f..7cf5650 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -126,7 +126,7 @@ struct Settings { struct { struct { - SensorType type = SensorType::BOILER; + SensorType type = SensorType::BOILER_OUTDOOR; byte gpio = DEFAULT_SENSOR_OUTDOOR_GPIO; uint8_t bleAddress[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; float offset = 0.0f; diff --git a/src/defines.h b/src/defines.h index b4a69a0..599e509 100644 --- a/src/defines.h +++ b/src/defines.h @@ -147,10 +147,11 @@ #define GPIO_IS_VALID(gpioNum) (gpioNum != GPIO_IS_NOT_CONFIGURED && GPIO_IS_VALID_GPIO(gpioNum)) enum class SensorType : byte { - BOILER, - MANUAL, - DS18B20, - BLUETOOTH + BOILER_OUTDOOR = 0, + BOILER_RETURN = 4, + MANUAL = 1, + DS18B20 = 2, + BLUETOOTH = 3 }; enum class UnitSystem : byte { diff --git a/src/utils.h b/src/utils.h index 9c63536..092139b 100644 --- a/src/utils.h +++ b/src/utils.h @@ -1178,9 +1178,9 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false byte value = src["sensors"]["outdoor"]["type"].as(); switch (value) { - case static_cast(SensorType::BOILER): - if (dst.sensors.outdoor.type != SensorType::BOILER) { - dst.sensors.outdoor.type = SensorType::BOILER; + case static_cast(SensorType::BOILER_OUTDOOR): + if (dst.sensors.outdoor.type != SensorType::BOILER_OUTDOOR) { + dst.sensors.outdoor.type = SensorType::BOILER_OUTDOOR; changed = true; } break; @@ -1248,7 +1248,7 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false if (!src["sensors"]["outdoor"]["offset"].isNull()) { float value = src["sensors"]["outdoor"]["offset"].as(); - if (value >= -10 && value <= 10 && fabs(value - dst.sensors.outdoor.offset) > 0.0001f) { + if (value >= -20.0f && value <= 20.0f && fabs(value - dst.sensors.outdoor.offset) > 0.0001f) { dst.sensors.outdoor.offset = roundd(value, 2); changed = true; } @@ -1258,6 +1258,13 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false byte value = src["sensors"]["indoor"]["type"].as(); switch (value) { + case static_cast(SensorType::BOILER_RETURN): + if (dst.sensors.indoor.type != SensorType::BOILER_RETURN) { + dst.sensors.indoor.type = SensorType::BOILER_RETURN; + changed = true; + } + break; + case static_cast(SensorType::MANUAL): if (dst.sensors.indoor.type != SensorType::MANUAL) { dst.sensors.indoor.type = SensorType::MANUAL; @@ -1321,7 +1328,7 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false if (!src["sensors"]["indoor"]["offset"].isNull()) { float value = src["sensors"]["indoor"]["offset"].as(); - if (value >= -10 && value <= 10 && fabs(value - dst.sensors.indoor.offset) > 0.0001f) { + if (value >= -20.0f && value <= 20.0f && fabs(value - dst.sensors.indoor.offset) > 0.0001f) { dst.sensors.indoor.offset = roundd(value, 2); changed = true; } diff --git a/src_data/locales/en.json b/src_data/locales/en.json index 988f1c9..f7b48d6 100644 --- a/src_data/locales/en.json +++ b/src_data/locales/en.json @@ -318,7 +318,8 @@ "tempSensor": { "source": { "type": "Source type", - "boiler": "From boiler via OpenTherm", + "boilerOutdoor": "From boiler via OpenTherm", + "boilerReturn": "Return heat carrier temp via OpenTherm", "manual": "Manual via MQTT/API", "ext": "External (DS18B20)", "ble": "BLE device" diff --git a/src_data/locales/ru.json b/src_data/locales/ru.json index 4c34f21..174f8b6 100644 --- a/src_data/locales/ru.json +++ b/src_data/locales/ru.json @@ -332,7 +332,8 @@ "tempSensor": { "source": { "type": "Источник данных", - "boiler": "От котла через OpenTherm", + "boilerOutdoor": "От котла через OpenTherm", + "boilerReturn": "Температура обратки через OpenTherm", "manual": "Вручную через MQTT/API", "ext": "Внешний датчик (DS18B20)", "ble": "BLE устройство" diff --git a/src_data/pages/settings.html b/src_data/pages/settings.html index 9778efc..ca36dfe 100644 --- a/src_data/pages/settings.html +++ b/src_data/pages/settings.html @@ -566,7 +566,7 @@