AI_UIAutomation/scripts/reset-off.ts

62 lines
3.0 KiB
TypeScript

/**
* 复位:把首页所有 On/Off 开关类设备(Plug Mini/彩灯/吸顶灯/Bot 等显示 "On" 的卡)关成 Off。
* 手动滚动找卡 + 卡名右上开关钮坐标点击(同 plug 控制);靠顶卡先下滑避免误触顶栏。
* 用法:PLATFORM=android npx ts-node scripts/reset-off.ts
*/
import * as dotenv from 'dotenv';
import * as path from 'path';
dotenv.config({ path: path.resolve(__dirname, '../.env') });
import { createDriver } from '../drivers/factory';
const sleep = (ms: number) => new Promise(r => setTimeout(r, ms));
// 解析首页卡片:卡名(nameText)+ 同列下方的 On/Off 状态 + 开关钮坐标。
function onCards(src: string): { name: string; nameX: number; nameY: number; nameW: number }[] {
const names: { name: string; x: number; y: number; w: number }[] = [];
const states: { t: string; x: number; y: number }[] = [];
for (const n of src.split('<')) {
const b = n.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
if (/resource-id="[^"]*\/nameText"/.test(n)) {
const t = (n.match(/text="([^"]*)"/) || [])[1];
if (t && t.trim() && b) names.push({ name: t.trim(), x: +b[1], y: +b[2], w: +b[3] - +b[1] });
}
const st = (n.match(/text="(On|Off)"/) || [])[1];
if (st && b) states.push({ t: st, x: +b[1], y: +b[2] });
}
// 卡名匹配同列下方(x±200, y在[nameY,nameY+150])的 On 状态
const out: { name: string; nameX: number; nameY: number; nameW: number }[] = [];
for (const nm of names) {
const s = states.find(s => Math.abs(s.x - nm.x) < 200 && s.y > nm.y && s.y < nm.y + 150);
if (s && s.t === 'On') out.push({ name: nm.name, nameX: nm.x, nameY: nm.y, nameW: nm.w });
}
return out;
}
async function main() {
const d: any = createDriver();
await d.createSession();
try {
let total = 0;
for (let round = 0; round < 15; round++) {
await d.goBackToHomepage(); await sleep(1200); await d.dismissPopupIfPresent();
// 滚动找一个 On 卡
let target: { name: string; nameX: number; nameY: number; nameW: number } | null = null;
for (let i = 0; i < 8 && !target; i++) {
const c = onCards(await d.getSource());
if (c.length) target = c[0];
else { await d.scrollDown(500); await sleep(700); }
}
if (!target) { console.log('首页已无 On 设备,完成'); break; }
// 靠顶卡:开关钮 y-95 会落顶栏 → 下滑再读
if (target.nameY - 95 < 300) { await d.scrollDown(400); await sleep(800); const c2 = onCards(await d.getSource()).find(x => x.name === target!.name); if (c2) target = c2; }
const btnX = target.nameX + target.nameW - 48, btnY = target.nameY - 95;
await d.tap(btnX, btnY); await sleep(2500);
await d.dismissPopupIfPresent();
total++;
console.log(`关闭 ${target.name} (开关钮 ${btnX},${btnY})`);
await sleep(1500);
}
console.log(`\n共关闭 ${total} 个 On/Off 开关设备`);
} finally { await d.destroySession(); }
}
main().catch(e => { console.error('ERR', e.message); process.exit(1); });