mirror of
https://github.com/Laxilef/OTGateway.git
synced 2025-12-10 18:24:27 +05:00
836 lines
38 KiB
HTML
836 lines
38 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title data-i18n>settings.title</title>
|
|
<link rel="stylesheet" href="/static/app.css" />
|
|
</head>
|
|
|
|
<body>
|
|
<header class="container">
|
|
<nav>
|
|
<ul>
|
|
<li><a href="/">
|
|
<div class="logo" data-i18n>logo</div>
|
|
</a></li>
|
|
</ul>
|
|
<ul>
|
|
<!--<li><a href="https://github.com/Laxilef/OTGateway/wiki" role="button" class="secondary" target="_blank">Help</a></li>-->
|
|
<li>
|
|
<select id="lang" aria-label="Lang">
|
|
<option value="en" selected>EN</option>
|
|
<option value="ru">RU</option>
|
|
</select>
|
|
</li>
|
|
</ul>
|
|
</nav>
|
|
</header>
|
|
|
|
<main class="container">
|
|
<article>
|
|
<hgroup>
|
|
<h2 data-i18n>settings.name</h2>
|
|
<p></p>
|
|
</hgroup>
|
|
|
|
<details>
|
|
<summary><b data-i18n>settings.section.portal</b></summary>
|
|
<div>
|
|
<div id="portal-settings-busy" aria-busy="true"></div>
|
|
<form action="/api/settings" id="portal-settings" class="hidden">
|
|
<div class="grid">
|
|
<label for="portal-login">
|
|
<span data-i18n>settings.portal.login</span>
|
|
<input type="text" id="portal-login" name="portal[login]" maxlength="12" required>
|
|
</label>
|
|
|
|
<label for="portal-password">
|
|
<span data-i18n>settings.portal.password</span>
|
|
<input type="password" id="portal-password" name="portal[password]" maxlength="32" required>
|
|
</label>
|
|
</div>
|
|
|
|
<label for="portal-auth">
|
|
<input type="checkbox" id="portal-auth" name="portal[auth]" value="true">
|
|
<span data-i18n>settings.portal.auth</span>
|
|
</label>
|
|
<br />
|
|
|
|
<button type="submit" data-i18n>button.save</button>
|
|
</form>
|
|
</div>
|
|
</details>
|
|
|
|
<hr />
|
|
|
|
<details>
|
|
<summary><b data-i18n>settings.section.system</b></summary>
|
|
<div>
|
|
<div id="system-settings-busy" aria-busy="true"></div>
|
|
<form action="/api/settings" id="system-settings" class="hidden">
|
|
<fieldset>
|
|
<legend data-i18n>settings.system.unit</legend>
|
|
|
|
<label>
|
|
<input type="radio" class="system-unit-system" name="system[unitSystem]" value="0" />
|
|
<span data-i18n>settings.system.metric</span>
|
|
</label>
|
|
|
|
<label>
|
|
<input type="radio" class="system-unit-system" name="system[unitSystem]" value="1" />
|
|
<span data-i18n>settings.system.imperial</span>
|
|
</label>
|
|
</fieldset>
|
|
|
|
<fieldset>
|
|
<label for="system-status-led-gpio">
|
|
<span data-i18n>settings.system.statusLedGpio</span>
|
|
<input type="number" inputmode="numeric" id="system-status-led-gpio" name="system[statusLedGpio]" min="0" max="254" step="1">
|
|
<small data-i18n>settings.note.blankNotUse</small>
|
|
</label>
|
|
</fieldset>
|
|
|
|
<fieldset>
|
|
<legend data-i18n>settings.section.diag</legend>
|
|
|
|
<label for="system-serial-enable">
|
|
<input type="checkbox" id="system-serial-enable" name="system[serial][enable]" value="true">
|
|
<span data-i18n>settings.system.serial.enable</span>
|
|
</label>
|
|
|
|
<label for="system-telnet-enable">
|
|
<input type="checkbox" id="system-telnet-enable" name="system[telnet][enable]" value="true">
|
|
<span data-i18n>settings.system.telnet.enable</span>
|
|
</label>
|
|
|
|
<label for="system-log-level">
|
|
<span data-i18n>settings.system.logLevel</span>
|
|
<select id="system-log-level" name="system[logLevel]">
|
|
<option value="0">SILENT</option>
|
|
<option value="1">FATAL</option>
|
|
<option value="2">ERROR</option>
|
|
<option value="3">WARNING</option>
|
|
<option value="4">INFO</option>
|
|
<option value="5">NOTICE</option>
|
|
<option value="6">TRACE</option>
|
|
<option value="7">VERBOSE</option>
|
|
</select>
|
|
</label>
|
|
|
|
<div class="grid">
|
|
<label for="system-serial-baudrate">
|
|
<span data-i18n>settings.system.serial.baud</span>
|
|
<select id="system-serial-baudrate" name="system[serial][baudrate]" required>
|
|
<option value="9600">9600</option>
|
|
<option value="19200">19200</option>
|
|
<option value="38400">38400</option>
|
|
<option value="57600">57600</option>
|
|
<option value="74880">74880</option>
|
|
<option value="115200">115200</option>
|
|
</select>
|
|
</label>
|
|
|
|
<label for="system-telnet-port">
|
|
<span data-i18n>settings.system.telnet.port.title</span>
|
|
<input type="number" inputmode="numeric" id="system-telnet-port" name="system[telnet][port]" min="1" max="65535" step="1" required>
|
|
<small data-i18n>settings.system.telnet.port.note</small>
|
|
</label>
|
|
</div>
|
|
|
|
<mark data-i18n>settings.note.restart</mark>
|
|
</fieldset>
|
|
|
|
<button type="submit" data-i18n>button.save</button>
|
|
</form>
|
|
</div>
|
|
</details>
|
|
|
|
|
|
<hr />
|
|
|
|
<details>
|
|
<summary><b data-i18n>settings.section.heating</b></summary>
|
|
<div>
|
|
<div id="heating-settings-busy" aria-busy="true"></div>
|
|
<form action="/api/settings" id="heating-settings" class="hidden">
|
|
<div class="grid">
|
|
<label for="heating-min-temp">
|
|
<span data-i18n>settings.temp.min</span>
|
|
<input type="number" inputmode="numeric" id="heating-min-temp" name="heating[minTemp]" min="0" max="0" step="1" required>
|
|
</label>
|
|
|
|
<label for="heating-max-temp">
|
|
<span data-i18n>settings.temp.max</span>
|
|
<input type="number" inputmode="numeric" id="heating-max-temp" name="heating[maxTemp]" min="0" max="0" step="1" required>
|
|
</label>
|
|
</div>
|
|
|
|
<div class="grid">
|
|
<label for="heating-hysteresis">
|
|
<span data-i18n>settings.heating.hyst</span>
|
|
<input type="number" inputmode="numeric" id="heating-hysteresis" name="heating[hysteresis]" min="0" max="5" step="0.05" required>
|
|
</label>
|
|
|
|
<label for="heating-turbo-factor">
|
|
<span data-i18n>settings.heating.turboFactor</span>
|
|
<input type="number" inputmode="numeric" id="heating-turbo-factor" name="heating[turboFactor]" min="1.5" max="10" step="0.1" required>
|
|
</label>
|
|
</div>
|
|
|
|
<button type="submit" data-i18n>button.save</button>
|
|
</form>
|
|
</div>
|
|
</details>
|
|
|
|
<hr />
|
|
|
|
<details>
|
|
<summary><b data-i18n>settings.section.dhw</b></summary>
|
|
<div>
|
|
<div id="dhw-settings-busy" aria-busy="true"></div>
|
|
<form action="/api/settings" id="dhw-settings" class="hidden">
|
|
<div class="grid">
|
|
<label for="dhw-min-temp">
|
|
<span data-i18n>settings.temp.min</span>
|
|
<input type="number" inputmode="numeric" id="dhw-min-temp" name="dhw[minTemp]" min="0" max="0" step="1" required>
|
|
</label>
|
|
|
|
<label for="dhw-max-temp">
|
|
<span data-i18n>settings.temp.max</span>
|
|
<input type="number" inputmode="numeric" id="dhw-max-temp" name="dhw[maxTemp]" min="0" max="0" step="1" required>
|
|
</label>
|
|
</div>
|
|
|
|
<button type="submit" data-i18n>button.save</button>
|
|
</form>
|
|
</div>
|
|
</details>
|
|
|
|
<hr />
|
|
|
|
<details>
|
|
<summary><b data-i18n>settings.section.emergency</b></summary>
|
|
<div>
|
|
<div id="emergency-settings-busy" aria-busy="true"></div>
|
|
<form action="/api/settings" id="emergency-settings" class="hidden">
|
|
<fieldset>
|
|
<small data-i18n>settings.emergency.desc</small>
|
|
</fieldset>
|
|
|
|
<div class="grid">
|
|
<label for="emergency-target">
|
|
<span data-i18n>settings.emergency.target.title</span>
|
|
<input type="number" inputmode="numeric" id="emergency-target" name="emergency[target]" min="0" max="0" step="1" required>
|
|
<small data-i18n>settings.emergency.target.note</small>
|
|
</label>
|
|
|
|
<label for="emergency-treshold-time">
|
|
<span data-i18n>settings.emergency.treshold</span>
|
|
<input type="number" inputmode="numeric" id="emergency-treshold-time" name="emergency[tresholdTime]" min="60" max="1800" step="1" required>
|
|
</label>
|
|
</div>
|
|
|
|
<button type="submit" data-i18n>button.save</button>
|
|
</form>
|
|
</div>
|
|
</details>
|
|
|
|
<hr />
|
|
|
|
<details>
|
|
<summary><b data-i18n>settings.section.equitherm</b></summary>
|
|
<div>
|
|
<div id="equitherm-settings-busy" aria-busy="true"></div>
|
|
<form action="/api/settings" id="equitherm-settings" class="hidden">
|
|
<fieldset>
|
|
<label for="equitherm-enable">
|
|
<input type="checkbox" id="equitherm-enable" name="equitherm[enable]" value="true">
|
|
<span data-i18n>settings.enable</span>
|
|
</label>
|
|
</fieldset>
|
|
|
|
<div class="grid">
|
|
<label for="equitherm-n-factor">
|
|
<span data-i18n>settings.equitherm.n</span>
|
|
<input type="number" inputmode="numeric" id="equitherm-n-factor" name="equitherm[n_factor]" min="0.001" max="10" step="0.001" required>
|
|
</label>
|
|
|
|
<label for="equitherm-k-factor">
|
|
<span data-i18n>settings.equitherm.k</span>
|
|
<input type="number" inputmode="numeric" id="equitherm-k-factor" name="equitherm[k_factor]" min="0" max="10" step="0.01" required>
|
|
</label>
|
|
|
|
<label for="equitherm-t-factor">
|
|
<span data-i18n>settings.equitherm.t.title</span>
|
|
<input type="number" inputmode="numeric" id="equitherm-t-factor" name="equitherm[t_factor]" min="0" max="10" step="0.01" required>
|
|
<small data-i18n>settings.equitherm.t.note</small>
|
|
</label>
|
|
</div>
|
|
|
|
<button type="submit" data-i18n>button.save</button>
|
|
</form>
|
|
</div>
|
|
</details>
|
|
|
|
<hr />
|
|
|
|
<details>
|
|
<summary><b data-i18n>settings.section.pid</b></summary>
|
|
<div>
|
|
<div id="pid-settings-busy" aria-busy="true"></div>
|
|
<form action="/api/settings" id="pid-settings" class="hidden">
|
|
<fieldset>
|
|
<label for="pid-enable">
|
|
<input type="checkbox" id="pid-enable" name="pid[enable]" value="true">
|
|
<span data-i18n>settings.enable</span>
|
|
</label>
|
|
</fieldset>
|
|
|
|
<div class="grid">
|
|
<label for="pid-p-factor">
|
|
<span data-i18n>settings.pid.p</span>
|
|
<input type="number" inputmode="numeric" id="pid-p-factor" name="pid[p_factor]" min="0.1" max="1000" step="0.01" required>
|
|
</label>
|
|
|
|
<label for="pid-i-factor">
|
|
<span data-i18n>settings.pid.i</span>
|
|
<input type="number" inputmode="numeric" id="pid-i-factor" name="pid[i_factor]" min="0" max="100" step="0.0001" required>
|
|
</label>
|
|
|
|
<label for="pid-d-factor">
|
|
<span data-i18n>settings.pid.d</span>
|
|
<input type="number" inputmode="numeric" id="pid-d-factor" name="pid[d_factor]" min="0" max="100000" step="0.1" required>
|
|
</label>
|
|
</div>
|
|
|
|
<label for="pid-dt">
|
|
<span data-i18n>settings.pid.dt</span>
|
|
<input type="number" inputmode="numeric" id="pid-dt" name="pid[dt]" min="30" max="1800" step="1" required>
|
|
</label>
|
|
|
|
<hr />
|
|
|
|
<div class="grid">
|
|
<label for="pid-min-temp">
|
|
<span data-i18n>settings.temp.min</span>
|
|
<input type="number" inputmode="numeric" id="pid-min-temp" name="pid[minTemp]" min="0" max="0" step="1" required>
|
|
</label>
|
|
|
|
<label for="pid-max-temp">
|
|
<span data-i18n>settings.temp.max</span>
|
|
<input type="number" inputmode="numeric" id="pid-max-temp" name="pid[maxTemp]" min="0" max="0" step="1" required>
|
|
</label>
|
|
</div>
|
|
|
|
<small data-i18n>settings.pid.noteMinMaxTemp</small>
|
|
|
|
<button type="submit" data-i18n>button.save</button>
|
|
</form>
|
|
</div>
|
|
</details>
|
|
|
|
<hr />
|
|
|
|
<details>
|
|
<summary><b data-i18n>settings.section.ot</b></summary>
|
|
<div>
|
|
<div id="opentherm-settings-busy" aria-busy="true"></div>
|
|
<form action="/api/settings" id="opentherm-settings" class="hidden">
|
|
<fieldset>
|
|
<legend data-i18n>settings.system.unit</legend>
|
|
|
|
<label>
|
|
<input type="radio" class="opentherm-unit-system" name="opentherm[unitSystem]" value="0" />
|
|
<span data-i18n>settings.system.metric</span>
|
|
</label>
|
|
|
|
<label>
|
|
<input type="radio" class="opentherm-unit-system" name="opentherm[unitSystem]" value="1" />
|
|
<span data-i18n>settings.system.imperial</span>
|
|
</label>
|
|
</fieldset>
|
|
|
|
<div class="grid">
|
|
<label for="opentherm-in-gpio">
|
|
<span data-i18n>settings.ot.inGpio</span>
|
|
<input type="number" inputmode="numeric" id="opentherm-in-gpio" name="opentherm[inGpio]" min="0" max="254" step="1">
|
|
</label>
|
|
|
|
<label for="opentherm-in-gpio">
|
|
<span data-i18n>settings.ot.outGpio</span>
|
|
<input type="number" inputmode="numeric" id="opentherm-out-gpio" name="opentherm[outGpio]" min="0" max="254" step="1">
|
|
</label>
|
|
|
|
<label for="opentherm-rx-led-gpio">
|
|
<span data-i18n>settings.ot.ledGpio</span>
|
|
<input type="number" inputmode="numeric" id="opentherm-rx-led-gpio" name="opentherm[rxLedGpio]" min="0" max="254" step="1">
|
|
<small data-i18n>settings.note.blankNotUse</small>
|
|
</label>
|
|
</div>
|
|
|
|
<div class="grid">
|
|
<label for="opentherm-member-id-code">
|
|
<span data-i18n>settings.ot.memberId</span>
|
|
<input type="number" inputmode="numeric" id="opentherm-member-id" name="opentherm[memberId]" min="0" max="255" step="1" required>
|
|
</label>
|
|
|
|
<label for="opentherm-flags">
|
|
<span data-i18n>settings.ot.flags</span>
|
|
<input type="number" inputmode="numeric" id="opentherm-flags" name="opentherm[flags]" min="0" max="255" step="1" required>
|
|
</label>
|
|
|
|
<label for="opentherm-max-modulation">
|
|
<span data-i18n>settings.ot.maxMod</span>
|
|
<input type="number" inputmode="numeric" id="opentherm-max-modulation" name="opentherm[maxModulation]" min="1" max="100" step="1" required>
|
|
</label>
|
|
</div>
|
|
|
|
<div class="grid">
|
|
<label for="opentherm-min-power">
|
|
<span data-i18n>settings.ot.minPower.title</span>
|
|
<input type="number" inputmode="numeric" id="opentherm-min-power" name="opentherm[minPower]" min="0" max="1000" step="0.1">
|
|
<small data-i18n>settings.ot.minPower.note</small>
|
|
</label>
|
|
|
|
<label for="opentherm-max-power">
|
|
<span data-i18n>settings.ot.maxPower.title</span>
|
|
<input type="number" inputmode="numeric" id="opentherm-max-power" name="opentherm[maxPower]" min="0" max="1000" step="0.1">
|
|
<small data-i18n>settings.ot.maxPower.note</small>
|
|
</label>
|
|
</div>
|
|
|
|
<fieldset>
|
|
<legend data-i18n>settings.ot.options.desc</legend>
|
|
|
|
<label for="opentherm-dhw-present">
|
|
<input type="checkbox" id="opentherm-dhw-present" name="opentherm[dhwPresent]" value="true">
|
|
<span data-i18n>settings.ot.options.dhwPresent</span>
|
|
</label>
|
|
|
|
<label for="opentherm-sw-mode">
|
|
<input type="checkbox" id="opentherm-sw-mode" name="opentherm[summerWinterMode]" value="true">
|
|
<span data-i18n>settings.ot.options.summerWinterMode</span>
|
|
</label>
|
|
|
|
<label for="opentherm-heating-ch2-enabled">
|
|
<input type="checkbox" id="opentherm-heating-ch2-enabled" name="opentherm[heatingCh2Enabled]" value="true">
|
|
<span data-i18n>settings.ot.options.heatingCh2Enabled</span>
|
|
</label>
|
|
|
|
<label for="opentherm-heating-ch1-to-ch2">
|
|
<input type="checkbox" id="opentherm-heating-ch1-to-ch2" name="opentherm[heatingCh1ToCh2]" value="true">
|
|
<span data-i18n>settings.ot.options.heatingCh1ToCh2</span>
|
|
</label>
|
|
|
|
<label for="opentherm-dhw-to-ch2">
|
|
<input type="checkbox" id="opentherm-dhw-to-ch2" name="opentherm[dhwToCh2]" value="true">
|
|
<span data-i18n>settings.ot.options.dhwToCh2</span>
|
|
</label>
|
|
|
|
<label for="opentherm-dhw-blocking">
|
|
<input type="checkbox" id="opentherm-dhw-blocking" name="opentherm[dhwBlocking]" value="true">
|
|
<span data-i18n>settings.ot.options.dhwBlocking</span>
|
|
</label>
|
|
|
|
<label for="opentherm-sync-modulation-with-heating">
|
|
<input type="checkbox" id="opentherm-sync-modulation-with-heating" name="opentherm[modulationSyncWithHeating]" value="true">
|
|
<span data-i18n>settings.ot.options.modulationSyncWithHeating</span>
|
|
</label>
|
|
|
|
<label for="opentherm-get-min-max-temp">
|
|
<input type="checkbox" id="opentherm-get-min-max-temp" name="opentherm[getMinMaxTemp]" value="true">
|
|
<span data-i18n>settings.ot.options.getMinMaxTemp</span>
|
|
</label>
|
|
|
|
<label for="opentherm-immergas-fix">
|
|
<input type="checkbox" id="opentherm-immergas-fix" name="opentherm[immergasFix]" value="true">
|
|
<span data-i18n>settings.ot.options.immergasFix</span>
|
|
</label>
|
|
|
|
<hr />
|
|
<label for="opentherm-native-heating-control">
|
|
<input type="checkbox" id="opentherm-native-heating-control" name="opentherm[nativeHeatingControl]" value="true">
|
|
<span data-i18n>settings.ot.nativeHeating.title</span><br />
|
|
<small data-i18n>settings.ot.nativeHeating.note</small>
|
|
</label>
|
|
</fieldset>
|
|
|
|
<button type="submit" data-i18n>button.save</button>
|
|
</form>
|
|
</div>
|
|
</details>
|
|
|
|
<hr />
|
|
|
|
<details>
|
|
<summary><b data-i18n>settings.section.mqtt</b></summary>
|
|
<div>
|
|
<div id="mqtt-settings-busy" aria-busy="true"></div>
|
|
<form action="/api/settings" id="mqtt-settings" class="hidden">
|
|
<fieldset>
|
|
<label for="mqtt-enable">
|
|
<input type="checkbox" id="mqtt-enable" name="mqtt[enable]" value="true">
|
|
<span data-i18n>settings.enable</span>
|
|
</label>
|
|
|
|
<label for="mqtt-ha-discovery">
|
|
<input type="checkbox" id="mqtt-ha-discovery" name="mqtt[homeAssistantDiscovery]" value="true">
|
|
<span data-i18n>settings.mqtt.homeAssistantDiscovery</span>
|
|
</label>
|
|
</fieldset>
|
|
|
|
<div class="grid">
|
|
<label for="mqtt-server">
|
|
<span data-i18n>settings.mqtt.server</span>
|
|
<input type="text" id="mqtt-server" name="mqtt[server]" maxlength="80" required>
|
|
</label>
|
|
|
|
<label for="mqtt-port">
|
|
<span data-i18n>settings.mqtt.port</span>
|
|
<input type="number" inputmode="numeric" id="mqtt-port" name="mqtt[port]" min="1" max="65535" step="1" required>
|
|
</label>
|
|
</div>
|
|
|
|
<div class="grid">
|
|
<label for="mqtt-user">
|
|
<span data-i18n>settings.mqtt.user</span>
|
|
<input type="text" id="mqtt-user" name="mqtt[user]" maxlength="32" required>
|
|
</label>
|
|
|
|
<label for="mqtt-password">
|
|
<span data-i18n>settings.mqtt.password</span>
|
|
<input type="password" id="mqtt-password" name="mqtt[password]" maxlength="32">
|
|
</label>
|
|
</div>
|
|
|
|
<div class="grid">
|
|
<label for="mqtt-prefix">
|
|
<span data-i18n>settings.mqtt.prefix</span>
|
|
<input type="text" id="mqtt-prefix" name="mqtt[prefix]" maxlength="32" required>
|
|
</label>
|
|
|
|
<label for="mqtt-interval">
|
|
<span data-i18n>settings.mqtt.interval</span>
|
|
<input type="number" inputmode="numeric" id="mqtt-interval" name="mqtt[interval]" min="3" max="60" step="1" required>
|
|
</label>
|
|
</div>
|
|
|
|
<button type="submit" data-i18n>button.save</button>
|
|
</form>
|
|
</div>
|
|
</details>
|
|
|
|
<hr />
|
|
|
|
<details>
|
|
<summary><b data-i18n>settings.section.extPump</b></summary>
|
|
<div>
|
|
<div id="extpump-settings-busy" aria-busy="true"></div>
|
|
<form action="/api/settings" id="extpump-settings" class="hidden">
|
|
<fieldset>
|
|
<label for="extpump-use">
|
|
<input type="checkbox" id="extpump-use" name="externalPump[use]" value="true">
|
|
<span data-i18n>settings.extPump.use</span>
|
|
</label>
|
|
</fieldset>
|
|
|
|
<div class="grid">
|
|
<label for="extpump-gpio">
|
|
<span data-i18n>settings.extPump.gpio</span>
|
|
<input type="number" inputmode="numeric" id="extpump-gpio" name="externalPump[gpio]" min="0" max="254" step="1">
|
|
</label>
|
|
|
|
<label for="extpump-pc-time">
|
|
<span data-i18n>settings.extPump.postCirculationTime</span>
|
|
<input type="number" inputmode="numeric" id="extpump-pc-time" name="externalPump[postCirculationTime]" min="1" max="120" step="1" required>
|
|
</label>
|
|
</div>
|
|
|
|
<div class="grid">
|
|
<label for="extpump-as-interval">
|
|
<span data-i18n>settings.extPump.antiStuckInterval</span>
|
|
<input type="number" inputmode="numeric" id="extpump-as-interval" name="externalPump[antiStuckInterval]" min="1" max="366" step="1" required>
|
|
</label>
|
|
|
|
<label for="extpump-as-time">
|
|
<span data-i18n>settings.extPump.antiStuckTime</span>
|
|
<input type="number" inputmode="numeric" id="extpump-as-time" name="externalPump[antiStuckTime]" min="1" max="20" step="1" 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>
|
|
<div id="cc-settings-busy" aria-busy="true"></div>
|
|
<form action="/api/settings" id="cc-settings" class="hidden">
|
|
<fieldset>
|
|
<label for="cc-input-enable">
|
|
<input type="checkbox" id="cc-input-enable" name="cascadeControl[input][enable]" value="true">
|
|
<span data-i18n>settings.cascadeControl.input.enable</span>
|
|
<br />
|
|
<small data-i18n>settings.cascadeControl.input.desc</small>
|
|
</label>
|
|
|
|
<label for="cc-input-invert-state">
|
|
<input type="checkbox" id="cc-input-invert-state" name="cascadeControl[input][invertState]" value="true">
|
|
<span data-i18n>settings.cascadeControl.input.invertState</span>
|
|
</label>
|
|
</fieldset>
|
|
|
|
<div class="grid">
|
|
<label for="cc-input-gpio">
|
|
<span data-i18n>settings.cascadeControl.input.gpio</span>
|
|
<input type="number" inputmode="numeric" id="cc-input-gpio" name="cascadeControl[input][gpio]" min="0" max="254" step="1">
|
|
</label>
|
|
|
|
<label for="cc-input-tt">
|
|
<span data-i18n>settings.cascadeControl.input.thresholdTime</span>
|
|
<input type="number" inputmode="numeric" id="cc-input-tt" name="cascadeControl[input][thresholdTime]" min="5" max="600" step="1" required>
|
|
</label>
|
|
</div>
|
|
|
|
<hr />
|
|
|
|
<fieldset>
|
|
<label for="cc-output-enable">
|
|
<input type="checkbox" id="cc-output-enable" name="cascadeControl[output][enable]" value="true">
|
|
<span data-i18n>settings.cascadeControl.output.enable</span>
|
|
<br />
|
|
<small data-i18n>settings.cascadeControl.output.desc</small>
|
|
</label>
|
|
|
|
<label for="cc-output-invert-state">
|
|
<input type="checkbox" id="cc-output-invert-state" name="cascadeControl[output][invertState]" value="true">
|
|
<span data-i18n>settings.cascadeControl.output.invertState</span>
|
|
</label>
|
|
</fieldset>
|
|
|
|
<div class="grid">
|
|
<label for="cc-output-gpio">
|
|
<span data-i18n>settings.cascadeControl.output.gpio</span>
|
|
<input type="number" outputmode="numeric" id="cc-output-gpio" name="cascadeControl[output][gpio]" min="0" max="254" step="1">
|
|
</label>
|
|
|
|
<label for="cc-output-tt">
|
|
<span data-i18n>settings.cascadeControl.output.thresholdTime</span>
|
|
<input type="number" outputmode="numeric" id="cc-output-tt" name="cascadeControl[output][thresholdTime]" min="5" max="600" step="1" required>
|
|
</label>
|
|
</div>
|
|
|
|
<fieldset>
|
|
<legend data-i18n>settings.cascadeControl.output.events.desc</legend>
|
|
|
|
<label for="cc-on-fault">
|
|
<input type="checkbox" id="cc-on-fault" name="cascadeControl[output][onFault]" value="true">
|
|
<span data-i18n>settings.cascadeControl.output.events.onFault</span>
|
|
</label>
|
|
|
|
<label for="cc-on-loss-conn">
|
|
<input type="checkbox" id="cc-on-loss-conn" name="cascadeControl[output][onLossConnection]" value="true">
|
|
<span data-i18n>settings.cascadeControl.output.events.onLossConnection</span>
|
|
</label>
|
|
|
|
<label for="cc-on-enabled-heating">
|
|
<input type="checkbox" id="cc-on-enabled-heating" name="cascadeControl[output][onEnabledHeating]" value="true">
|
|
<span data-i18n>settings.cascadeControl.output.events.onEnabledHeating</span>
|
|
</label>
|
|
</fieldset>
|
|
|
|
<button type="submit" data-i18n>button.save</button>
|
|
</form>
|
|
</div>
|
|
</details>
|
|
</article>
|
|
</main>
|
|
|
|
<footer class="container">
|
|
<small>
|
|
<b>Made by Laxilef</b>
|
|
• <a href="https://github.com/Laxilef/OTGateway/blob/master/LICENSE" target="_blank" class="secondary" data-i18n>nav.license</a>
|
|
• <a href="https://github.com/Laxilef/OTGateway/blob/master/" target="_blank" class="secondary" data-i18n>nav.source</a>
|
|
• <a href="https://github.com/Laxilef/OTGateway/wiki" target="_blank" class="secondary" data-i18n>nav.help</a>
|
|
• <a href="https://github.com/Laxilef/OTGateway/issues" target="_blank" class="secondary" data-i18n>nav.issues</a>
|
|
• <a href="https://github.com/Laxilef/OTGateway/releases" target="_blank" class="secondary" data-i18n>nav.releases</a>
|
|
</small>
|
|
</footer>
|
|
|
|
<script src="/static/app.js"></script>
|
|
<script>
|
|
document.addEventListener('DOMContentLoaded', async () => {
|
|
const lang = new Lang(document.getElementById('lang'));
|
|
lang.build();
|
|
|
|
const fillData = (data) => {
|
|
// System
|
|
setSelectValue('#system-log-level', data.system.logLevel);
|
|
setCheckboxValue('#system-serial-enable', data.system.serial.enabled);
|
|
setSelectValue('#system-serial-baudrate', data.system.serial.baudrate);
|
|
setCheckboxValue('#system-telnet-enable', data.system.telnet.enabled);
|
|
setInputValue('#system-telnet-port', data.system.telnet.port);
|
|
setRadioValue('.system-unit-system', data.system.unitSystem);
|
|
setInputValue('#system-status-led-gpio', data.system.statusLedGpio < 255 ? data.system.statusLedGpio : '');
|
|
setBusy('#system-settings-busy', '#system-settings', false);
|
|
|
|
// Portal
|
|
setCheckboxValue('#portal-auth', data.portal.auth);
|
|
setInputValue('#portal-login', data.portal.login);
|
|
setInputValue('#portal-password', data.portal.password);
|
|
setBusy('#portal-settings-busy', '#portal-settings', false);
|
|
|
|
// Opentherm
|
|
setRadioValue('.opentherm-unit-system', data.opentherm.unitSystem);
|
|
setInputValue('#opentherm-in-gpio', data.opentherm.inGpio < 255 ? data.opentherm.inGpio : '');
|
|
setInputValue('#opentherm-out-gpio', data.opentherm.outGpio < 255 ? data.opentherm.outGpio : '');
|
|
setInputValue('#opentherm-rx-led-gpio', data.opentherm.rxLedGpio < 255 ? data.opentherm.rxLedGpio : '');
|
|
setInputValue('#opentherm-member-id', data.opentherm.memberId);
|
|
setInputValue('#opentherm-flags', data.opentherm.flags);
|
|
setInputValue('#opentherm-max-modulation', data.opentherm.maxModulation);
|
|
setInputValue('#opentherm-min-power', data.opentherm.minPower);
|
|
setInputValue('#opentherm-max-power', data.opentherm.maxPower);
|
|
setCheckboxValue('#opentherm-dhw-present', data.opentherm.dhwPresent);
|
|
setCheckboxValue('#opentherm-sw-mode', data.opentherm.summerWinterMode);
|
|
setCheckboxValue('#opentherm-heating-ch2-enabled', data.opentherm.heatingCh2Enabled);
|
|
setCheckboxValue('#opentherm-heating-ch1-to-ch2', data.opentherm.heatingCh1ToCh2);
|
|
setCheckboxValue('#opentherm-dhw-to-ch2', data.opentherm.dhwToCh2);
|
|
setCheckboxValue('#opentherm-dhw-blocking', data.opentherm.dhwBlocking);
|
|
setCheckboxValue('#opentherm-sync-modulation-with-heating', data.opentherm.modulationSyncWithHeating);
|
|
setCheckboxValue('#opentherm-get-min-max-temp', data.opentherm.getMinMaxTemp);
|
|
setCheckboxValue('#opentherm-native-heating-control', data.opentherm.nativeHeatingControl);
|
|
setCheckboxValue('#opentherm-immergas-fix', data.opentherm.immergasFix);
|
|
setBusy('#opentherm-settings-busy', '#opentherm-settings', false);
|
|
|
|
// MQTT
|
|
setCheckboxValue('#mqtt-enable', data.mqtt.enabled);
|
|
setCheckboxValue('#mqtt-ha-discovery', data.mqtt.homeAssistantDiscovery);
|
|
setInputValue('#mqtt-server', data.mqtt.server);
|
|
setInputValue('#mqtt-port', data.mqtt.port);
|
|
setInputValue('#mqtt-user', data.mqtt.user);
|
|
setInputValue('#mqtt-password', data.mqtt.password);
|
|
setInputValue('#mqtt-prefix', data.mqtt.prefix);
|
|
setInputValue('#mqtt-interval', data.mqtt.interval);
|
|
setBusy('#mqtt-settings-busy', '#mqtt-settings', false);
|
|
|
|
// Extpump
|
|
setCheckboxValue('#extpump-use', data.externalPump.use);
|
|
setInputValue('#extpump-gpio', data.externalPump.gpio < 255 ? data.externalPump.gpio : '');
|
|
setInputValue('#extpump-pc-time', data.externalPump.postCirculationTime);
|
|
setInputValue('#extpump-as-interval', data.externalPump.antiStuckInterval);
|
|
setInputValue('#extpump-as-time', data.externalPump.antiStuckTime);
|
|
setBusy('#extpump-settings-busy', '#extpump-settings', false);
|
|
|
|
// Cascade control
|
|
setCheckboxValue('#cc-input-enable', data.cascadeControl.input.enabled);
|
|
setInputValue('#cc-input-gpio', data.cascadeControl.input.gpio < 255 ? data.cascadeControl.input.gpio : '');
|
|
setCheckboxValue('#cc-input-invert-state', data.cascadeControl.input.invertState);
|
|
setInputValue('#cc-input-tt', data.cascadeControl.input.thresholdTime);
|
|
|
|
setCheckboxValue('#cc-output-enable', data.cascadeControl.output.enabled);
|
|
setInputValue('#cc-output-gpio', data.cascadeControl.output.gpio < 255 ? data.cascadeControl.output.gpio : '');
|
|
setCheckboxValue('#cc-output-invert-state', data.cascadeControl.output.invertState);
|
|
setInputValue('#cc-output-tt', data.cascadeControl.output.thresholdTime);
|
|
setCheckboxValue('#cc-on-fault', data.cascadeControl.output.onFault);
|
|
setCheckboxValue('#cc-on-loss-conn', data.cascadeControl.output.onLossConnection);
|
|
setCheckboxValue('#cc-on-enabled-heating', data.cascadeControl.output.onEnabledHeating);
|
|
setBusy('#cc-settings-busy', '#cc-settings', false);
|
|
|
|
// Heating
|
|
setInputValue('#heating-min-temp', data.heating.minTemp, {
|
|
"min": data.system.unitSystem == 0 ? 0 : 32,
|
|
"max": data.system.unitSystem == 0 ? 99 : 211
|
|
});
|
|
setInputValue('#heating-max-temp', data.heating.maxTemp, {
|
|
"min": data.system.unitSystem == 0 ? 1 : 33,
|
|
"max": data.system.unitSystem == 0 ? 100 : 212
|
|
});
|
|
setInputValue('#heating-hysteresis', data.heating.hysteresis);
|
|
setInputValue('#heating-turbo-factor', data.heating.turboFactor);
|
|
setBusy('#heating-settings-busy', '#heating-settings', false);
|
|
|
|
// DHW
|
|
setInputValue('#dhw-min-temp', data.dhw.minTemp, {
|
|
"min": data.system.unitSystem == 0 ? 0 : 32,
|
|
"max": data.system.unitSystem == 0 ? 99 : 211
|
|
});
|
|
setInputValue('#dhw-max-temp', data.dhw.maxTemp, {
|
|
"min": data.system.unitSystem == 0 ? 1 : 33,
|
|
"max": data.system.unitSystem == 0 ? 100 : 212
|
|
});
|
|
setBusy('#dhw-settings-busy', '#dhw-settings', false);
|
|
|
|
// Emergency mode
|
|
setInputValue('#emergency-treshold-time', data.emergency.tresholdTime);
|
|
if (data.opentherm.nativeHeatingControl) {
|
|
setInputValue('#emergency-target', data.emergency.target, {
|
|
"min": data.system.unitSystem == 0 ? 5 : 41,
|
|
"max": data.system.unitSystem == 0 ? 30 : 86
|
|
});
|
|
|
|
} else {
|
|
setInputValue('#emergency-target', data.emergency.target, {
|
|
"min": data.heating.minTemp,
|
|
"max": data.heating.maxTemp,
|
|
});
|
|
}
|
|
|
|
setBusy('#emergency-settings-busy', '#emergency-settings', false);
|
|
|
|
// Equitherm
|
|
setCheckboxValue('#equitherm-enable', data.equitherm.enabled);
|
|
setInputValue('#equitherm-n-factor', data.equitherm.n_factor);
|
|
setInputValue('#equitherm-k-factor', data.equitherm.k_factor);
|
|
setInputValue('#equitherm-t-factor', data.equitherm.t_factor);
|
|
setBusy('#equitherm-settings-busy', '#equitherm-settings', false);
|
|
|
|
// PID
|
|
setCheckboxValue('#pid-enable', data.pid.enabled);
|
|
setInputValue('#pid-p-factor', data.pid.p_factor);
|
|
setInputValue('#pid-i-factor', data.pid.i_factor);
|
|
setInputValue('#pid-d-factor', data.pid.d_factor);
|
|
setInputValue('#pid-dt', data.pid.dt);
|
|
setInputValue('#pid-min-temp', data.pid.minTemp, {
|
|
"min": data.equitherm.enabled ? (data.system.unitSystem == 0 ? -100 : -146) : (data.system.unitSystem == 0 ? 0 : 32),
|
|
"max": (data.system.unitSystem == 0 ? 99 : 211)
|
|
});
|
|
setInputValue('#pid-max-temp', data.pid.maxTemp, {
|
|
"min": (data.system.unitSystem == 0 ? 0 : 33),
|
|
"max": (data.system.unitSystem == 0 ? 100 : 212)
|
|
});
|
|
setBusy('#pid-settings-busy', '#pid-settings', false);
|
|
};
|
|
|
|
try {
|
|
const response = await fetch('/api/settings', { cache: 'no-cache' });
|
|
if (!response.ok) {
|
|
throw new Error('Response not valid');
|
|
}
|
|
|
|
const result = await response.json();
|
|
fillData(result);
|
|
|
|
setupForm('#portal-settings', fillData, ['portal.login', 'portal.password']);
|
|
setupForm('#system-settings', fillData);
|
|
setupForm('#heating-settings', fillData);
|
|
setupForm('#dhw-settings', fillData);
|
|
setupForm('#emergency-settings', fillData);
|
|
setupForm('#equitherm-settings', fillData);
|
|
setupForm('#pid-settings', fillData);
|
|
setupForm('#opentherm-settings', fillData);
|
|
setupForm('#mqtt-settings', fillData, ['mqtt.user', 'mqtt.password', 'mqtt.prefix']);
|
|
setupForm('#extpump-settings', fillData);
|
|
setupForm('#cc-settings', fillData);
|
|
|
|
} catch (error) {
|
|
console.log(error);
|
|
}
|
|
});
|
|
</script>
|
|
</body>
|
|
</html> |