3 Commits

Author SHA1 Message Date
Yurii
b91266063b refactor: imporved updating OT sensors 2024-11-12 19:47:56 +03:00
Yurii
b087e6e6d3 refactor: some changes 2024-11-12 15:26:28 +03:00
Yurii
b205f14bae refactor: impoved sensors settings page 2024-11-12 15:25:58 +03:00
4 changed files with 151 additions and 124 deletions

View File

@@ -249,8 +249,8 @@ protected:
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.heating.enabled; vars.slave.dhw.enabled = vars.master.dhw.enabled;
Log.sinfoln(FPSTR(L_OT_DHW), vars.master.heating.enabled ? F("Enabled") : F("Disabled")); Log.sinfoln(FPSTR(L_OT_DHW), vars.master.dhw.enabled ? F("Enabled") : F("Disabled"));
} }
vars.slave.heating.active = CustomOpenTherm::isCentralHeatingActive(response); vars.slave.heating.active = CustomOpenTherm::isCentralHeatingActive(response);
@@ -471,25 +471,37 @@ protected:
vars.slave.modulation.current, power, settings.opentherm.maxPower, settings.opentherm.minPower vars.slave.modulation.current, power, settings.opentherm.maxPower, settings.opentherm.minPower
); );
// Modulation level sensors
Sensors::setValueByType(
Sensors::Type::OT_MODULATION_LEVEL, vars.slave.modulation.current,
Sensors::ValueType::PRIMARY, true, true
);
// Power sensors
Sensors::setValueByType(
Sensors::Type::OT_CURRENT_POWER, power,
Sensors::ValueType::PRIMARY, true, true
);
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive modulation level")); Log.swarningln(FPSTR(L_OT), F("Failed receive modulation level"));
} }
} else if (vars.slave.modulation.current > 0) { } else if (vars.slave.modulation.current > 0) {
vars.slave.modulation.current = 0; vars.slave.modulation.current = 0;
// Modulation level sensors
Sensors::setValueByType(
Sensors::Type::OT_MODULATION_LEVEL, vars.slave.modulation.current,
Sensors::ValueType::PRIMARY, true, true
);
// Power sensors
Sensors::setValueByType(
Sensors::Type::OT_CURRENT_POWER, power,
Sensors::ValueType::PRIMARY, true, true
);
} }
// Modulation level sensors
Sensors::setValueByType(
Sensors::Type::OT_MODULATION_LEVEL, vars.slave.modulation.current,
Sensors::ValueType::PRIMARY, true, true
);
// Power sensors
Sensors::setValueByType(
Sensors::Type::OT_CURRENT_POWER, power,
Sensors::ValueType::PRIMARY, true, true
);
} }
// Update DHW temp // Update DHW temp
@@ -512,15 +524,15 @@ protected:
vars.slave.dhw.currentTemp, convertedDhwTemp vars.slave.dhw.currentTemp, convertedDhwTemp
); );
Sensors::setValueByType(
Sensors::Type::OT_DHW_TEMP, convertedDhwTemp,
Sensors::ValueType::PRIMARY, true, true
);
} else { } else {
Log.swarningln(FPSTR(L_OT_DHW), F("Failed receive temp")); Log.swarningln(FPSTR(L_OT_DHW), F("Failed receive temp"));
} }
} }
Sensors::setValueByType(
Sensors::Type::OT_DHW_TEMP, convertedDhwTemp,
Sensors::ValueType::PRIMARY, true, true
);
} }
// Update DHW temp 2 // Update DHW temp 2
@@ -543,15 +555,15 @@ protected:
vars.slave.dhw.currentTemp2, convertedDhwTemp2 vars.slave.dhw.currentTemp2, convertedDhwTemp2
); );
Sensors::setValueByType(
Sensors::Type::OT_DHW_TEMP2, convertedDhwTemp2,
Sensors::ValueType::PRIMARY, true, true
);
} else { } else {
Log.swarningln(FPSTR(L_OT_DHW), F("Failed receive temp 2")); Log.swarningln(FPSTR(L_OT_DHW), F("Failed receive temp 2"));
} }
} }
Sensors::setValueByType(
Sensors::Type::OT_DHW_TEMP2, convertedDhwTemp2,
Sensors::ValueType::PRIMARY, true, true
);
} }
// Update DHW flow rate // Update DHW flow rate
@@ -574,15 +586,15 @@ protected:
vars.slave.dhw.flowRate, convertedDhwFlowRate vars.slave.dhw.flowRate, convertedDhwFlowRate
); );
Sensors::setValueByType(
Sensors::Type::OT_DHW_FLOW_RATE, convertedDhwFlowRate,
Sensors::ValueType::PRIMARY, true, true
);
} else { } else {
Log.swarningln(FPSTR(L_OT_DHW), F("Failed receive flow rate")); Log.swarningln(FPSTR(L_OT_DHW), F("Failed receive flow rate"));
} }
} }
Sensors::setValueByType(
Sensors::Type::OT_DHW_FLOW_RATE, convertedDhwFlowRate,
Sensors::ValueType::PRIMARY, true, true
);
} }
// Update heating temp // Update heating temp
@@ -602,14 +614,14 @@ protected:
vars.slave.heating.currentTemp, convertedHeatingTemp vars.slave.heating.currentTemp, convertedHeatingTemp
); );
Sensors::setValueByType(
Sensors::Type::OT_HEATING_TEMP, convertedHeatingTemp,
Sensors::ValueType::PRIMARY, true, true
);
} else { } else {
Log.swarningln(FPSTR(L_OT_HEATING), F("Failed receive temp")); Log.swarningln(FPSTR(L_OT_HEATING), F("Failed receive temp"));
} }
Sensors::setValueByType(
Sensors::Type::OT_HEATING_TEMP, convertedHeatingTemp,
Sensors::ValueType::PRIMARY, true, true
);
} }
// Update heating return temp // Update heating return temp
@@ -629,14 +641,14 @@ protected:
vars.slave.heating.returnTemp, convertedHeatingReturnTemp vars.slave.heating.returnTemp, convertedHeatingReturnTemp
); );
Sensors::setValueByType(
Sensors::Type::OT_HEATING_RETURN_TEMP, convertedHeatingReturnTemp,
Sensors::ValueType::PRIMARY, true, true
);
} else { } else {
Log.swarningln(FPSTR(L_OT_HEATING), F("Failed receive return temp")); Log.swarningln(FPSTR(L_OT_HEATING), F("Failed receive return temp"));
} }
Sensors::setValueByType(
Sensors::Type::OT_HEATING_RETURN_TEMP, convertedHeatingReturnTemp,
Sensors::ValueType::PRIMARY, true, true
);
} }
// Update CH2 temp // Update CH2 temp
@@ -659,15 +671,15 @@ protected:
vars.slave.ch2.currentTemp, convertedCh2Temp vars.slave.ch2.currentTemp, convertedCh2Temp
); );
Sensors::setValueByType(
Sensors::Type::OT_CH2_TEMP, convertedCh2Temp,
Sensors::ValueType::PRIMARY, true, true
);
} else { } else {
Log.swarningln(FPSTR(L_OT_CH2), F("Failed receive temp")); Log.swarningln(FPSTR(L_OT_CH2), F("Failed receive temp"));
} }
} }
Sensors::setValueByType(
Sensors::Type::OT_CH2_TEMP, convertedCh2Temp,
Sensors::ValueType::PRIMARY, true, true
);
} }
// Update exhaust temp // Update exhaust temp
@@ -687,14 +699,14 @@ protected:
vars.slave.exhaustTemp, convertedExhaustTemp vars.slave.exhaustTemp, convertedExhaustTemp
); );
Sensors::setValueByType(
Sensors::Type::OT_EXHAUST_TEMP, convertedExhaustTemp,
Sensors::ValueType::PRIMARY, true, true
);
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive exhaust temp")); Log.swarningln(FPSTR(L_OT), F("Failed receive exhaust temp"));
} }
Sensors::setValueByType(
Sensors::Type::OT_EXHAUST_TEMP, convertedExhaustTemp,
Sensors::ValueType::PRIMARY, true, true
);
} }
// Update heat exchanger temp // Update heat exchanger temp
@@ -714,14 +726,14 @@ protected:
vars.slave.heatExchangerTemp, convertedHeatExchTemp vars.slave.heatExchangerTemp, convertedHeatExchTemp
); );
Sensors::setValueByType(
Sensors::Type::OT_HEAT_EXCHANGER_TEMP, convertedHeatExchTemp,
Sensors::ValueType::PRIMARY, true, true
);
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive heat exchanger temp")); Log.swarningln(FPSTR(L_OT), F("Failed receive heat exchanger temp"));
} }
Sensors::setValueByType(
Sensors::Type::OT_HEAT_EXCHANGER_TEMP, convertedHeatExchTemp,
Sensors::ValueType::PRIMARY, true, true
);
} }
// Update outdoor temp // Update outdoor temp
@@ -741,14 +753,14 @@ protected:
vars.slave.heating.outdoorTemp, convertedOutdoorTemp vars.slave.heating.outdoorTemp, convertedOutdoorTemp
); );
Sensors::setValueByType(
Sensors::Type::OT_OUTDOOR_TEMP, convertedOutdoorTemp,
Sensors::ValueType::PRIMARY, true, true
);
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive outdoor temp")); Log.swarningln(FPSTR(L_OT), F("Failed receive outdoor temp"));
} }
Sensors::setValueByType(
Sensors::Type::OT_OUTDOOR_TEMP, convertedOutdoorTemp,
Sensors::ValueType::PRIMARY, true, true
);
} }
// Update pressure // Update pressure
@@ -768,14 +780,14 @@ protected:
vars.slave.pressure, convertedPressure vars.slave.pressure, convertedPressure
); );
Sensors::setValueByType(
Sensors::Type::OT_PRESSURE, convertedPressure,
Sensors::ValueType::PRIMARY, true, true
);
} else { } else {
Log.swarningln(FPSTR(L_OT), F("Failed receive pressure")); Log.swarningln(FPSTR(L_OT), F("Failed receive pressure"));
} }
Sensors::setValueByType(
Sensors::Type::OT_PRESSURE, convertedPressure,
Sensors::ValueType::PRIMARY, true, true
);
} }

View File

@@ -106,21 +106,15 @@ protected:
} }
inline float getHeatingMinSetpointTemp() { inline float getHeatingMinSetpointTemp() {
if (settings.opentherm.nativeHeatingControl) { return settings.opentherm.nativeHeatingControl
return vars.master.heating.minTemp; ? vars.master.heating.minTemp
: settings.heating.minTemp;
} else {
return settings.heating.minTemp;
}
} }
inline float getHeatingMaxSetpointTemp() { inline float getHeatingMaxSetpointTemp() {
if (settings.opentherm.nativeHeatingControl) { return settings.opentherm.nativeHeatingControl
return vars.master.heating.maxTemp; ? vars.master.heating.maxTemp
: settings.heating.maxTemp;
} else {
return settings.heating.maxTemp;
}
} }
float getHeatingSetpointTemp() { float getHeatingSetpointTemp() {

View File

@@ -171,41 +171,44 @@ public:
auto& rSensor = results[sensorId]; auto& rSensor = results[sensorId];
float compensatedValue = value; float compensatedValue = value;
if (valueType == ValueType::PRIMARY) { if (sSensor.type == Type::HEATING_SETPOINT_TEMP || sSensor.type == Type::MANUAL) {
if (fabsf(sSensor.factor) > 0.001f) {
compensatedValue *= sSensor.factor;
}
if (fabsf(sSensor.offset) > 0.001f) {
compensatedValue += sSensor.offset;
}
} else if (valueType == ValueType::RSSI) {
if (sSensor.type == Type::BLUETOOTH) {
rSensor.signalQuality = Sensors::bluetoothRssiToQuality(value);
}
}
if (sSensor.filtering && fabs(rSensor.values[valueId]) >= 0.1f) {
rSensor.values[valueId] += (compensatedValue - rSensor.values[valueId]) * sSensor.filteringFactor;
} else {
rSensor.values[valueId] = compensatedValue; rSensor.values[valueId] = compensatedValue;
} else {
if (valueType == ValueType::PRIMARY) {
if (fabsf(sSensor.factor) > 0.001f) {
compensatedValue *= sSensor.factor;
}
if (fabsf(sSensor.offset) > 0.001f) {
compensatedValue += sSensor.offset;
}
} else if (valueType == ValueType::RSSI) {
if (sSensor.type == Type::BLUETOOTH) {
rSensor.signalQuality = Sensors::bluetoothRssiToQuality(value);
}
}
if (sSensor.filtering && fabsf(rSensor.values[valueId]) >= 0.1f) {
rSensor.values[valueId] += (compensatedValue - rSensor.values[valueId]) * sSensor.filteringFactor;
} else {
rSensor.values[valueId] = compensatedValue;
}
} }
if (updateActivityTime) { if (updateActivityTime) {
rSensor.activityTime = millis(); rSensor.activityTime = millis();
} }
if (markConnected) { if (markConnected && !rSensor.connected) {
if (!rSensor.connected) { rSensor.connected = true;
rSensor.connected = true;
Log.snoticeln( Log.snoticeln(
FPSTR(L_SENSORS), F("#%hhu '%s' new status: CONNECTED"), FPSTR(L_SENSORS), F("#%hhu '%s' new status: CONNECTED"),
sensorId, sSensor.name sensorId, sSensor.name
); );
}
} }
Log.snoticeln( Log.snoticeln(

View File

@@ -114,10 +114,10 @@
</label> </label>
</div> </div>
<hr /> <hr class="correction" />
<fieldset> <details class="correction">
<legend><b data-i18n>sensors.correction.desc</b></legend> <summary><b data-i18n>sensors.correction.desc</b></summary>
<div class="grid"> <div class="grid">
<label> <label>
@@ -130,27 +130,30 @@
<input type="number" inputmode="numeric" name="factor" min="0.01" max="10" step="0.01" required> <input type="number" inputmode="numeric" name="factor" min="0.01" max="10" step="0.01" required>
</label> </label>
</div> </div>
</fieldset> </details>
<hr /> <hr class="filtering" />
<fieldset> <details class="filtering">
<legend><b data-i18n>sensors.filtering.desc</b></legend> <summary><b data-i18n>sensors.filtering.desc</b></summary>
<label>
<input type="checkbox" name="filtering" value="true">
<span data-i18n>sensors.filtering.enabled.title</span>
<br />
<small data-i18n>sensors.filtering.enabled.note</small>
</label>
<label>
<span data-i18n>sensors.filtering.factor.title</span>
<input type="number" inputmode="numeric" name="filteringFactor" min="0.01" max="1" step="0.01">
<small data-i18n>sensors.filtering.factor.note</small>
</label>
</fieldset>
<div>
<label>
<input type="checkbox" name="filtering" value="true">
<span data-i18n>sensors.filtering.enabled.title</span>
<br />
<small data-i18n>sensors.filtering.enabled.note</small>
</label>
<label>
<span data-i18n>sensors.filtering.factor.title</span>
<input type="number" inputmode="numeric" name="filteringFactor" min="0.01" max="1" step="0.01">
<small data-i18n>sensors.filtering.factor.note</small>
</label>
</div>
</details>
<br/>
<button type="submit" data-i18n>button.save</button> <button type="submit" data-i18n>button.save</button>
</form> </form>
</div> </div>
@@ -221,6 +224,20 @@
const parentGpio = gpio.parentElement; const parentGpio = gpio.parentElement;
const parentAddress = address.parentElement; const parentAddress = address.parentElement;
switch(parseInt(event.target.value)) {
// heating setpoint, manual
case 253:
case 254:
hide(".correction", sensorForm);
hide(".filtering", sensorForm);
break;
// other
default:
show(".correction", sensorForm);
show(".filtering", sensorForm);
}
switch(parseInt(event.target.value)) { switch(parseInt(event.target.value)) {
// ntc // ntc
case 50: case 50:
@@ -251,6 +268,7 @@
break; break;
} }
}); });
sensorNode.addEventListener("click", async (event) => { sensorNode.addEventListener("click", async (event) => {
if (parseInt(sensorNode.dataset.preloaded)) { if (parseInt(sensorNode.dataset.preloaded)) {
return; return;