v0.14.0
This commit is contained in:
+55
-5
@@ -178,6 +178,17 @@ function renderSettings() {
|
||||
form.event_log_retention_days.value = app.settings.event_log_retention_days || 30;
|
||||
form.history_compaction_enabled.checked = app.settings.history_compaction_enabled !== false;
|
||||
form.suppress_device_beep.checked = !!app.settings.suppress_device_beep;
|
||||
const cloud = app.settings.gree_cloud || {};
|
||||
form.gree_cloud_enabled.checked = !!cloud.enabled;
|
||||
form.gree_cloud_region.value = cloud.region || 'Europe';
|
||||
form.gree_cloud_username.value = cloud.username || '';
|
||||
form.gree_cloud_password.value = '';
|
||||
form.gree_cloud_password.placeholder = cloud.password_configured ? tr('settings.secretSaved') : tr('settings.secretKeep');
|
||||
form.gree_cloud_polling_interval_seconds.value = Number(cloud.polling_interval_seconds || 60);
|
||||
const cloudInstance = $('#greeCloudInstanceId');
|
||||
if (cloudInstance) cloudInstance.textContent = cloud.installation_id || '—';
|
||||
const cloudLastContact = $('#greeCloudLastContact');
|
||||
if (cloudLastContact) cloudLastContact.textContent = cloud.last_successful_contact ? dateTime(cloud.last_successful_contact) : tr('common.unavailable');
|
||||
form.compressor_protection_enabled.checked = app.settings.compressor_protection_enabled !== false;
|
||||
form.compressor_protection_minutes.value = (Number(app.settings.compressor_protection_seconds || 180) / 60).toFixed(1).replace(/\.0$/, '');
|
||||
updateCompressorProtectionFields();
|
||||
@@ -195,6 +206,8 @@ function renderSettings() {
|
||||
form.influx_token.placeholder = app.settings.influxdb?.token_configured ? tr('settings.secretSaved') : tr('settings.secretKeep');
|
||||
form.debug_overlay_enabled.checked = !!app.settings.debug?.overlay_enabled;
|
||||
form.debug_gree_frames.checked = !!app.settings.debug?.gree_frames;
|
||||
form.debug_cloud_requests.checked = !!app.settings.debug?.cloud_requests;
|
||||
form.debug_cloud_mqtt.checked = !!app.settings.debug?.cloud_mqtt;
|
||||
const n = app.settings.notifications || {};
|
||||
form.notifications_enabled.checked = !!n.enabled; form.notifications_mode.value = n.mode || 'problems'; form.notifications_provider.value = n.provider || 'pushover';
|
||||
form.pushover_app_token.value = ''; form.pushover_user_key.value = ''; form.slack_webhook_url.value = ''; form.discord_webhook_url.value = '';
|
||||
@@ -221,6 +234,7 @@ function renderSettings() {
|
||||
renderSimulationModeBanner();
|
||||
setSettingsTab(app.settingsTab);
|
||||
markFormClean(form);
|
||||
void refreshGreeCloudRuntimeStatus();
|
||||
}
|
||||
|
||||
function updateCompressorProtectionFields() {
|
||||
@@ -238,7 +252,7 @@ function renderSimulationModeBanner() {
|
||||
}
|
||||
|
||||
function setSettingsTab(tab) {
|
||||
app.settingsTab = tab === 'gree' ? 'gree' : 'app';
|
||||
app.settingsTab = ['gree', 'cloud'].includes(tab) ? tab : 'app';
|
||||
$$('[data-settings-pane]').forEach(pane => { pane.hidden = pane.dataset.settingsPane !== app.settingsTab; });
|
||||
$$('[data-settings-tab]').forEach(button => {
|
||||
const active = button.dataset.settingsTab === app.settingsTab;
|
||||
@@ -331,9 +345,16 @@ function renderDebugOverlay() {
|
||||
const enabled = !!app.settings?.debug?.overlay_enabled;
|
||||
overlay.hidden = !enabled;
|
||||
if (!enabled) return;
|
||||
if (!['all', 'requests', 'gree'].includes(app.debugFilter)) app.debugFilter = 'all';
|
||||
if (!['all', 'requests', 'gree', 'cloud', 'mqtt'].includes(app.debugFilter)) app.debugFilter = 'all';
|
||||
const status = $('#debugOverlayStatus');
|
||||
if (status) status.textContent = app.settings?.debug?.gree_frames ? tr('debug.apiAndGree') : tr('debug.apiOnly');
|
||||
if (status) {
|
||||
const enabledSources = [
|
||||
app.settings?.debug?.gree_frames ? tr('debug.gree') : '',
|
||||
app.settings?.debug?.cloud_requests ? tr('debug.cloud') : '',
|
||||
app.settings?.debug?.cloud_mqtt ? tr('debug.mqtt') : '',
|
||||
].filter(Boolean);
|
||||
status.textContent = enabledSources.length ? `${tr('debug.liveSources')}: ${enabledSources.join(' · ')}` : tr('debug.apiOnly');
|
||||
}
|
||||
$$('[data-debug-filter]', overlay).forEach(button => {
|
||||
const active = button.dataset.debugFilter === app.debugFilter;
|
||||
button.classList.toggle('active', active);
|
||||
@@ -343,13 +364,15 @@ function renderDebugOverlay() {
|
||||
const visible = app.debugLines.filter(line => {
|
||||
if (app.debugFilter === 'gree') return line.source === 'GREE';
|
||||
if (app.debugFilter === 'requests') return line.source === 'HTTP';
|
||||
if (app.debugFilter === 'cloud') return line.source === 'CLOUD';
|
||||
if (app.debugFilter === 'mqtt') return line.source === 'MQTT';
|
||||
return true;
|
||||
}).slice(-120);
|
||||
host.innerHTML = visible.length ? visible.map(line => {
|
||||
const details = line.data == null ? '' : ` ${typeof line.data === 'string' ? line.data : JSON.stringify(line.data)}`;
|
||||
const sourceClass = line.source === 'GREE' ? 'gree' : line.source === 'HTTP' ? 'request' : 'api';
|
||||
const sourceClass = line.source === 'GREE' ? 'gree' : line.source === 'HTTP' ? 'request' : line.source === 'CLOUD' ? 'cloud' : line.source === 'MQTT' ? 'mqtt' : 'api';
|
||||
return `<div class="debug-line source-${sourceClass}"><time>${esc(new Date(line.timestamp).toLocaleTimeString(locale()))}</time><b>${esc(line.source)}</b><span>${esc(line.kind)}: ${esc(line.message || '')}${esc(details)}</span></div>`;
|
||||
}).join('') : `<div class="debug-empty">${esc(tr(app.debugFilter === 'gree' ? 'debug.emptyGree' : app.debugFilter === 'requests' ? 'debug.emptyRequests' : 'debug.empty'))}</div>`;
|
||||
}).join('') : `<div class="debug-empty">${esc(tr(app.debugFilter === 'gree' ? 'debug.emptyGree' : app.debugFilter === 'requests' ? 'debug.emptyRequests' : app.debugFilter === 'cloud' ? 'debug.emptyCloud' : app.debugFilter === 'mqtt' ? 'debug.emptyMqtt' : 'debug.empty'))}</div>`;
|
||||
host.scrollTop = host.scrollHeight;
|
||||
}
|
||||
|
||||
@@ -370,3 +393,30 @@ function formatDuration(seconds) {
|
||||
|
||||
setInterval(() => { if (app.currentView === 'settings') renderSystemInfo(); }, 30000);
|
||||
|
||||
|
||||
async function refreshGreeCloudRuntimeStatus() {
|
||||
const account = $('#greeCloudAccountStatus');
|
||||
const mqtt = $('#greeCloudMqttStatus');
|
||||
if (!account || !mqtt) return;
|
||||
const setText = (selector, value) => { const node = $(selector); if (node) node.textContent = value; };
|
||||
try {
|
||||
const status = await api('/api/integrations/gree-cloud/status');
|
||||
const runtime = status.runtime || {};
|
||||
account.textContent = String(status.account_status || 'unknown').replaceAll('_', ' ');
|
||||
mqtt.textContent = String(status.mqtt_status || 'disconnected').replaceAll('_', ' ');
|
||||
setText('#greeCloudDevicesOnline', `${Number(status.online_device_count || 0)} / ${Number(status.device_count || 0)}`);
|
||||
setText('#greeCloudRestResponseTime', status.last_rest_response_time_ms != null && Number.isFinite(Number(status.last_rest_response_time_ms)) ? `${Number(status.last_rest_response_time_ms)} ms` : tr('common.unavailable'));
|
||||
setText('#greeCloudResponseTime', runtime.last_response_time_ms != null && Number.isFinite(Number(runtime.last_response_time_ms)) ? `${Number(runtime.last_response_time_ms)} ms` : tr('common.unavailable'));
|
||||
setText('#greeCloudLastDeviceResponse', runtime.last_device_response ? dateTime(runtime.last_device_response) : tr('common.unavailable'));
|
||||
setText('#greeCloudLastMqttMessage', runtime.last_mqtt_message ? dateTime(runtime.last_mqtt_message) : tr('common.unavailable'));
|
||||
setText('#greeCloudConnectedSince', runtime.mqtt_connected_since ? dateTime(runtime.mqtt_connected_since) : tr('common.unavailable'));
|
||||
setText('#greeCloudBroker', runtime.broker_host || tr('common.unavailable'));
|
||||
setText('#greeCloudTraffic', `${Number(runtime.requests_sent || 0)} / ${Number(runtime.responses_received || 0)} / ${Number(runtime.request_timeouts || 0)}`);
|
||||
if (status.last_successful_contact) setText('#greeCloudLastContact', dateTime(status.last_successful_contact));
|
||||
} catch (_) {
|
||||
account.textContent = 'unknown';
|
||||
mqtt.textContent = 'disconnected';
|
||||
['#greeCloudDevicesOnline', '#greeCloudRestResponseTime', '#greeCloudResponseTime', '#greeCloudLastDeviceResponse', '#greeCloudLastMqttMessage', '#greeCloudConnectedSince', '#greeCloudBroker', '#greeCloudTraffic'].forEach(selector => setText(selector, tr('common.unavailable')));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user