From 8f01f3547053ed0224461a91679fc494985caeb6 Mon Sep 17 00:00:00 2001 From: sebseb7 Date: Thu, 25 Dec 2025 05:07:27 +0100 Subject: [PATCH] u --- uiserver/src/components/ViewManager.js | 14 ++++---------- uiserver/webpack.config.js | 13 ++++++++----- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/uiserver/src/components/ViewManager.js b/uiserver/src/components/ViewManager.js index 5fcd7fa..dfd2081 100644 --- a/uiserver/src/components/ViewManager.js +++ b/uiserver/src/components/ViewManager.js @@ -163,12 +163,9 @@ class ViewManager extends Component { const channel = rule.action?.channel || ''; const emojis = { 'CircFanLevel': '🌀', - 'TentLightLevel': '💡', - 'TentExhaustLevel': '💨', - 'RoomExhaustLevel': '🌬️', 'CO2Valve': '🫧', 'BigDehumid': '💧', - 'TentDehumid': '💦' + 'TentExhaust': '💨' }; return emojis[channel] || '⚡'; }; @@ -200,8 +197,8 @@ class ViewManager extends Component { } return `📅 ${operator} ${value}`; case 'sensor': - const sensorName = channel?.split(':').pop() || channel; - return `📡 ${sensorName} ${op} ${value}`; + // Show device:channel for clarity (e.g. "ac:controller:humidity") + return `📡 ${channel} ${op} ${value}`; case 'output': return `⚙️ ${channel} ${op} ${value}`; default: @@ -214,12 +211,9 @@ class ViewManager extends Component { if (!action?.channel) return '?'; const channelNames = { 'CircFanLevel': '🌀 Circ Fan', - 'TentLightLevel': '💡 Tent Light', - 'TentExhaustLevel': '💨 Tent Exhaust', - 'RoomExhaustLevel': '🌬️ Room Exhaust', 'CO2Valve': '🫧 CO2', 'BigDehumid': '💧 Big Dehumid', - 'TentDehumid': '💦 Tent Dehumid' + 'TentExhaust': '💨 Tent Exhaust Fan' }; const name = channelNames[action.channel] || action.channel; return `${name} = ${action.value}`; diff --git a/uiserver/webpack.config.js b/uiserver/webpack.config.js index 55bd0e4..1dd17ec 100644 --- a/uiserver/webpack.config.js +++ b/uiserver/webpack.config.js @@ -27,6 +27,7 @@ try { const OUTPUT_BINDINGS = { 'BigDehumid': { device: 'tapo', channel: 'r0', type: 'switch' }, 'CO2Valve': { device: 'tapo', channel: 'c', type: 'switch' }, + 'TentExhaust': { device: 'tapo', channel: 'fantent', type: 'switch' }, }; // ============================================= @@ -526,12 +527,9 @@ module.exports = { // Virtual output channel definitions const OUTPUT_CHANNELS = [ { channel: 'CircFanLevel', type: 'number', min: 0, max: 10, description: 'Circulation Fan Level' }, - { channel: 'TentLightLevel', type: 'number', min: 0, max: 10, description: 'Tent Light Level' }, - { channel: 'TentExhaustLevel', type: 'number', min: 0, max: 10, description: 'Tent Exhaust Fan Level' }, - { channel: 'RoomExhaustLevel', type: 'number', min: 0, max: 10, description: 'Room Exhaust Fan Level' }, { channel: 'CO2Valve', type: 'boolean', min: 0, max: 1, description: 'CO2 Valve' }, { channel: 'BigDehumid', type: 'boolean', min: 0, max: 1, description: 'Big Dehumidifier' }, - { channel: 'TentDehumid', type: 'boolean', min: 0, max: 1, description: 'Tent Dehumidifier' }, + { channel: 'TentExhaust', type: 'boolean', min: 0, max: 1, description: 'Tent Exhaust Fan' }, ]; // GET /api/outputs - List output channel definitions @@ -855,7 +853,12 @@ module.exports = { try { const rules = db.prepare('SELECT * FROM rules WHERE enabled = 1 ORDER BY position ASC').all(); - const desiredOutputs = {}; // channel -> value + + // Default all outputs to OFF (0) - if no rule sets them, they stay off + const desiredOutputs = {}; + for (const ch of OUTPUT_CHANNELS) { + desiredOutputs[ch.channel] = 0; + } for (const rule of rules) { try {