Zigbee 网络与穿戴设备传感器数据的融合分析:找到隐藏的生活模式

前言
我家有 20 多个传感器,每天产生上万条数据。
温湿度、光照、门窗状态、人体红外、手环心率......每个传感器都在忠实地记录着数据。但数据多不代表信息多------如果只是看一眼当前的温度,那和普通的温度计没什么区别。
把这些数据放在一起综合分析,才能发现真正有用的模式。
比如:通过 Zigbee 温湿度传感器和手环心率数据的对比,我发现------每次客厅湿度超过 70% 的时候,我的睡眠质量就会下降。这不是玄学,这是数据揭示的规律。
一、多源数据融合框架
1.1 数据源
python
数据源 = {
"Zigbee 传感器": {
"温湿度": "每 5 分钟上报,记录家中各房间环境",
"人体红外": "事件触发,记录人员活动",
"光照": "每 10 分钟上报,记录自然光变化",
"门窗": "事件触发,记录开关状态"
},
"智能手环": {
"心率": "连续监测,每分钟平均值",
"睡眠": "每晚睡眠周期分析",
"步数": "每日活动量汇总",
"血氧": "夜间最低血氧值"
},
"智能家居系统": {
"设备使用": "灯、空调、电视的使用时长",
"自动化触发": "各自动化的触发频率"
}
}
1.2 融合分析架构
graph TD
subgraph "数据采集层"
A["Zigbee 传感器数据"]
B["手环健康数据"]
C["智能家居使用数据"]
end
subgraph "数据存储层"
D["InfluxDB<br>时序数据库"]
end
subgraph "分析层"
E["关联分析"]
F["模式识别"]
G["异常检测"]
end
subgraph "展示层"
H["Grafana 仪表盘"]
I["日报/周报"]
J["实时告警"]
end
A & B & C --> D
D --> E & F & G
E & F & G --> H & I & J
二、具体分析场景
2.1 环境 - 健康关联分析
python
import pandas as pd
from datetime import datetime, timedelta
class 环境健康分析:
def __init__(self):
self.db = InfluxDBClient("localhost", "home_assistant")
def 查询关联数据(self, 天数=30):
"""查询最近 N 天的环境和健康数据"""
环境数据 = self._查询环境数据(天数)
健康数据 = self._查询健康数据(天数)
return pd.merge(环境数据, 健康数据, on="时间")
def 分析湿度对睡眠的影响(self):
"""分析卧室湿度与睡眠质量的关系"""
数据 = self.查询关联数据(30)
# 按湿度分桶统计
数据["湿度区间"] = pd.cut(数据["卧室湿度"],
bins=[0, 40, 50, 60, 70, 100],
labels=["<40%", "40-50%", "50-60%", "60-70%", ">70%"])
统计 = 数据.groupby("湿度区间")["睡眠评分"].mean()
print("不同湿度下的平均睡眠评分:")
print(统计)
# 结果输出:
# <40%: 6.2
# 40-50%: 7.8
# 50-60%: 8.1 ← 最佳
# 60-70%: 7.2
# >70%: 5.8 ← 湿度太高睡不好
def 分析温度与心率的关系(self):
"""分析客厅温度与静息心率的关系"""
数据 = self.查询关联数据(30)
相关性 = 数据["客厅温度"].corr(数据["静息心率"])
print(f"客厅温度与静息心率的相关系数: {相关性:.2f}")
# 结果输出:
# 客厅温度与静息心率的相关系数: 0.65
# 说明温度越高,我的心率也越高(身体在散热)
2.2 活动模式分析
python
class 活动模式分析:
def __init__(self):
self.红外传感器 = [
"binary_sensor.living_room_motion",
"binary_sensor.bedroom_motion",
"binary_sensor.kitchen_motion"
]
def 分析日常活动规律(self):
"""分析每天的活动规律"""
数据 = self._查询近 7 天红外数据()
for 传感器 in self.红外传感器:
触发统计 = 数据[传感器].resample("1H").sum()
print(f"\n{传感器} 每小时触发次数(近 7 天平均):")
for 时段 in range(24):
次数 = 触发统计[触发统计.index.hour == 时段].mean()
if 次数 > 0:
print(f" {时段:02d}:00 - {次数:.1f} 次")
# 输出示例:
# 书房红外 每小时触发次数:
# 09:00 - 12.5 次(上午集中办公)
# 14:00 - 15.3 次(下午办公)
# 22:00 - 0.5 次(偶尔加班)
def 检测行为异常(self):
"""检测与基线不符的行为模式"""
基线 = self._建立活动基线()
今日数据 = self._获取今日数据()
异常 = []
for 传感器, 今日次数 in 今日数据.items():
基线条数 = 基线[传感器]
偏差 = (今日次数 - 基线条数) / 基线条数
if abs(偏差) > 0.5: # 偏差超过 50%
异常.append({
"传感器": 传感器,
"今日": 今日次数,
"基线": 基线条数,
"偏差": f"{偏差:.0%}"
})
return 异常
2.3 预测分析
利用手环数据和 Zigbee 环境数据,可以做一些简单的预测:
python
class 健康预测:
def 预测睡眠质量(self):
"""根据当日数据预测今晚睡眠质量"""
今日特征 = {
"白天活动量": self._获取步数(),
"下午体温": self._获取 Zigbee 温度("卧室"),
"今日晒太阳时长": self._获取光照时长("阳台"),
"咖啡摄入": self._查询健康记录("咖啡"),
"睡前客厅亮度": self._预测亮度()
}
# 基于历史数据的简单预测模型
score = 7.0 # 基准分
if 今日特征["白天活动量"] < 3000:
score -= 0.5 # 活动量不足
if 今日特征["下午体温"] > 26:
score -= 1.0 # 太热影响入睡
if 今日特征["咖啡摄入"] > 2:
score -= 0.8 # 咖啡因超标
return max(1, min(10, score))
三、可视化与自动化
3.1 Grafana 仪表盘
json
{
"title": "环境 - 健康关联看板",
"panels": [
{
"title": "睡眠质量 vs 卧室温湿度",
"type": "graph",
"targets": [
"SELECT mean(value) FROM sleep_score WHERE $timeFilter",
"SELECT mean(value) FROM bedroom_temp WHERE $timeFilter",
"SELECT mean(value) FROM bedroom_humidity WHERE $timeFilter"
]
},
{
"title": "活动热力图(按小时/天)",
"type": "heatmap",
"targets": [
"SELECT count(value) FROM motion_sensor WHERE $timeFilter"
]
}
]
}
3.2 自动化触发
python
# 基于融合分析的自动化规则
融合分析自动化 = [
{
"条件": "卧室湿度 > 70% AND 时间 == 21:00",
"动作": "打开除湿机 + TTS 通知:『建议开一下除湿机,今晚湿度偏高』"
},
{
"条件": "书房有人 == False AND 客厅有人 == False AND 时间 > 22:00 AND 灯 == ON",
"动作": "询问是否关灯(可能是忘记关了)"
},
{
"条件": "心率 > 100bpm AND 人体红外 == 静止超过 30 分钟",
"动作": "建议测量体温,可能是发烧前兆"
}
]
四、避坑指南
4.1 不要过度分析
⚠️ 发现了"湿度>70% 时睡眠变差"的规律后,不要第一时间买除湿机------先确认这是因果关系还是相关关系。
✅ 正确做法:先做控制实验。人为调节一晚上的湿度到 50%,看睡眠是否真的改善。如果改善了,再决定买除湿机。
4.2 数据质量比数据量重要
⚠️ 如果传感器数据经常丢包,分析出来的"规律"可能全是噪声。
✅ 解决方案 :先分析传感器数据的完整性,完整性低于 95% 的传感器数据不纳入分析。
4.3 隐私边界
⚠️ 把卧室的人体红外数据和手环心率数据关联分析,可以非常准确地知道你几点上床、几点睡着、甚至"那个"了没有。
✅ 处理方式:这些数据只在本地存储和分析,绝不外传。分析结果也只以聚合形式(如"本周睡眠质量评分 7.5")展现,而不是原始数据。
总结
经过一个月的融合分析,我发现了一些有趣的事情:
- 我的最佳睡眠环境:温度 24°C、湿度 55%、睡前 1 小时不看手机
- 工作效率最高的时段:9:00-11:00,且当天气温在 22-26°C 之间
- 最容易焦虑的日子:连续两天没有出门的时候
这些发现让我对"家"有了更深的了解。原来不是我状态不稳定,而是环境在影响我。