新增米家环境监控模块 (采集/聚合/历史/前端 EnvView) + CI 挂载米家凭证目录并自动应用迁移
Docker Build and Push / build-image (push) Successful in 6m54s

This commit is contained in:
jif2.zhang
2026-09-21 11:42:58 +08:00
parent 53f63e0986
commit 8e2c6ffa35
36 changed files with 11327 additions and 428 deletions
+29
View File
@@ -0,0 +1,29 @@
// 手动跑一次米家采集 (备用): npm run data:mihome
// 带文件日志, 便于定位卡点
import fs from 'node:fs'
const LOG = 'D:\\workbench\\iboard\\server\\mihome\\.cache\\cli.log'
const log = (m) => fs.appendFileSync(LOG, new Date().toISOString() + ' ' + m + '\n')
process.on('uncaughtException', (e) => { log('uncaughtException: ' + (e.stack || e)); process.exit(1) })
process.on('unhandledRejection', (e) => { log('unhandledRejection: ' + (e && e.stack ? e.stack : String(e))); process.exit(1) })
log('start')
const m = await import('../server/mihome/index.js')
log('imported; calling dailyMaintenance')
try {
const r = await m.dailyMaintenance()
log('done: ' + JSON.stringify(r))
console.log('[data:mihome] 完成:', JSON.stringify(r))
} catch (e) {
if (e instanceof m.MihomeAuthError) {
log('auth error: ' + e.message)
console.log('[data:mihome] 米家授权不可用: ' + e.message)
console.log('[data:mihome] 请运行 npm run data:mihome:login 扫码授权')
process.exit(2)
}
log('failed: ' + (e && e.stack ? e.stack : String(e)))
console.error('[data:mihome] 失败:', e.message)
process.exit(1)
}
log('exit(0)')
process.exit(0)
+38
View File
@@ -0,0 +1,38 @@
// 手动扫码授权: npm run data:mihome:login
// 启动后台 QRlogin, 轮询状态; 出二维码后打印地址, 扫码成功后自动结束.
import { startQrLogin, getQrState, checkAuth } from '../server/mihome/client.js'
const auth = await checkAuth(true)
if (auth.status === 'ok') {
console.log('[米家] 已授权有效, 无需重扫 (本地 .cache 凭证可用)')
process.exit(0)
}
await startQrLogin()
const started = Date.now()
console.log('[米家] 等待扫码... (120s 超时)')
for (;;) {
const s = getQrState()
if (s.qrImageUrl && s.state === 'waiting') {
console.log('[米家] 二维码(需米家 App 扫):')
console.log(' image: ' + s.qrImageUrl)
}
if (s.state === 'failed') {
console.log('[米家] 扫码失败: ' + (s.lastError || '未知'))
process.exit(2)
}
if (s.state === 'idle' && s.running === false && !s.qrImageUrl) {
// 启动即失败(可能直接完成/或没权限)
console.log('[米家] 流程结束(无二维码产生), 请检查日志')
process.exit(2)
}
if (!s.running && s.qrImageUrl) {
console.log('[米家] 扫码成功, 凭证已保存到 server/mihome/.cache/')
process.exit(0)
}
if (Date.now() - started > 150000) {
console.log('[米家] 超时, 已停止; 可重跑.')
process.exit(3)
}
await new Promise((r) => setTimeout(r, 2000))
}