This commit is contained in:
Mateusz Gruszczyński
2026-09-02 09:27:24 +02:00
parent 87b68187e7
commit 8180d22cef
7 changed files with 16 additions and 16 deletions
Generated
+1 -1
View File
@@ -633,7 +633,7 @@ dependencies = [
[[package]] [[package]]
name = "gree-controller" name = "gree-controller"
version = "0.9.13" version = "0.9.14"
dependencies = [ dependencies = [
"aes", "aes",
"aes-gcm", "aes-gcm",
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "gree-controller" name = "gree-controller"
version = "0.9.13" version = "0.9.14"
edition = "2021" edition = "2021"
authors = ["GREE Controller contributors"] authors = ["GREE Controller contributors"]
description = "Standalone local GREE HVAC controller with Web UI, SQLite and Home Assistant sensor support" description = "Standalone local GREE HVAC controller with Web UI, SQLite and Home Assistant sensor support"
+1 -1
View File
@@ -2,7 +2,7 @@
Self-hosted controller for GREE-compatible air conditioners with a local Web UI, thermostat zones, schedules, Home Assistant integration, history, notifications and a documented HTTP/WebSocket API. Self-hosted controller for GREE-compatible air conditioners with a local Web UI, thermostat zones, schedules, Home Assistant integration, history, notifications and a documented HTTP/WebSocket API.
**Current release: 0.9.13** **Current release: 0.9.14**
> [Full API reference](docs/API.md) — authentication, every endpoint, request bodies, response models, WebSocket events and examples. > [Full API reference](docs/API.md) — authentication, every endpoint, request bodies, response models, WebSocket events and examples.
+3 -3
View File
@@ -1,6 +1,6 @@
# GREE Controller API reference # GREE Controller API reference
HTTP and WebSocket API for GREE Controller **0.9.13**. HTTP and WebSocket API for GREE Controller **0.9.14**.
[← Main documentation](../README.md) [← Main documentation](../README.md)
@@ -213,7 +213,7 @@ Response:
{ {
"status": "ok", "status": "ok",
"name": "gree-controller", "name": "gree-controller",
"version": "0.9.13", "version": "0.9.14",
"uptime_seconds": 1234, "uptime_seconds": 1234,
"control_ready": true, "control_ready": true,
"time": "2026-08-30T06:54:00Z" "time": "2026-08-30T06:54:00Z"
@@ -237,7 +237,7 @@ Returns the initial Web UI snapshot:
"settings": {}, "settings": {},
"outdoor_temperature": null, "outdoor_temperature": null,
"system": { "system": {
"version": "0.9.13", "version": "0.9.14",
"uptime_seconds": 1234, "uptime_seconds": 1234,
"auth_required": false, "auth_required": false,
"control_ready": true, "control_ready": true,
@@ -1,7 +1,7 @@
{ {
"domain": "gree_controller", "domain": "gree_controller",
"name": "GREE Controller", "name": "GREE Controller",
"version": "0.9.13", "version": "0.9.14",
"config_flow": true, "config_flow": true,
"integration_type": "hub", "integration_type": "hub",
"iot_class": "local_polling", "iot_class": "local_polling",
+2 -3
View File
@@ -243,8 +243,7 @@
</div> </div>
<div class="simulation-head-actions"><button class="secondary" id="simulationOpenTab" <div class="simulation-head-actions"><button class="secondary" id="simulationOpenTab"
data-i18n="simulation.openTab">Open only simulator in new tab</button><button class="secondary" data-i18n="simulation.openTab">Open only simulator in new tab</button><button class="secondary"
id="simulationFullscreen" data-i18n="simulation.fullscreen">Full screen</button><button class="secondary" id="simulationFullscreen" data-i18n="simulation.fullscreen">Full screen</button></div>
id="simulationRefresh" data-i18n="actions.refresh">Refresh</button></div>
</div> </div>
<p class="lead" data-i18n="simulation.description">Live preview of the thermostat and automation logic. The flow <p class="lead" data-i18n="simulation.description">Live preview of the thermostat and automation logic. The flow
board shows how sensor readings, schedules, night mode and thermostat decisions become commands sent to each board shows how sensor readings, schedules, night mode and thermostat decisions become commands sent to each
@@ -731,7 +730,7 @@
<div id="flowSharedInputTestPanel" class="flow-shared-test-panel" hidden> <div id="flowSharedInputTestPanel" class="flow-shared-test-panel" hidden>
<div><strong data-i18n="flow.sharedInputTest">Testuj wejście HA</strong><p class="field-note" data-i18n="flow.sharedInputTestHint">Test używa zapisanej konfiguracji połączenia Home Assistant i nie zapisuje tego wejścia.</p></div> <div><strong data-i18n="flow.sharedInputTest">Testuj wejście HA</strong><p class="field-note" data-i18n="flow.sharedInputTestHint">Test używa zapisanej konfiguracji połączenia Home Assistant i nie zapisuje tego wejścia.</p></div>
<button type="button" class="secondary" id="flowSharedInputTest" data-i18n="flow.sharedInputTest">Testuj wejście HA</button> <button type="button" class="secondary" id="flowSharedInputTest" data-i18n="flow.sharedInputTest">Testuj wejście HA</button>
<div id="flowSharedInputTestResult" class="flow-shared-test-result" hidden></div> <div id="flowSharedInputTestResult" class="flow-shared-test-result" role="status" aria-live="polite" hidden></div>
</div> </div>
<div class="form-actions"><button type="button" class="secondary" data-close data-i18n="actions.cancel">Anuluj</button><button type="submit" class="primary" data-i18n="actions.save">Zapisz</button></div> <div class="form-actions"><button type="button" class="secondary" data-close data-i18n="actions.cancel">Anuluj</button><button type="submit" class="primary" data-i18n="actions.save">Zapisz</button></div>
</form> </form>
+7 -6
View File
@@ -255,11 +255,6 @@ $('#haTest').addEventListener('click', async event => {
finally { button.disabled = false; button.textContent = idle; } finally { button.disabled = false; button.textContent = idle; }
}); });
$('#simulationRefresh')?.addEventListener('click', async () => {
try { await loadControlPlan(); toast(tr('common.updated')); }
catch (error) { toast(error.message, true); }
});
$('#exportSettings').addEventListener('click', async () => { $('#exportSettings').addEventListener('click', async () => {
try { try {
const data = await api('/api/settings/export'); const data = await api('/api/settings/export');
@@ -327,7 +322,13 @@ $('#flowSharedInputTest')?.addEventListener('click', async event => {
if (!form || !resultHost) return; if (!form || !resultHost) return;
const kind = form.kind.value, config = collectFlowSharedInputConfig(kind); const kind = form.kind.value, config = collectFlowSharedInputConfig(kind);
const entityId = String(config.entity_id || '').trim(); const entityId = String(config.entity_id || '').trim();
if (!entityId) return toast(tr('flow.sharedInputTestEntityRequired'), true); if (!entityId) {
resultHost.hidden = false;
resultHost.classList.remove('pass');
resultHost.classList.add('fail');
resultHost.innerHTML = `<strong>${esc(tr('flow.sharedInputTestUnavailable'))}</strong><span>${esc(tr('flow.sharedInputTestEntityRequired'))}</span>`;
return;
}
const button = event.currentTarget, idle = button.textContent; const button = event.currentTarget, idle = button.textContent;
button.disabled = true; button.textContent = tr('flow.sharedInputTesting'); button.disabled = true; button.textContent = tr('flow.sharedInputTesting');
resultHost.hidden = false; resultHost.innerHTML = `<span>${esc(tr('flow.sharedInputTesting'))}</span>`; resultHost.hidden = false; resultHost.innerHTML = `<span>${esc(tr('flow.sharedInputTesting'))}</span>`;