69 lines
2.9 KiB
TypeScript
69 lines
2.9 KiB
TypeScript
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<EnsurePlugResult> {
|
|
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<boolean | null> => {
|
|
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';
|
|
}
|