mirror of
https://github.com/Laxilef/OTGateway.git
synced 2025-12-13 11:44:29 +05:00
feat: ability to use return heat carrier temp as indoor temp
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
17
src/utils.h
17
src/utils.h
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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 устройство"
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user