diff --git a/src/components/vital-wave/index.tsx b/src/components/vital-wave/index.tsx
index 550fc04..1f625ed 100644
--- a/src/components/vital-wave/index.tsx
+++ b/src/components/vital-wave/index.tsx
@@ -4,6 +4,9 @@ import Taro from '@tarojs/taro'
const V_PADDING = 8
const HEIGHT = 110
+// 纵轴最小跨度(BPM):心率生理波动常只有个位数,若按 min/max 归一化会把
+// 数 BPM 的微小起伏放大成满幅曲线,视觉误导为剧烈波动
+const MIN_SPAN = 20
interface Props {
points: number[]
@@ -63,8 +66,13 @@ export function VitalWave({ points, canvasId = 'vitalWave' }: Props) {
function drawWave(canvasId: string, w: number, h: number, pts: number[]) {
const ctx = Taro.createCanvasContext(canvasId)
- const min = Math.min(...pts)
- const max = Math.max(...pts)
+ let min = Math.min(...pts)
+ let max = Math.max(...pts)
+ if (max - min < MIN_SPAN) {
+ const mid = (min + max) / 2
+ min = mid - MIN_SPAN / 2
+ max = mid + MIN_SPAN / 2
+ }
const span = max - min || 1
const xAt = (i: number) => (pts.length <= 1 ? 0 : (i / (pts.length - 1)) * w)
const yAt = (v: number) => h - V_PADDING - ((v - min) / span) * (h - V_PADDING * 2)
diff --git a/src/pages/device/feature/add.tsx b/src/pages/device/feature/add.tsx
index 54dda95..9ca9627 100644
--- a/src/pages/device/feature/add.tsx
+++ b/src/pages/device/feature/add.tsx
@@ -8,6 +8,7 @@ import { StateView } from '@/components/state-view'
import { addHomeDevice } from '@/api/homeDevice'
import { getHomeList, type HomeInfo } from '@/api/home'
import { getRoomList, type HomeRoom } from '@/api/homeRoom'
+import { resolveCurrentHome, setCurrentHomeId } from '@/store/currentHome'
import { showToast } from '@/utils/toast'
import { navigateBack } from '@/utils/navigation'
import styles from './add.module.scss'
@@ -33,9 +34,10 @@ export default function DeviceAdd() {
setLoadError(false)
getHomeList()
.then(async (list) => {
- const first = list[0] ?? null
+ const first = resolveCurrentHome(list)
if (cancelled) return
setHome(first)
+ if (first) setCurrentHomeId(first.homeId)
if (!first) return
const roomList = await getRoomList(first.homeId)
if (cancelled) return
diff --git a/src/pages/device/feature/detail.tsx b/src/pages/device/feature/detail.tsx
index 497b752..d6c4d0d 100644
--- a/src/pages/device/feature/detail.tsx
+++ b/src/pages/device/feature/detail.tsx
@@ -86,7 +86,7 @@ export default function Detail() {
const fmt = (v: number | undefined): string => (v === undefined || v === null ? '--' : String(v))
const goBleConfig = () => navigateTo(ROUTES.DEVICE_BLE_CONFIG)
- const goWifiConfig = () => navigateTo(ROUTES.DEVICE_BLE_CONFIG)
+ void goBleConfig
return (
@@ -157,8 +157,10 @@ export default function Detail() {
+ {/* BLE 配置流程联调未完成,暂隐藏两个配置入口
+ */}
diff --git a/src/pages/device/index.tsx b/src/pages/device/index.tsx
index bef8ded..6651f5b 100644
--- a/src/pages/device/index.tsx
+++ b/src/pages/device/index.tsx
@@ -9,6 +9,7 @@ import { BottomSheet } from '@/components/bottom-sheet'
import { getHomeDeviceList, unbindHomeDevice, type HomeDevice } from '@/api/homeDevice'
import { getRoomList, type HomeRoom } from '@/api/homeRoom'
import { getHomeList, type HomeInfo } from '@/api/home'
+import { resolveCurrentHome, setCurrentHomeId } from '@/store/currentHome'
import { ROUTES } from '@/constants/routes'
import { navigateTo } from '@/utils/navigation'
import { showToast } from '@/utils/toast'
@@ -61,10 +62,11 @@ export default function DeviceList() {
try {
const list = await getHomeList()
setFamilies(list)
- // 若当前未选中,默认选第一条
+ // 未选中时按持久化的 homeId 恢复,失效则回落第一条
setCurrentFamily((prev) => {
- const next = prev ?? list[0] ?? null
+ const next = prev ?? resolveCurrentHome(list)
if (next && next.homeId !== prev?.homeId) {
+ setCurrentHomeId(next.homeId)
setFilterRoomId('')
loadDevices(next.homeId)
loadRooms(next.homeId)
@@ -154,6 +156,7 @@ export default function DeviceList() {
const confirmFamilySheet = () => {
if (pendingFamily && pendingFamily.homeId !== currentFamily?.homeId) {
setCurrentFamily(pendingFamily)
+ setCurrentHomeId(pendingFamily.homeId)
setFilterRoomId('')
loadDevices(pendingFamily.homeId)
loadRooms(pendingFamily.homeId)
diff --git a/src/pages/scene/select.tsx b/src/pages/scene/select.tsx
index f47e207..df2a3fe 100644
--- a/src/pages/scene/select.tsx
+++ b/src/pages/scene/select.tsx
@@ -7,6 +7,7 @@ import { Empty } from '@/components/empty'
import { StateView } from '@/components/state-view'
import { BottomSheet } from '@/components/bottom-sheet'
import { getHomeList, type HomeInfo } from '@/api/home'
+import { resolveCurrentHome, setCurrentHomeId } from '@/store/currentHome'
import {
getRoomList, addRoom, updateRoom, deleteRoom, ROOM_SENCE_MAP, type HomeRoom
} from '@/api/homeRoom'
@@ -45,8 +46,9 @@ export default function SceneSelect() {
setLoadError(false)
try {
const homes = await getHomeList()
- const first = homes[0] ?? null
+ const first = resolveCurrentHome(homes)
setHome(first)
+ if (first) setCurrentHomeId(first.homeId)
if (!first) {
setList([])
return
diff --git a/src/store/currentHome.ts b/src/store/currentHome.ts
new file mode 100644
index 0000000..8fa2c0e
--- /dev/null
+++ b/src/store/currentHome.ts
@@ -0,0 +1,18 @@
+import { storage } from '@/utils/storage'
+import type { HomeInfo } from '@/api/home'
+
+// 当前选中家庭持久化 key:设备列表 / 房间管理 / 添加设备三页共享
+const KEY = 'currentHomeId'
+
+export function setCurrentHomeId(homeId: string): void {
+ storage.set(KEY, homeId)
+}
+
+// 从家庭列表解析当前家庭:优先已持久化的选择,失效(不在列表,如切换账号)时回落第一条并重新落盘
+export function resolveCurrentHome(homes: HomeInfo[]): HomeInfo | null {
+ if (homes.length === 0) return null
+ const stored = storage.get(KEY)
+ const next = homes.find((h) => h.homeId === stored) ?? homes[0]
+ storage.set(KEY, next.homeId)
+ return next
+}