Adding ext device support

This commit is contained in:
abratchik
2025-07-09 16:43:52 +03:00
parent 062468c6b1
commit 24342db40e
13 changed files with 383 additions and 155 deletions

View File

@@ -104,6 +104,7 @@
"mMqttConnected": "MQTT服务器连接状态",
"mEmergencyState": "应急模式",
"mExtPumpState": "外置循环泵",
"mExtDevState": "外置设备",
"mCascadeControlInput": "Cascade 控制 (input)",
"mCascadeControlOutput": "Cascade 控制 (output)",
@@ -289,6 +290,7 @@
"ot": "OpenTherm协议设置",
"mqtt": "MQTT 服务器设置",
"extPump": "外置循环泵设置",
"extDev": "外置设备设置",
"cascadeControl": "Cascade 级联控制设置"
},
@@ -459,6 +461,13 @@
"antiStuckTime": "防卡死运行时长<small>(分钟)</small>"
},
"extDev": {
"use": "使用外置设备",
"gpio": "GPIO 继电器",
"state": "状态",
"caption": "说明"
},
"cascadeControl": {
"input": {
"desc": "仅当另一台锅炉发生故障时启用本锅炉加热。另一台锅炉的控制器需在故障发生时切换GPIO输入状态以触发本功能。",

View File

@@ -104,6 +104,7 @@
"mMqttConnected": "MQTT connection",
"mEmergencyState": "Emergency mode",
"mExtPumpState": "External pump",
"mExtDevState": "External device",
"mCascadeControlInput": "Cascade control (input)",
"mCascadeControlOutput": "Cascade control (output)",
@@ -289,6 +290,7 @@
"ot": "OpenTherm settings",
"mqtt": "MQTT settings",
"extPump": "External pump settings",
"extDev": "External device settings",
"cascadeControl": "Cascade control settings"
},
@@ -458,6 +460,13 @@
"antiStuckInterval": "Anti stuck interval <small>(days)</small>",
"antiStuckTime": "Anti stuck time <small>(min)</small>"
},
"extDev": {
"use": "Use external device",
"gpio": "Relay GPIO",
"state": "State",
"caption": "Caption"
},
"cascadeControl": {
"input": {

View File

@@ -104,6 +104,7 @@
"mMqttConnected": "Connessione MQTT",
"mEmergencyState": "Modo Emergenza",
"mExtPumpState": "Pompa esterna",
"mExtDevState": "Dispositivo esterno",
"mCascadeControlInput": "Controllo a cascata (input)",
"mCascadeControlOutput": "Controllo a cascata (output)",
@@ -289,6 +290,7 @@
"ot": "Impostazioni OpenTherm",
"mqtt": "Impostazioni MQTT",
"extPump": "Impostazioni pompa esterna",
"extDev": "Impostazioni dispositivo esterno",
"cascadeControl": "Impostazioni controllo a cascata"
},
@@ -459,6 +461,13 @@
"antiStuckTime": "Tempo antiblocco <small>(min)</small>"
},
"extDev": {
"use": "Usa dispositivo esterno",
"gpio": "GPIO relè",
"state": "Stato",
"caption": "Didascalia"
},
"cascadeControl": {
"input": {
"desc": "Può essere attivata la caldaia se un'altra ha fallito. Il controllo dell'altra caldaia cambia lo stato dell'ingresso del GPIO in caso di errore.",

View File

@@ -104,6 +104,7 @@
"mMqttConnected": "Подключение к MQTT",
"mEmergencyState": "Аварийный режим",
"mExtPumpState": "Внешний насос",
"mExtDevState": "Внешнее устройство",
"mCascadeControlInput": "Каскадное управление (вход)",
"mCascadeControlOutput": "Каскадное управление (выход)",
@@ -289,6 +290,7 @@
"ot": "Настройки OpenTherm",
"mqtt": "Настройки MQTT",
"extPump": "Настройки дополнительного насоса",
"extDev": "Настройки внешнего устройства",
"cascadeControl": "Настройки каскадного управления"
},
@@ -459,6 +461,13 @@
"antiStuckTime": "Время работы насоса <small>(в минутах)</small>"
},
"extDev": {
"use": "Использовать внешнее устройство",
"gpio": "GPIO реле",
"state": "Состояние",
"caption": "Назначение"
},
"cascadeControl": {
"input": {
"desc": "Может использоваться для включения отопления только при неисправности другого котла. Контроллер другого котла должен изменить состояние входа GPIO в случае неисправности.",

View File

@@ -135,6 +135,10 @@
<th scope="row" data-i18n>dashboard.states.mExtPumpState</th>
<td><i class="mExtPumpState"></i></td>
</tr>
<tr>
<th scope="row" data-i18n>dashboard.states.mExtDevState</th>
<td><i class="mExtDevState"></i></td>
</tr>
<tr>
<th scope="row" data-i18n>dashboard.states.mCascadeControlInput</th>
<td><i class="mCascadeControlInput"></i></td>
@@ -658,6 +662,7 @@
result.master.emergency.state ? "red" : "green"
);
setState('.mExtPumpState', result.master.externalPump.state);
setState('.mExtDevState', result.master.externalDev.state);
setState('.mCascadeControlInput', result.master.cascadeControl.input);
setState('.mCascadeControlOutput', result.master.cascadeControl.output);

View File

@@ -763,6 +763,42 @@
<hr />
<details>
<summary><b data-i18n>settings.section.extDev</b></summary>
<div>
<div id="extdev-settings-busy" aria-busy="true"></div>
<form action="/api/settings" id="extdev-settings" class="hidden">
<fieldset>
<label for="extdev-use">
<input type="checkbox" id="extdev-use" name="externalDev[use]" value="false">
<span data-i18n>settings.extDev.use</span>
</label>
<label for="extdev-state">
<input type="checkbox" id="extdev-state" name="externalDev[state]" value="false">
<span data-i18n>settings.extDev.state</span>
</label>
</fieldset>
<div class="grid">
<label for="extdev-gpio">
<span data-i18n>settings.extDev.gpio</span>
<input type="number" inputmode="numeric" id="extdev-gpio" name="externalDev[gpio]" min="0" max="254" step="1">
</label>
<label for="extdev-caption">
<span data-i18n>settings.extDev.caption</span>
<input type="text" id="extdev-caption" name="externalDev[caption]" maxlength="40" required>
</label>
</div>
<button type="submit" data-i18n>button.save</button>
</form>
</div>
</details>
<hr />
<details>
<summary><b data-i18n>settings.section.cascadeControl</b></summary>
<div>
@@ -932,6 +968,13 @@
setInputValue("[name='externalPump[antiStuckTime]']", data.externalPump.antiStuckTime);
setBusy('#extpump-settings-busy', '#extpump-settings', false);
// Extdev
setCheckboxValue('#extdev-use', data.externalDev.use);
setInputValue('#extdev-gpio', data.externalDev.gpio < 255 ? data.externalDev.gpio : '');
setInputValue('#extdev-caption', data.externalDev.caption);
setCheckboxValue('#extdev-state', data.externalDev.state);
setBusy('#extdev-settings-busy', '#extdev-settings', false);
// Cascade control
setCheckboxValue("[name='cascadeControl[input][enabled]']", data.cascadeControl.input.enabled);
setInputValue("[name='cascadeControl[input][gpio]']", data.cascadeControl.input.gpio < 255 ? data.cascadeControl.input.gpio : '');
@@ -1085,6 +1128,7 @@
setupForm('#ot-settings', fillData);
setupForm('#mqtt-settings', fillData, ['mqtt.user', 'mqtt.password', 'mqtt.prefix']);
setupForm('#extpump-settings', fillData);
setupForm('#extdev-settings', fillData);
setupForm('#cc-settings', fillData);
} catch (error) {