/** * 复位:把首页所有 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); });