import { DeviceDriver } from '../../drivers/types'; import { sleep } from './element.helper'; export type EnsurePlugResult = 'already-on' | 'turned-on' | 'still-off' | 'not-found' | 'unknown'; /** * 确保给吸顶灯/灯泡供电的插座(SwitchBot Plug)处于 ON。 * 灯/灯泡物理插在该插座上 → 插座 OFF 则下游灯无电,无法配对/无法控制。 * 用法:在 plug 添加用例结束后(无论本轮新加还是已存在)调用,作为后续灯/灯泡用例的供电前提。 * * 状态判断只读「卡片自身 label」(不读整页 source,避免 'ON' 子串到处命中而误判)。 * - label 含 off → 点卡片右侧电源键打开并校验 * - label 含 on → 已开,直接返回 * - label 读不出状态 → 只告警、**不乱点**(避免把已 ON 的插座点成 OFF) * * @param deviceName 插座在首页的卡片名(如 'Plug EU') */ export async function ensurePlugOn(driver: DeviceDriver, deviceName: string): Promise { await driver.dismissPopupIfPresent(); await driver.goBackToHomepage(); await sleep(600); await driver.dismissPopupIfPresent(); // 找卡片(找不到则向下滚几次) let card = await driver.findElementRaw('name', deviceName); for (let i = 0; i < 4 && !card; i++) { await driver.scrollDown(250); await sleep(800); card = await driver.findElementRaw('name', deviceName); } if (!card) { console.log(`ensurePlugOn: 找不到插座卡片「${deviceName}」(无法保证供电)`); return 'not-found'; } const readState = async (el: string): Promise => { const label = (await driver.getElementAttribute(el, 'label').catch(() => '')) || ''; if (/\boff\b/i.test(label)) return false; if (/\bon\b/i.test(label)) return true; return null; // label 未含明确状态 }; const state = await readState(card); if (state === true) { console.log(`插座「${deviceName}」已是 ON`); return 'already-on'; } if (state === null) { console.log(`ensurePlugOn: 卡片「${deviceName}」label 未含 on/off,跳过(不乱点,默认新加插座为 ON)`); return 'unknown'; } // state === false → 点右侧电源键打开(复用 plug_card 验证过的点位) const rect = await driver.getElementRect(card); await driver.tap(rect.x + rect.width - 30, rect.y + rect.height / 2); await sleep(8000); // 重新取卡片(开关后树可能变化)再校验 let after = await driver.findElementRaw('name', deviceName); if (!after) { await driver.scrollDown(150); await sleep(600); after = await driver.findElementRaw('name', deviceName); } const post = after ? await readState(after) : null; if (post === true) { console.log(`插座「${deviceName}」OFF → ON ✓`); return 'turned-on'; } console.log(`插座「${deviceName}」点电源键后仍非 ON(${post === false ? 'still OFF' : '状态未知'})`); return post === false ? 'still-off' : 'unknown'; }