diff --git a/apps/desktop/resources/web/index.html b/apps/desktop/resources/web/index.html
index dd1cc00..899bf5c 100644
--- a/apps/desktop/resources/web/index.html
+++ b/apps/desktop/resources/web/index.html
@@ -747,53 +747,60 @@ function renderDevices() {
}).join('');
// fetch current state for each device
- devices.forEach((d, i) => {
+ devices.forEach(async (d, i) => {
// Skip fetching state if WebSocket is not connected
if (!ws || ws.readyState !== WebSocket.OPEN) {
console.log(`[DWM] Skipping device state fetch due to WebSocket connection issues`);
return;
}
- // For dimmer devices, fetch both brightness and state
- if (d.isDimmer) {
- // Fetch brightness first
- api('GET', `/api/devices/${d.host}/${d.port}/brightness`)
- .then((data) => {
+ try {
+ // For dimmer devices, fetch both brightness and state
+ if (d.isDimmer) {
+ // Fetch both brightness and state in parallel to avoid race conditions
+ const [brightnessData, stateData] = await Promise.allSettled([
+ api('GET', `/api/devices/${d.host}/${d.port}/brightness`),
+ api('GET', `/api/devices/${d.host}/${d.port}/state`)
+ ]);
+
+ // Handle brightness data
+ if (brightnessData.status === 'fulfilled' && brightnessData.value.brightness !== undefined) {
const slider = document.getElementById('bright-'+i);
const value = document.getElementById('bright-val-'+i);
-
- if (slider && value && data.brightness !== undefined) {
- slider.value = data.brightness;
- value.textContent = Math.round(data.brightness) + '%';
+ if (slider && value) {
+ slider.value = brightnessData.value.brightness;
+ value.textContent = Math.round(brightnessData.value.brightness) + '%';
}
- })
- .catch(() => {});
-
- // Also fetch the actual on/off state from the BinaryState response
- api('GET', `/api/devices/${d.host}/${d.port}/state`)
- .then((on) => {
+ }
+
+ // Handle state data (this should set the toggle correctly)
+ if (stateData.status === 'fulfilled') {
const checkbox = document.getElementById('dchk-'+i);
if (checkbox) {
- // Use the actual binary state, not brightness
- const shouldBeChecked = !!on;
+ const shouldBeChecked = !!stateData.value;
checkbox.checked = shouldBeChecked;
- console.log(`[DWM] Device ${d.host}:${d.port} - BinaryState: ${on ? 'ON' : 'OFF'}, Last brightness: ${data.brightness}%`);
- console.log(`[DWM] Setting checkbox.checked to: ${shouldBeChecked}, actual checkbox.checked: ${checkbox.checked}`);
+ console.log(`[DWM] Device ${d.host}:${d.port} - BinaryState: ${stateData.value ? 'ON' : 'OFF'}, Last brightness: ${brightnessData.value?.brightness || 'N/A'}%`);
+ console.log(`[DWM] Setting checkbox.checked to: ${shouldBeChecked}`);
+
+ // Force a DOM update to ensure the change takes effect
+ checkbox.dispatchEvent(new Event('change'));
}
- })
- .catch(() => {});
- } else {
- // For non-dimmer devices, just fetch the binary state
- api('GET', `/api/devices/${d.host}/${d.port}/state`)
- .then((on) => {
- const c = document.getElementById('dchk-'+i);
- if (c) {
- const shouldBeChecked = !!on;
- c.checked = shouldBeChecked;
- console.log(`[DWM] Non-dimmer device ${d.host}:${d.port} - State: ${on ? 'ON' : 'OFF'}, Setting checkbox to: ${shouldBeChecked}`);
- }
- })
- .catch(() => {});
+ }
+ } else {
+ // For non-dimmer devices, just fetch binary state
+ const stateResult = await api('GET', `/api/devices/${d.host}/${d.port}/state`);
+ const checkbox = document.getElementById('dchk-'+i);
+ if (checkbox) {
+ const shouldBeChecked = !!stateResult;
+ checkbox.checked = shouldBeChecked;
+ console.log(`[DWM] Non-dimmer device ${d.host}:${d.port} - State: ${stateResult ? 'ON' : 'OFF'}, Setting checkbox to: ${shouldBeChecked}`);
+
+ // Force a DOM update to ensure the change takes effect
+ checkbox.dispatchEvent(new Event('change'));
+ }
+ }
+ } catch (err) {
+ console.error(`[DWM] Error fetching state for device ${d.host}:${d.port}:`, err);
}
});
}