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]]
name = "gree-controller"
version = "0.9.13"
version = "0.9.14"
dependencies = [
"aes",
"aes-gcm",
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "gree-controller"
version = "0.9.13"
version = "0.9.14"
edition = "2021"
authors = ["GREE Controller contributors"]
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.
**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.
+3 -3
View File
@@ -1,6 +1,6 @@
# 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)
@@ -213,7 +213,7 @@ Response:
{
"status": "ok",
"name": "gree-controller",
"version": "0.9.13",
"version": "0.9.14",
"uptime_seconds": 1234,
"control_ready": true,
"time": "2026-08-30T06:54:00Z"
@@ -237,7 +237,7 @@ Returns the initial Web UI snapshot:
"settings": {},
"outdoor_temperature": null,
"system": {
"version": "0.9.13",
"version": "0.9.14",
"uptime_seconds": 1234,
"auth_required": false,
"control_ready": true,
@@ -1,7 +1,7 @@
{
"domain": "gree_controller",
"name": "GREE Controller",
"version": "0.9.13",
"version": "0.9.14",
"config_flow": true,
"integration_type": "hub",
"iot_class": "local_polling",
+2 -3
View File
@@ -243,8 +243,7 @@
</div>
<div class="simulation-head-actions"><button class="secondary" id="simulationOpenTab"
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="simulationRefresh" data-i18n="actions.refresh">Refresh</button></div>
id="simulationFullscreen" data-i18n="simulation.fullscreen">Full screen</button></div>
</div>
<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
@@ -731,7 +730,7 @@
<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>
<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 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>
+7 -6
View File
@@ -255,11 +255,6 @@ $('#haTest').addEventListener('click', async event => {
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 () => {
try {
const data = await api('/api/settings/export');
@@ -327,7 +322,13 @@ $('#flowSharedInputTest')?.addEventListener('click', async event => {
if (!form || !resultHost) return;
const kind = form.kind.value, config = collectFlowSharedInputConfig(kind);
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;
button.disabled = true; button.textContent = tr('flow.sharedInputTesting');
resultHost.hidden = false; resultHost.innerHTML = `<span>${esc(tr('flow.sharedInputTesting'))}</span>`;