feat: ability to use return heat carrier temp as indoor temp

This commit is contained in:
Yurii
2024-11-01 04:16:50 +03:00
parent 0e3473e065
commit 467cfea449
7 changed files with 49 additions and 18 deletions

View File

@@ -185,10 +185,14 @@ protected:
} else if (vars.states.otStatus && millis() - this->lastSuccessResponse > 1150) { } else if (vars.states.otStatus && millis() - this->lastSuccessResponse > 1150) {
Log.swarningln(FPSTR(L_OT), F("Disconnected")); 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; vars.sensors.outdoor.connected = false;
} }
if (settings.sensors.indoor.type == SensorType::BOILER_RETURN) {
vars.sensors.indoor.connected = false;
}
vars.states.otStatus = false; vars.states.otStatus = false;
this->isInitialized = false; this->isInitialized = false;
} }
@@ -396,7 +400,7 @@ protected:
// update these parameters once a minute // update these parameters once a minute
if (!settings.opentherm.filterNumValues.enable) { if (!settings.opentherm.filterNumValues.enable) {
// Get outdoor temp (if necessary) // Get outdoor temp (if necessary)
if (settings.sensors.outdoor.type == SensorType::BOILER) { if (settings.sensors.outdoor.type == SensorType::BOILER_OUTDOOR) {
if (this->updateOutdoorTemp()) { if (this->updateOutdoorTemp()) {
if (!vars.sensors.outdoor.connected) { if (!vars.sensors.outdoor.connected) {
vars.sensors.outdoor.connected = true; vars.sensors.outdoor.connected = true;
@@ -486,9 +490,21 @@ protected:
// Get heating return temp // Get heating return temp
if (this->updateHeatingReturnTemp()) { 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); Log.snoticeln(FPSTR(L_OT_HEATING), F("Received return temp: %.2f"), vars.temperatures.heatingReturn);
} else { } 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")); Log.swarningln(FPSTR(L_OT_HEATING), F("Failed receive return temp"));
} }
@@ -504,7 +520,7 @@ protected:
// must be updated every time. // must be updated every time.
if (settings.opentherm.filterNumValues.enable) { if (settings.opentherm.filterNumValues.enable) {
// Get outdoor temp (if necessary) // Get outdoor temp (if necessary)
if (settings.sensors.outdoor.type == SensorType::BOILER) { if (settings.sensors.outdoor.type == SensorType::BOILER_OUTDOOR) {
if (this->updateOutdoorTemp()) { if (this->updateOutdoorTemp()) {
if (!vars.sensors.outdoor.connected) { if (!vars.sensors.outdoor.connected) {
vars.sensors.outdoor.connected = true; vars.sensors.outdoor.connected = true;

View File

@@ -126,7 +126,7 @@ struct Settings {
struct { struct {
struct { struct {
SensorType type = SensorType::BOILER; SensorType type = SensorType::BOILER_OUTDOOR;
byte gpio = DEFAULT_SENSOR_OUTDOOR_GPIO; byte gpio = DEFAULT_SENSOR_OUTDOOR_GPIO;
uint8_t bleAddress[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; uint8_t bleAddress[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
float offset = 0.0f; float offset = 0.0f;

View File

@@ -147,10 +147,11 @@
#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))
enum class SensorType : byte { enum class SensorType : byte {
BOILER, BOILER_OUTDOOR = 0,
MANUAL, BOILER_RETURN = 4,
DS18B20, MANUAL = 1,
BLUETOOTH DS18B20 = 2,
BLUETOOTH = 3
}; };
enum class UnitSystem : byte { enum class UnitSystem : byte {

View File

@@ -1178,9 +1178,9 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false
byte value = src["sensors"]["outdoor"]["type"].as<unsigned char>(); byte value = src["sensors"]["outdoor"]["type"].as<unsigned char>();
switch (value) { switch (value) {
case static_cast<byte>(SensorType::BOILER): case static_cast<byte>(SensorType::BOILER_OUTDOOR):
if (dst.sensors.outdoor.type != SensorType::BOILER) { if (dst.sensors.outdoor.type != SensorType::BOILER_OUTDOOR) {
dst.sensors.outdoor.type = SensorType::BOILER; dst.sensors.outdoor.type = SensorType::BOILER_OUTDOOR;
changed = true; changed = true;
} }
break; break;
@@ -1248,7 +1248,7 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false
if (!src["sensors"]["outdoor"]["offset"].isNull()) { if (!src["sensors"]["outdoor"]["offset"].isNull()) {
float value = src["sensors"]["outdoor"]["offset"].as<float>(); float value = src["sensors"]["outdoor"]["offset"].as<float>();
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); dst.sensors.outdoor.offset = roundd(value, 2);
changed = true; changed = true;
} }
@@ -1258,6 +1258,13 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false
byte value = src["sensors"]["indoor"]["type"].as<unsigned char>(); byte value = src["sensors"]["indoor"]["type"].as<unsigned char>();
switch (value) { switch (value) {
case static_cast<byte>(SensorType::BOILER_RETURN):
if (dst.sensors.indoor.type != SensorType::BOILER_RETURN) {
dst.sensors.indoor.type = SensorType::BOILER_RETURN;
changed = true;
}
break;
case static_cast<byte>(SensorType::MANUAL): case static_cast<byte>(SensorType::MANUAL):
if (dst.sensors.indoor.type != SensorType::MANUAL) { if (dst.sensors.indoor.type != SensorType::MANUAL) {
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()) { if (!src["sensors"]["indoor"]["offset"].isNull()) {
float value = src["sensors"]["indoor"]["offset"].as<float>(); float value = src["sensors"]["indoor"]["offset"].as<float>();
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); dst.sensors.indoor.offset = roundd(value, 2);
changed = true; changed = true;
} }

View File

@@ -318,7 +318,8 @@
"tempSensor": { "tempSensor": {
"source": { "source": {
"type": "Source type", "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", "manual": "Manual via MQTT/API",
"ext": "External (DS18B20)", "ext": "External (DS18B20)",
"ble": "BLE device" "ble": "BLE device"

View File

@@ -332,7 +332,8 @@
"tempSensor": { "tempSensor": {
"source": { "source": {
"type": "Источник данных", "type": "Источник данных",
"boiler": "От котла через OpenTherm", "boilerOutdoor": "От котла через OpenTherm",
"boilerReturn": "Температура обратки через OpenTherm",
"manual": "Вручную через MQTT/API", "manual": "Вручную через MQTT/API",
"ext": "Внешний датчик (DS18B20)", "ext": "Внешний датчик (DS18B20)",
"ble": "BLE устройство" "ble": "BLE устройство"

View File

@@ -566,7 +566,7 @@
<label> <label>
<input type="radio" class="outdoor-sensor-type" name="sensors[outdoor][type]" value="0" /> <input type="radio" class="outdoor-sensor-type" name="sensors[outdoor][type]" value="0" />
<span data-i18n>settings.tempSensor.source.boiler</span> <span data-i18n>settings.tempSensor.source.boilerOutdoor</span>
</label> </label>
<label> <label>
@@ -599,7 +599,7 @@
<label for="outdoor-sensor-offset"> <label for="outdoor-sensor-offset">
<span data-i18n>settings.tempSensor.offset</span> <span data-i18n>settings.tempSensor.offset</span>
<input type="number" inputmode="numeric" id="outdoor-sensor-offset" name="sensors[outdoor][offset]" min="-10" max="10" step="0.01" required> <input type="number" inputmode="numeric" id="outdoor-sensor-offset" name="sensors[outdoor][offset]" min="-20" max="20" step="0.01" required>
</label> </label>
<fieldset> <fieldset>
@@ -621,6 +621,11 @@
<fieldset> <fieldset>
<legend data-i18n>settings.tempSensor.source.type</legend> <legend data-i18n>settings.tempSensor.source.type</legend>
<label>
<input type="radio" class="indoor-sensor-type" name="sensors[indoor][type]" value="4" />
<span data-i18n>settings.tempSensor.source.boilerReturn</span>
</label>
<label> <label>
<input type="radio" class="indoor-sensor-type" name="sensors[indoor][type]" value="1" /> <input type="radio" class="indoor-sensor-type" name="sensors[indoor][type]" value="1" />
<span data-i18n>settings.tempSensor.source.manual</span> <span data-i18n>settings.tempSensor.source.manual</span>
@@ -651,7 +656,7 @@
<label for="indoor-sensor-offset"> <label for="indoor-sensor-offset">
<span data-i18n>settings.tempSensor.offset</span> <span data-i18n>settings.tempSensor.offset</span>
<input type="number" inputmode="numeric" id="indoor-sensor-offset" name="sensors[indoor][offset]" min="-10" max="10" step="0.01" required> <input type="number" inputmode="numeric" id="indoor-sensor-offset" name="sensors[indoor][offset]" min="-20" max="20" step="0.01" required>
</label> </label>
<fieldset> <fieldset>