v0.14.2-hotfix

This commit is contained in:
Mateusz Gruszczyński
2026-09-15 10:14:01 +02:00
parent c3f6e773f8
commit 7ffaba6c7a
12 changed files with 103 additions and 35 deletions
+11 -11
View File
@@ -4,7 +4,7 @@ a4ec3874a2e3ab1bad28fb40bb620f7b01f64d01ad9b699306bf70ada31227db ./.gitignore
97b67fd716185b18bb12d9170b502f81c6ffaf099816c893305c9f837048cb1f ./Cargo.toml
19b2943504acb8f8de280f873a8dbec4bb6ebbe3870b158f5655d4fb8c298f5f ./LICENSE
ee65b2f48b4cc5553e01689ace0f33151bbb2a2738f07ff7918cbf033b6a0f4d ./README.md
581d151a15a9cfc19f350f9059afc00a0533baa6eee9d4f3c993d5390ee2a2a9 ./SOURCE_MANIFEST.sha256
31d804b6af6addcdda8964a08a8a8c4b90fde7cc92eba7527d895d3c3deecca9 ./SOURCE_MANIFEST.sha256
bb549919b96b0413152dd905aec8640bb53301f07ec7d0b1be48ccbd37936fef ./build.rs
40199fea4917f9278344780440b0f47ca3ed5c6e7873e56040e16519edac7834 ./docs/API.md
ff213ad348e7f8b5cae7fe4adcad84d72db693765d424f270faa1acca9c23ce7 ./docs/FLOW.md
@@ -30,7 +30,7 @@ cca65482e36d48035aca178121a378fe7d578d600acff267ae81a6399c0da653 ./ha-addon/hom
6bddb7b4620021ecd2099a86a77ef5c7f2c2dcd3d07d5db4e7b4c4ce6d3e8c03 ./ha-addon/home-assistant/custom_components/gree_controller/translations/en.json
13f30e2dcdcedbd1b6c3f99c2335e0487108fd72c8e86922368b84f2fa2038ae ./ha-addon/home-assistant/custom_components/gree_controller/translations/pl.json
c5fc5c87273d82d2834a0a5a365c821a416413ed509613441e24e4dc3507c4d2 ./ha-addon/home-assistant/generated/gree_controller_entities.example.json
da2dec2201336a2fe91604e19b85873729ad0889fc310fa1da48708a6ebc0898 ./ha-addon/repository/gree-controller/CHANGELOG.md
56d3c922fdabb05213715d239e2b6279431d75e81a9a861d8172bf35b9bb4e15 ./ha-addon/repository/gree-controller/CHANGELOG.md
3c06bd11671452ea6472afd5543fb91a39aba73a1d2d95c7762c04f94ab64030 ./ha-addon/repository/gree-controller/DOCS.md
c3db302f38d26dc9f8caf37a1a8a07a1334cc07ae301d452f2940a5ec5915719 ./ha-addon/repository/gree-controller/README.md
a3a74b2aaa20fd39a050f8f360eec543d70b3fd43271617a60a0b95fd0cdf2ca ./ha-addon/repository/gree-controller/config.yaml
@@ -43,8 +43,8 @@ c123b190219556382f0e7f3058056fb233f6261f257a01eceb96a2c0bbfa12f3 ./ha-addon/run
081e27b6e43070d44f865335c30a42a5a29668eaa6a5ea5ab6967ac4447b8e06 ./ha-addon/sync-repository.sh
f9e31de3d109ead32bf531c074d46a087df398d62488caee0b46b5e0a1c027f7 ./ha_addon.md
253a0bc912786e67ea7fc92a64e4a510ad973bec343a88ccfb1f28fca3e8cf01 ./lang/README.md
30d389223e9a34dd3520fab356bc8f3145e4120dcfd680a59d443012e7fdd4d3 ./lang/en.json
7249dd996133dc1b4261faf195ac31d97ac0079fe0b661b34d4837ee15db0727 ./lang/pl.json
2db3d2a8611d6bc328452a6a8bd3da6fc6d52cddf65846b778e8e01ca841c070 ./lang/en.json
da9bb73b06e84965b7f4f85c18c94b87f0d1dc4460459fdb6b2a45b271b884c0 ./lang/pl.json
d8459024f04ca514bd8e9d6bd3af872fb942fd85a7cdd5583f4a9d28aab6faba ./make_zip.py
b14233a8987e53bbbdd6770386ba10fa166ec25c1e098275c173c544b37846fc ./presets/bedroom_window_night.json
1960841119c0b673fb2f03621b32237552fd828045304cd221401214b997c910 ./presets/device_resilience.json
@@ -201,25 +201,25 @@ f13f1be3d5789539eba3fc1b59c14835f8c681eca7634e118fa3763a53aeee2b ./src/queries/
b92a6cb158b494fe145b43c7641e65f6fafff47201d7d76edbec2cfd8b94835c ./systemd/gree-controller.service
544a31cb2e5374227026afd6abd0d910381f3fca1638154ebd74e3c3d96a35d1 ./web/404.html
e98bdd7204349cce1ec6f57283509697af0bbc72280622a6c3efa6fed242db4f ./web/favicon.svg
55eb6fdbed4a316a3722a355b8bc8cb9c56d016eccac046b0afb6472fcb6cb43 ./web/index.html
db1d0583efbc48c3ab8226aeba83275a14cd5c78be011555548a7491ec28b4d5 ./web/index.html
9ba3f6fa05b72aa989139b2a909982571b2a02055052e4c40104f1e81a9aa7eb ./web/js/README.md
27eff2821c40395369be15e197fa830535d2327fcb27c93a0e8e65a1c62de3ad ./web/js/bootstrap.js
f6e2d74ef9e43f2b93bd99acb1dfa5e64d889fb895e588d763c0e98c9d12efa5 ./web/js/charts.js
b328a641d739428e3329b93cf8f465cd880d1eeb1625015ba1c19e5f51427a27 ./web/js/core.js
713bf6526c83b85780ed9c0f0807c5a1aa009f44ddbc9a67c47141f925db9402 ./web/js/charts.js
ead5b315171a4bf4d443f3bba00a573ffd016a7667475d0e2cde480047446c70 ./web/js/core.js
d880ffdac6aa07cd10d79fbacf12f87eb4c69b48a80564bbfdd0248abe8884d5 ./web/js/dashboard.js
ed31601df41cc82032709f960a2b4061966abd58cde456ef7dda05e42eb91432 ./web/js/entities.js
424b52fa05cc6f45ab3bcac0f5f1fd0ac2102d840334fc3d762fd208816565a8 ./web/js/events.js
08e8e130dd33be91d2155e40aa0bf72a807355b234223b10eb01178ddbbefd13 ./web/js/events.js
8c156909d2d2e59b7d7dc969b9520c978141a448a6cc5aae8fe74a8dc124f2bc ./web/js/flows.js
9e2209d41df7624c29741f03f12ed8e83b47cee2891c5a80cea8ca1bdacf1d5a ./web/js/forms.js
1aefe416b4d4495b52476f619aaec18bb4dc011b2b94c555f9da35509e0553b0 ./web/js/history.js
ae6195905f33a4a83d5ba7c22d698419e2de05d80ed37df6066e0380fa715b6e ./web/js/history.js
0dc879c0056251618633c9efd188fc1593eeae6965ad1bc993132dea6e171b44 ./web/js/main.js
53ebdaa64a1dc8327db5cd4e08fb3f551dc2df33c214f218c6bb1ae3f27ad4dd ./web/js/navigation.js
e3d146a683b8beb332c752e533826160c2cf2236bc269ced7a4dd1249871027b ./web/js/realtime.js
9546ca5c5566994aff3c33d92295be46b65d51d874681764abe77470dc9c9c73 ./web/js/router.js
adba1970e5d6054d87ced5ed57ab210b9857c1555466c126d07cbd743de1b2e6 ./web/js/settings-ui.js
e62ca4a0cad10ca8b60c1fe4b5ecd0ccf9bd890cd58206a937dd1655fe216353 ./web/js/settings-ui.js
0dde5e1a19ab2384156229fe2a5d708e06bf58a2227f834d215af97d4375a5d3 ./web/js/settings.js
3815fea7ae1694568c2f249bc8460e0563ced6bde89214f74f21b41fe8cad9a6 ./web/lang-init.js
6b653e4fe2d4db4ffae6ff8f39b8ce57a10a990dc0000ee4aae51d949afadd52 ./web/manifest.webmanifest
e6eb02737426ec855eef4b23f4d6df4f4c9a9ffbdc00f492e21731a249cb8821 ./web/styles.css
4b3c94a1988e8e18bd0c39e5ebf73ce6ef31ddea5bb352ec40b1ae7b3609f5e9 ./web/styles.css
fefdf12cbbb0a5d8a2cb89275cae28455aa42aaf179542305cc8f5e0f4825898 ./web/sw.js
d505d793ce7cc9485b45b78bba1c0d51887adc7451ab59a42702946e5b991382 ./web/theme-init.js
+10 -10
View File
@@ -29,7 +29,7 @@ cca65482e36d48035aca178121a378fe7d578d600acff267ae81a6399c0da653 ./ha-addon/hom
6bddb7b4620021ecd2099a86a77ef5c7f2c2dcd3d07d5db4e7b4c4ce6d3e8c03 ./ha-addon/home-assistant/custom_components/gree_controller/translations/en.json
13f30e2dcdcedbd1b6c3f99c2335e0487108fd72c8e86922368b84f2fa2038ae ./ha-addon/home-assistant/custom_components/gree_controller/translations/pl.json
c5fc5c87273d82d2834a0a5a365c821a416413ed509613441e24e4dc3507c4d2 ./ha-addon/home-assistant/generated/gree_controller_entities.example.json
da2dec2201336a2fe91604e19b85873729ad0889fc310fa1da48708a6ebc0898 ./ha-addon/repository/gree-controller/CHANGELOG.md
56d3c922fdabb05213715d239e2b6279431d75e81a9a861d8172bf35b9bb4e15 ./ha-addon/repository/gree-controller/CHANGELOG.md
3c06bd11671452ea6472afd5543fb91a39aba73a1d2d95c7762c04f94ab64030 ./ha-addon/repository/gree-controller/DOCS.md
c3db302f38d26dc9f8caf37a1a8a07a1334cc07ae301d452f2940a5ec5915719 ./ha-addon/repository/gree-controller/README.md
a3a74b2aaa20fd39a050f8f360eec543d70b3fd43271617a60a0b95fd0cdf2ca ./ha-addon/repository/gree-controller/config.yaml
@@ -42,8 +42,8 @@ c123b190219556382f0e7f3058056fb233f6261f257a01eceb96a2c0bbfa12f3 ./ha-addon/run
081e27b6e43070d44f865335c30a42a5a29668eaa6a5ea5ab6967ac4447b8e06 ./ha-addon/sync-repository.sh
f9e31de3d109ead32bf531c074d46a087df398d62488caee0b46b5e0a1c027f7 ./ha_addon.md
253a0bc912786e67ea7fc92a64e4a510ad973bec343a88ccfb1f28fca3e8cf01 ./lang/README.md
30d389223e9a34dd3520fab356bc8f3145e4120dcfd680a59d443012e7fdd4d3 ./lang/en.json
7249dd996133dc1b4261faf195ac31d97ac0079fe0b661b34d4837ee15db0727 ./lang/pl.json
2db3d2a8611d6bc328452a6a8bd3da6fc6d52cddf65846b778e8e01ca841c070 ./lang/en.json
da9bb73b06e84965b7f4f85c18c94b87f0d1dc4460459fdb6b2a45b271b884c0 ./lang/pl.json
d8459024f04ca514bd8e9d6bd3af872fb942fd85a7cdd5583f4a9d28aab6faba ./make_zip.py
b14233a8987e53bbbdd6770386ba10fa166ec25c1e098275c173c544b37846fc ./presets/bedroom_window_night.json
1960841119c0b673fb2f03621b32237552fd828045304cd221401214b997c910 ./presets/device_resilience.json
@@ -200,25 +200,25 @@ f13f1be3d5789539eba3fc1b59c14835f8c681eca7634e118fa3763a53aeee2b ./src/queries/
b92a6cb158b494fe145b43c7641e65f6fafff47201d7d76edbec2cfd8b94835c ./systemd/gree-controller.service
544a31cb2e5374227026afd6abd0d910381f3fca1638154ebd74e3c3d96a35d1 ./web/404.html
e98bdd7204349cce1ec6f57283509697af0bbc72280622a6c3efa6fed242db4f ./web/favicon.svg
55eb6fdbed4a316a3722a355b8bc8cb9c56d016eccac046b0afb6472fcb6cb43 ./web/index.html
db1d0583efbc48c3ab8226aeba83275a14cd5c78be011555548a7491ec28b4d5 ./web/index.html
9ba3f6fa05b72aa989139b2a909982571b2a02055052e4c40104f1e81a9aa7eb ./web/js/README.md
27eff2821c40395369be15e197fa830535d2327fcb27c93a0e8e65a1c62de3ad ./web/js/bootstrap.js
f6e2d74ef9e43f2b93bd99acb1dfa5e64d889fb895e588d763c0e98c9d12efa5 ./web/js/charts.js
b328a641d739428e3329b93cf8f465cd880d1eeb1625015ba1c19e5f51427a27 ./web/js/core.js
713bf6526c83b85780ed9c0f0807c5a1aa009f44ddbc9a67c47141f925db9402 ./web/js/charts.js
ead5b315171a4bf4d443f3bba00a573ffd016a7667475d0e2cde480047446c70 ./web/js/core.js
d880ffdac6aa07cd10d79fbacf12f87eb4c69b48a80564bbfdd0248abe8884d5 ./web/js/dashboard.js
ed31601df41cc82032709f960a2b4061966abd58cde456ef7dda05e42eb91432 ./web/js/entities.js
424b52fa05cc6f45ab3bcac0f5f1fd0ac2102d840334fc3d762fd208816565a8 ./web/js/events.js
08e8e130dd33be91d2155e40aa0bf72a807355b234223b10eb01178ddbbefd13 ./web/js/events.js
8c156909d2d2e59b7d7dc969b9520c978141a448a6cc5aae8fe74a8dc124f2bc ./web/js/flows.js
9e2209d41df7624c29741f03f12ed8e83b47cee2891c5a80cea8ca1bdacf1d5a ./web/js/forms.js
1aefe416b4d4495b52476f619aaec18bb4dc011b2b94c555f9da35509e0553b0 ./web/js/history.js
ae6195905f33a4a83d5ba7c22d698419e2de05d80ed37df6066e0380fa715b6e ./web/js/history.js
0dc879c0056251618633c9efd188fc1593eeae6965ad1bc993132dea6e171b44 ./web/js/main.js
53ebdaa64a1dc8327db5cd4e08fb3f551dc2df33c214f218c6bb1ae3f27ad4dd ./web/js/navigation.js
e3d146a683b8beb332c752e533826160c2cf2236bc269ced7a4dd1249871027b ./web/js/realtime.js
9546ca5c5566994aff3c33d92295be46b65d51d874681764abe77470dc9c9c73 ./web/js/router.js
adba1970e5d6054d87ced5ed57ab210b9857c1555466c126d07cbd743de1b2e6 ./web/js/settings-ui.js
e62ca4a0cad10ca8b60c1fe4b5ecd0ccf9bd890cd58206a937dd1655fe216353 ./web/js/settings-ui.js
0dde5e1a19ab2384156229fe2a5d708e06bf58a2227f834d215af97d4375a5d3 ./web/js/settings.js
3815fea7ae1694568c2f249bc8460e0563ced6bde89214f74f21b41fe8cad9a6 ./web/lang-init.js
6b653e4fe2d4db4ffae6ff8f39b8ce57a10a990dc0000ee4aae51d949afadd52 ./web/manifest.webmanifest
e6eb02737426ec855eef4b23f4d6df4f4c9a9ffbdc00f492e21731a249cb8821 ./web/styles.css
4b3c94a1988e8e18bd0c39e5ebf73ce6ef31ddea5bb352ec40b1ae7b3609f5e9 ./web/styles.css
fefdf12cbbb0a5d8a2cb89275cae28455aa42aaf179542305cc8f5e0f4825898 ./web/sw.js
d505d793ce7cc9485b45b78bba1c0d51887adc7451ab59a42702946e5b991382 ./web/theme-init.js
@@ -2,6 +2,7 @@
## 0.14.2
- Improves connectivity controls: Local/LAN ping measurement can be explicitly enabled/disabled in Settings, disabled workers gray out their interval/sample fields, Cloud REST/MQTT measurement settings live in a dedicated block, and History → Pings can hide/show jitter with one button while rendering jitter as a dashed line.
- Adds a configurable background connectivity worker for Local/LAN units with measurement interval and sample-count settings.
- Adds a History → Connectivity/Pings view with per-endpoint latency, jitter and packet-loss charts plus latest batch summaries.
- Stores connectivity readings in SQLite using the same retention/compaction lifecycle as other history metrics and archives them to InfluxDB when enabled.
+7 -2
View File
@@ -1313,11 +1313,16 @@
"history.networkNoDataHint": "Enable connectivity metrics in Settings and wait for the first measurement cycle.",
"settings.connectivityTitle": "Connectivity metrics",
"settings.connectivityHint": "Periodic GREE UDP round-trip measurements for Local/LAN units. Results are stored in History.",
"settings.connectivityEnable": "Enable local connectivity metrics",
"settings.connectivityEnable": "Enable local unit ping measurements",
"settings.connectivityInterval": "Measurement interval (s)",
"settings.connectivitySamples": "Samples per measurement",
"settings.connectivityLocalOnly": "Only Local/LAN installations are probed. Cloud devices are not pinged directly.",
"settings.cloudConnectivityEnable": "Measure Cloud REST/MQTT connectivity",
"settings.cloudConnectivityHint": "Optional and disabled by default. Measures REST login response and MQTT PINGRESP round-trip."
"settings.cloudConnectivityHint": "Optional and disabled by default. Measures REST login response and MQTT PINGRESP round-trip.",
"settings.cloudConnectivityTitle": "GREE Cloud connectivity metrics",
"settings.cloudConnectivityHistoryHint": "REST and MQTT measurements are stored in History → Pings together with Local/LAN measurements.",
"history.networkJitterOn": "Jitter: on",
"history.networkJitterOff": "Jitter: off",
"history.networkJitterToggleHint": "Show or hide jitter on the latency chart."
}
}
+7 -2
View File
@@ -1313,11 +1313,16 @@
"history.networkNoDataHint": "Włącz metryki łączności w Ustawieniach i poczekaj na pierwszy cykl pomiarowy.",
"settings.connectivityTitle": "Metryki łączności",
"settings.connectivityHint": "Okresowe pomiary odpowiedzi GREE UDP dla jednostek Local/LAN. Wyniki są zapisywane w Historii.",
"settings.connectivityEnable": "Włącz lokalne metryki łączności",
"settings.connectivityEnable": "Włącz badanie pingów jednostek lokalnych",
"settings.connectivityInterval": "Interwał pomiaru (s)",
"settings.connectivitySamples": "Liczba próbek na pomiar",
"settings.connectivityLocalOnly": "Pingowane są tylko instalacje Local/LAN. Jednostki Cloud nie są pingowane bezpośrednio.",
"settings.cloudConnectivityEnable": "Mierz łączność GREE Cloud REST/MQTT",
"settings.cloudConnectivityHint": "Opcjonalne i domyślnie wyłączone. Mierzy czas odpowiedzi logowania REST oraz round-trip MQTT PINGRESP."
"settings.cloudConnectivityHint": "Opcjonalne i domyślnie wyłączone. Mierzy czas odpowiedzi logowania REST oraz round-trip MQTT PINGRESP.",
"settings.cloudConnectivityTitle": "Metryki łączności GREE Cloud",
"settings.cloudConnectivityHistoryHint": "Pomiary REST i MQTT są zapisywane w Historia → Pingi razem z pomiarami Local/LAN.",
"history.networkJitterOn": "Jitter: włączony",
"history.networkJitterOff": "Jitter: wyłączony",
"history.networkJitterToggleHint": "Pokaż lub ukryj jitter na wykresie opóźnienia."
}
}
+15 -5
View File
@@ -720,7 +720,7 @@
</div>
</div>
<div class="settings-grid">
<label class="check wide"><input type="checkbox" name="ping_metrics_enabled"> <span data-i18n="settings.connectivityEnable">Enable local connectivity metrics</span></label>
<label class="check wide"><input type="checkbox" name="ping_metrics_enabled"> <span data-i18n="settings.connectivityEnable">Enable local unit ping measurements</span></label>
<label><span data-i18n="settings.connectivityInterval">Measurement interval (s)</span><input type="number" name="ping_interval_seconds" min="10" max="3600" value="60"></label>
<label><span data-i18n="settings.connectivitySamples">Samples per measurement</span><input type="number" name="ping_sample_count" min="1" max="10" value="3"></label>
<p class="field-note wide" data-i18n="settings.connectivityLocalOnly">Only Local/LAN installations are probed. Cloud devices are not pinged directly.</p>
@@ -766,10 +766,6 @@
<option>Australia</option><option>China Mainland</option><option>East South Asia</option><option selected>Europe</option><option>India</option><option>Latin American</option><option>Middle East</option><option>North American</option><option>Russia</option><option>South American</option>
</select></label>
<label><span data-i18n="settings.cloudPolling">Cloud fallback polling interval (s)</span><input type="number" name="gree_cloud_polling_interval_seconds" min="30" max="3600" value="60"></label>
<label class="check wide"><input type="checkbox" name="gree_cloud_connectivity_metrics_enabled"> <span data-i18n="settings.cloudConnectivityEnable">Measure Cloud REST/MQTT connectivity</span></label>
<label><span data-i18n="settings.connectivityInterval">Measurement interval (s)</span><input type="number" name="gree_cloud_connectivity_metrics_interval_seconds" min="30" max="3600" value="300"></label>
<label><span data-i18n="settings.connectivitySamples">Samples per measurement</span><input type="number" name="gree_cloud_connectivity_metrics_sample_count" min="1" max="10" value="3"></label>
<p class="field-note wide" data-i18n="settings.cloudConnectivityHint">Optional. Disabled by default. Measures REST login response and MQTT PINGRESP round-trip.</p>
<label class="wide"><span data-i18n="settings.cloudLogin">Login / email</span><input name="gree_cloud_username" autocomplete="username"></label>
<label class="wide"><span data-i18n="settings.cloudPassword">Password</span><input type="password" name="gree_cloud_password" autocomplete="new-password" data-i18n-placeholder="settings.cloudPasswordPlaceholder" placeholder="Leave empty to keep saved secret"></label>
<div class="wide cloud-runtime-summary" aria-live="polite" hidden>
@@ -793,6 +789,20 @@
<div id="greeCloudTestResult" class="inline-alert wide" hidden></div>
</div>
</section>
<section class="panel settings-block">
<div class="settings-block-head">
<div>
<h3 data-i18n="settings.cloudConnectivityTitle">Cloud connectivity metrics</h3>
<p data-i18n="settings.cloudConnectivityHint">Optional. Disabled by default. Measures REST login response and MQTT PINGRESP round-trip.</p>
</div>
</div>
<div class="settings-grid">
<label class="check wide"><input type="checkbox" name="gree_cloud_connectivity_metrics_enabled"> <span data-i18n="settings.cloudConnectivityEnable">Measure Cloud REST/MQTT connectivity</span></label>
<label><span data-i18n="settings.connectivityInterval">Measurement interval (s)</span><input type="number" name="gree_cloud_connectivity_metrics_interval_seconds" min="30" max="3600" value="300"></label>
<label><span data-i18n="settings.connectivitySamples">Samples per measurement</span><input type="number" name="gree_cloud_connectivity_metrics_sample_count" min="1" max="10" value="3"></label>
<p class="field-note wide" data-i18n="settings.cloudConnectivityHistoryHint">REST and MQTT measurements are stored in History → Pings together with Local/LAN measurements.</p>
</div>
</section>
</div>
<div class="settings-save-bar"><span data-i18n="settings.saveHint">Save changes made in the blocks
above.</span><button class="primary" type="submit" data-i18n="actions.save">Save</button></div>
+3 -2
View File
@@ -109,7 +109,8 @@ function renderHistoryNavigation() {
} else if (app.historyTab === 'network') {
const targets = app.historyNetworkTargets || [];
const targetOptions = targets.map(target => `<option value="${esc(target.id)}">${esc(target.name)}</option>`).join('');
host.innerHTML = `<label><span>${esc(tr('history.networkTarget'))}</span><select id="historyNetworkSelect"><option value="all">${esc(tr('history.allNetworkTargets'))}</option>${targetOptions}</select></label>`;
const jitterEnabled = app.historyNetworkShowJitter !== false;
host.innerHTML = `<div class="history-network-controls"><label><span>${esc(tr('history.networkTarget'))}</span><select id="historyNetworkSelect"><option value="all">${esc(tr('history.allNetworkTargets'))}</option>${targetOptions}</select></label><button type="button" class="secondary history-jitter-toggle${jitterEnabled ? ' active' : ''}" data-action="toggle-network-jitter" aria-pressed="${jitterEnabled ? 'true' : 'false'}" title="${esc(tr('history.networkJitterToggleHint'))}">${esc(tr(jitterEnabled ? 'history.networkJitterOn' : 'history.networkJitterOff'))}</button></div>`;
const select = $('#historyNetworkSelect'); if ([...select.options].some(option => option.value === app.historyNetworkTarget)) select.value = app.historyNetworkTarget;
} else if (app.historyTab === 'sensors') {
host.innerHTML = `<label><span>${esc(tr('history.haSensor'))}</span><select id="historySensorSelect"><option value="all">${esc(tr('history.allSensors'))}</option>${options.sensors}</select></label>`;
@@ -650,7 +651,7 @@ function renderLegend(host, series) {
host.innerHTML = series.map((item, index) => {
const hidden = isChartSeriesHidden(chartId, item, index);
const title = tr(hidden ? 'history.legendShow' : 'history.legendHide', { name: item.label });
return `<button type="button" class="legend-item${hidden ? ' is-hidden' : ''}" data-chart-id="${esc(chartId)}" data-chart-legend="${index}" aria-pressed="${hidden ? 'false' : 'true'}" title="${esc(title)}"><i class="legend-line" style="--legend-color:${esc(item.color)}"></i><span>${esc(item.label)}</span></button>`;
return `<button type="button" class="legend-item${hidden ? ' is-hidden' : ''}" data-chart-id="${esc(chartId)}" data-chart-legend="${index}" aria-pressed="${hidden ? 'false' : 'true'}" title="${esc(title)}"><i class="legend-line${item.dash?.length ? ' is-dashed' : ''}" style="--legend-color:${esc(item.color)}"></i><span>${esc(item.label)}</span></button>`;
}).join('');
}
+1 -1
View File
@@ -30,7 +30,7 @@ const app = {
currentView: 'dashboard', loading: false, bootstrapReloadPending: false, language: preferredLanguage, theme: preferredTheme, connectionStatus: 'connecting',
languages: [], translations: {}, locales: {},
historyTab: 'overview', historyData: { zones: [], devices: [], sensors: [] }, historyCounts: {},
historyZone: 'all', historyDevice: 'all', historySensor: 'all', historyNetworkTarget: 'all', historyNetwork: [], historyNetworkTargets: [], historyEnergyDevice: '', historyEnergyTargets: [], historyEnergyInterval: 'daily', historyEnergyCompare: 'none', historyEnergy: [], historyLoading: false, historyReloadPending: false,
historyZone: 'all', historyDevice: 'all', historySensor: 'all', historyNetworkTarget: 'all', historyNetworkShowJitter: true, historyNetwork: [], historyNetworkTargets: [], historyEnergyDevice: '', historyEnergyTargets: [], historyEnergyInterval: 'daily', historyEnergyCompare: 'none', historyEnergy: [], historyLoading: false, historyReloadPending: false,
customChartSeries: [], savedCharts: [], chartZooms: {}, chartHiddenSeries: {}, zoneControlSeq: {}, groupControlSeq: {}, zoneControlQueue: {}, groupControlQueue: {}, deviceControlQueue: {}, houseControlQueue: null, climateControlQueue: null, groupCustomDrafts: {}, zoneTemperatureTimers: {}, deviceTemperatureDrafts: {},
controlPlan: null, controlPlanRevision: null, controlPlanPushReady: false, controlPlanTimer: null, debugLines: [], debugBacklogLoaded: false, debugFilter: 'all', sensorAliases: {}, flowSharedInputs: [], flowSharedInputValueCache: {}, flowSharedInputValueRequests: {}, flowSharedInputValueTimer: null,
simulationScope: 'units', simulationTarget: 'all', standaloneSimulation: false, dashboardTab: 'main', settingsTab: 'app', systemSnapshotAt: Date.now(),
+3
View File
@@ -99,6 +99,7 @@ document.addEventListener('click', async event => {
return;
}
const device = app.devices.find(v => v.id === button.dataset.device);
if (action === 'toggle-network-jitter') { app.historyNetworkShowJitter = app.historyNetworkShowJitter === false; renderHistoryNavigation(); renderNetworkHistory(); return; }
if (action === 'open-ping' && device) { openDevicePing(device.id); return; }
if (action === 'ping-toggle') { if (app.pingMonitor.running) stopPingMonitor(); else startPingMonitor(); return; }
if (action === 'power' && device) return sendDeviceCommand(device.id, current => ({ power: !current?.power }));
@@ -253,6 +254,8 @@ $('#themeSelect')?.addEventListener('change', event => setTheme(event.target.val
$('#logLevelFilter')?.addEventListener('change', loadLogs); $('#logCategoryFilter')?.addEventListener('change', loadLogs);
$('#settingsForm [name=notifications_provider]')?.addEventListener('change', updateNotificationFields);
$('#settingsForm [name=compressor_protection_enabled]')?.addEventListener('change', updateCompressorProtectionFields);
$('#settingsForm [name=ping_metrics_enabled]')?.addEventListener('change', updateConnectivityMetricFields);
$('#settingsForm [name=gree_cloud_connectivity_metrics_enabled]')?.addEventListener('change', updateConnectivityMetricFields);
$('#zoneForm [name=sensor_source]').addEventListener('change', updateZoneSensorFields);
document.addEventListener('input', event => {
const input = event.target.closest?.('[data-group-custom-temperature]');
+2 -2
View File
@@ -156,8 +156,8 @@ function renderNetworkHistory() {
value: row => row.target_id === id ? historyNumber(row.latency_ms) : NaN,
tooltipValue: value => `${Number(value).toLocaleString(locale(), { maximumFractionDigits: 2 })} ms`,
});
latencySeries.push({
key: `${id}:jitter`, label: `${label} · ${tr('history.networkJitter')}`, color, dash: [5, 4],
if (app.historyNetworkShowJitter !== false) latencySeries.push({
key: `${id}:jitter`, label: `${label} · ${tr('history.networkJitter')}`, color, dash: [7, 5],
value: row => row.target_id === id ? historyNumber(row.jitter_ms) : NaN,
tooltipValue: value => `${Number(value).toLocaleString(locale(), { maximumFractionDigits: 2 })} ms`,
});
+13
View File
@@ -164,6 +164,18 @@ function renderLogRetention() {
select.value = days;
}
function updateConnectivityMetricFields() {
const form = $('#settingsForm');
if (!form) return;
const localEnabled = !!form.ping_metrics_enabled?.checked;
if (form.ping_interval_seconds) form.ping_interval_seconds.disabled = !localEnabled;
if (form.ping_sample_count) form.ping_sample_count.disabled = !localEnabled;
const cloudEnabled = !!form.gree_cloud_connectivity_metrics_enabled?.checked;
if (form.gree_cloud_connectivity_metrics_interval_seconds) form.gree_cloud_connectivity_metrics_interval_seconds.disabled = !cloudEnabled;
if (form.gree_cloud_connectivity_metrics_sample_count) form.gree_cloud_connectivity_metrics_sample_count.disabled = !cloudEnabled;
}
function renderSettings() {
if (!app.settings) return;
const form = $('#settingsForm');
@@ -191,6 +203,7 @@ function renderSettings() {
form.gree_cloud_connectivity_metrics_enabled.checked = !!cloud.connectivity_metrics_enabled;
form.gree_cloud_connectivity_metrics_interval_seconds.value = Number(cloud.connectivity_metrics_interval_seconds || 300);
form.gree_cloud_connectivity_metrics_sample_count.value = Number(cloud.connectivity_metrics_sample_count || 3);
updateConnectivityMetricFields();
const cloudInstance = $('#greeCloudInstanceId');
if (cloudInstance) cloudInstance.textContent = cloud.installation_id || '—';
const cloudLastContact = $('#greeCloudLastContact');
+30
View File
@@ -2040,6 +2040,11 @@ legend {
background: var(--legend-color, var(--accent));
}
.legend-line.is-dashed {
background: repeating-linear-gradient(90deg, var(--legend-color, var(--accent)) 0 7px, transparent 7px 12px);
}
@media (max-width: 620px) {
.history-summary {
grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -2799,6 +2804,26 @@ legend {
width: 100%;
}
.history-network-controls {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 10px;
align-items: end;
}
.history-network-controls label { min-width: 0; }
.history-jitter-toggle {
min-height: 45px;
white-space: nowrap;
}
.history-jitter-toggle.active {
color: var(--accent-text);
border-color: var(--accent);
background: var(--accent);
}
.history-range-control {
display: grid;
gap: 7px;
@@ -9613,3 +9638,8 @@ body.flow-editor-open {
.history-energy-options { width: min(420px, calc(100vw - 40px)); max-height: 46vh; }
}
@media (max-width: 640px) {
.history-network-controls { grid-template-columns: 1fr; }
.history-jitter-toggle { width: 100%; }
}