米家智能设备Python实战指南:零门槛实现家居自动化效率提升
你是否曾因每天重复操作智能设备而感到繁琐?是否想过用几行代码就能让家中设备自动响应你的生活习惯?本文将带你通过Python编程实现米家智能设备的自动化控制,从解决实际问题出发,逐步掌握从基础控制到高级自动化的全流程技能。无论你是编程新手还是有经验的开发者,都能在这里找到提升智能家居效率的实用方案。
问题篇:智能家居控制的三大核心痛点
痛点一:多设备操作的时间成本陷阱
每天重复手动开关灯光、调节空调温度、检查设备状态,这些碎片化操作累计起来每年会消耗超过20小时的宝贵时间。更令人沮丧的是,当你忘记关闭设备时,不仅浪费能源,还可能带来安全隐患。你是否计算过这些重复操作占用了你多少专注工作的时间?
痛点二:场景联动的实现壁垒
大多数智能家居APP提供的场景模式固定且有限,无法满足个性化需求。比如"回家模式"需要同时开启灯光、空调和净化器,但不同品牌设备往往无法无缝协同。你是否曾因系统不支持特定设备组合而放弃打造理想的生活场景?
痛点三:批量管理的效率瓶颈
当家中智能设备超过5个,手动逐个检查状态和更新设置就变得异常繁琐。想象一下,在出门前需要检查每个房间的灯光是否关闭,这种体验显然与"智能"二字背道而驰。如何才能像管理电脑文件一样高效管理所有智能设备?
方案篇:米家API技术原理与核心优势
技术原理通俗解读:智能家居的"翻译官"
米家API就像一位精通所有智能设备语言的翻译官,它在你的Python程序和智能设备之间搭建了沟通桥梁。当你发送指令时,API负责:
- 身份验证:像机场安检一样确认你的权限
- 指令编码:将Python命令翻译成设备能理解的"方言"
- 数据传输:通过加密通道安全传递信息
- 结果解析:把设备响应转化为易懂的Python数据
这个过程类似于你通过翻译软件与外国朋友交流,无需学习对方语言,却能顺畅沟通。
核心优势:为什么选择Python控制智能家居?
- 灵活性:不受APP功能限制,实现任何你能想到的控制逻辑
- 可扩展性:轻松集成到家庭自动化系统、语音助手或网页应用
- 社区支持:丰富的第三方库和示例代码加速开发
- 学习曲线平缓:即使是编程新手也能快速上手
实践篇:从基础到专家的阶梯式实战案例
基础级:10行代码实现设备远程控制
环境准备与安装
首先确保你的Python环境已准备就绪,推荐使用Python 3.8及以上版本。安装米家API有两种方式:
快速安装(推荐新手):
pip install mijiaAPI
源码安装(适合开发者):
git clone https://gitcode.com/gh_mirrors/mi/mijia-api
cd mijia-api
pip install .
第一个控制程序:智能灯开关
from mijiaAPI import mijiaAPI
import time
# 初始化API客户端
smart_home = mijiaAPI()
# 登录认证(首次运行会显示二维码)
print("请扫描二维码登录米家账号...")
smart_home.login()
# 获取所有设备列表
devices = smart_home.get_devices_list()
# 查找智能灯设备
smart_light = next((dev for dev in devices if dev['name'] == '客厅主灯'), None)
if smart_light:
# 开启灯光
smart_home.set_device_prop(
did=smart_light['did'],
siid=2, # 设备服务ID
piid=1, # 开关属性ID
value=True
)
print(f"已开启 {smart_light['name']}")
# 5秒后关闭灯光
time.sleep(5)
smart_home.set_device_prop(
did=smart_light['did'],
siid=2,
piid=1,
value=False
)
print(f"已关闭 {smart_light['name']}")
else:
print("未找到智能灯设备")
常见陷阱:设备名称区分大小写,且必须与米家APP中显示的完全一致。如果找不到设备,尝试使用设备型号或ID进行查找。
风险提示:确保在测试环境中运行代码,避免意外控制重要设备。建议先使用不影响生活的设备(如小夜灯)进行测试。
进阶级:场景自动化与设备联动
环境感应自动调节系统
这个案例将实现根据室内温湿度自动调节空调和加湿器:
from mijiaAPI import mijiaAPI
import time
from datetime import datetime
def adjust_environment(api):
# 获取温湿度传感器数据
sensor = next((dev for dev in api.get_devices_list() if '温湿度' in dev['name']), None)
if not sensor:
print("未找到温湿度传感器")
return
# 获取当前温湿度
humidity_data = api.get_device_prop(
did=sensor['did'],
siid=3, # 湿度传感器服务ID
piid=7 # 湿度属性ID
)
temperature_data = api.get_device_prop(
did=sensor['did'],
siid=3, # 温度传感器服务ID
piid=6 # 温度属性ID
)
current_humidity = humidity_data['value']
current_temp = temperature_data['value']
print(f"当前温度: {current_temp}°C, 湿度: {current_humidity}%")
# 控制加湿器
humidifier = next((dev for dev in api.get_devices_list() if '加湿' in dev['name']), None)
if humidifier:
if current_humidity < 40:
api.set_device_prop(did=humidifier['did'], siid=2, piid=1, value=True)
api.set_device_prop(did=humidifier['did'], siid=2, piid=2, value=80) # 设置湿度目标
print("湿度低于40%,已开启加湿器")
elif current_humidity > 60:
api.set_device_prop(did=humidifier['did'], siid=2, piid=1, value=False)
print("湿度高于60%,已关闭加湿器")
# 控制空调
air_conditioner = next((dev for dev in api.get_devices_list() if '空调' in dev['name']), None)
if air_conditioner:
hour = datetime.now().hour
# 夏季模式 (5-9月)
if 5 <= datetime.now().month <= 9:
if current_temp > 26:
api.set_device_prop(did=air_conditioner['did'], siid=2, piid=1, value=True)
api.set_device_prop(did=air_conditioner['did'], siid=2, piid=5, value=24) # 设置温度
print("温度过高,已开启空调制冷")
# 冬季模式 (12-2月)
elif 12 <= datetime.now().month or datetime.now().month <= 2:
if current_temp < 18:
api.set_device_prop(did=air_conditioner['did'], siid=2, piid=1, value=True)
api.set_device_prop(did=air_conditioner['did'], siid=2, piid=5, value=22) # 设置温度
print("温度过低,已开启空调制热")
# 主程序
smart_home = mijiaAPI()
smart_home.login()
# 每5分钟检查并调节环境
while True:
adjust_environment(smart_home)
time.sleep(300) # 5分钟 = 300秒
#自动化技巧:使用crontab或Windows任务计划程序让脚本在系统启动时自动运行,实现无人值守的环境调节。
备选方案:如果设备响应缓慢,尝试增加请求间隔或实现重试机制,避免频繁发送指令导致设备无响应。
专家级:数据驱动的智能决策系统
能耗分析与优化系统
这个高级案例将收集设备用电数据,分析使用模式,并自动优化能耗:
from mijiaAPI import mijiaAPI
import time
import json
from datetime import datetime, timedelta
import matplotlib.pyplot as plt # 需要额外安装:pip install matplotlib
class EnergyAnalyzer:
def __init__(self, data_file="energy_data.json"):
self.data_file = data_file
self.load_data()
def load_data(self):
try:
with open(self.data_file, 'r') as f:
self.data = json.load(f)
except (FileNotFoundError, json.JSONDecodeError):
self.data = {"devices": {}, "daily_summary": {}}
def save_data(self):
with open(self.data_file, 'w') as f:
json.dump(self.data, f, indent=2)
def record_energy_usage(self, api):
# 获取所有支持能耗统计的设备
energy_devices = [dev for dev in api.get_devices_list() if '能耗' in dev['name'] or '空调' in dev['name']]
for device in energy_devices:
did = device['did']
name = device['name']
# 获取当前能耗数据(不同设备的属性ID可能不同)
try:
energy_data = api.get_device_prop(did=did, siid=4, piid=1) # 能耗属性ID
power_data = api.get_device_prop(did=did, siid=4, piid=2) # 功率属性ID
timestamp = datetime.now().isoformat()
# 初始化设备数据存储
if did not in self.data["devices"]:
self.data["devices"][did] = {
"name": name,
"model": device['model'],
"readings": []
}
# 记录数据
self.data["devices"][did]["readings"].append({
"timestamp": timestamp,
"energy_kwh": energy_data['value'],
"power_w": power_data['value']
})
# 只保留最近30天数据
cutoff_time = (datetime.now() - timedelta(days=30)).isoformat()
self.data["devices"][did]["readings"] = [
r for r in self.data["devices"][did]["readings"]
if r["timestamp"] >= cutoff_time
]
print(f"已记录 {name} 能耗数据: {energy_data['value']}kWh, 当前功率: {power_data['value']}W")
except Exception as e:
print(f"获取 {name} 能耗数据失败: {str(e)}")
# 生成每日摘要
self.generate_daily_summary()
self.save_data()
def generate_daily_summary(self):
today = datetime.now().strftime("%Y-%m-%d")
self.data["daily_summary"][today] = {}
for did, device_data in self.data["devices"].items():
# 筛选今天的数据
today_readings = [
r for r in device_data["readings"]
if r["timestamp"].startswith(today)
]
if today_readings:
# 计算今日能耗(最后一次读数 - 第一次读数)
first = today_readings[0]["energy_kwh"]
last = today_readings[-1]["energy_kwh"]
energy_used = last - first
# 计算平均功率
avg_power = sum(r["power_w"] for r in today_readings) / len(today_readings)
self.data["daily_summary"][today][did] = {
"name": device_data["name"],
"energy_used_kwh": round(energy_used, 2),
"avg_power_w": round(avg_power, 1),
"max_power_w": max(r["power_w"] for r in today_readings),
"reading_count": len(today_readings)
}
def analyze_usage_patterns(self):
"""分析用电模式,识别高能耗时段"""
if not self.data["daily_summary"]:
print("没有足够数据进行分析")
return
# 获取最近7天数据
recent_days = sorted(self.data["daily_summary"].keys())[-7:]
patterns = {}
for did, device_data in self.data["devices"].items():
device_name = device_data["name"]
patterns[device_name] = {"hours": {}, "avg_daily_usage": 0}
# 计算平均日用电量
daily_usages = []
for day in recent_days:
if did in self.data["daily_summary"][day]:
daily_usages.append(self.data["daily_summary"][day][did]["energy_used_kwh"])
if daily_usages:
patterns[device_name]["avg_daily_usage"] = round(sum(daily_usages)/len(daily_usages), 2)
# 分析小时用电模式
for reading in device_data["readings"]:
dt = datetime.fromisoformat(reading["timestamp"])
hour = dt.hour
power = reading["power_w"]
if hour not in patterns[device_name]["hours"]:
patterns[device_name]["hours"][hour] = []
patterns[device_name]["hours"][hour].append(power)
# 计算每小时平均功率
for hour in patterns[device_name]["hours"]:
patterns[device_name]["hours"][hour] = round(
sum(patterns[device_name]["hours"][hour]) / len(patterns[device_name]["hours"][hour]), 1
)
return patterns
def optimize_energy_usage(self, api, patterns):
"""基于用电模式自动优化设备使用"""
current_hour = datetime.now().hour
for device_name, data in patterns.items():
# 查找设备
device = next((dev for dev in api.get_devices_list() if dev['name'] == device_name), None)
if not device:
continue
# 识别高能耗时段(平均功率超过阈值)
high_usage_hours = [h for h, p in data["hours"].items() if p > 100] # 超过100W视为高能耗
# 如果当前在高能耗时段且设备正在运行,尝试优化
if current_hour in high_usage_hours:
try:
# 检查设备状态
status = api.get_device_prop(did=device['did'], siid=2, piid=1)
if status['value']: # 设备正在运行
# 获取设备类型并应用相应优化策略
if '空调' in device_name:
# 空调:温度微调1-2度
current_temp = api.get_device_prop(did=device['did'], siid=2, piid=5)
new_temp = current_temp['value'] + 1 if current_temp['value'] < 26 else current_temp['value'] - 1
api.set_device_prop(did=device['did'], siid=2, piid=5, value=new_temp)
print(f"优化 {device_name}: 温度从 {current_temp['value']}°C 调整为 {new_temp}°C")
elif '热水器' in device_name:
# 热水器:如果不是使用高峰期,暂时关闭
if not (17 <= current_hour <= 21): # 晚上5-9点是使用高峰
api.set_device_prop(did=device['did'], siid=2, piid=1, value=False)
print(f"暂时关闭 {device_name},非使用高峰时段")
except Exception as e:
print(f"优化 {device_name} 失败: {str(e)}")
# 主程序
if __name__ == "__main__":
analyzer = EnergyAnalyzer()
smart_home = mijiaAPI()
smart_home.login()
try:
while True:
# 每15分钟记录一次能耗数据
analyzer.record_energy_usage(smart_home)
# 每天凌晨2点进行一次用电模式分析和优化
if datetime.now().hour == 2 and datetime.now().minute < 15:
patterns = analyzer.analyze_usage_patterns()
if patterns:
analyzer.optimize_energy_usage(smart_home, patterns)
print("完成每日能耗优化")
time.sleep(900) # 15分钟 = 900秒
except KeyboardInterrupt:
print("程序已手动终止")
finally:
analyzer.save_data()
常见陷阱:不同设备的siid和piid(服务ID和属性ID)可能不同,需要参考设备的官方文档或使用API探索功能获取正确的ID。
效率对比:手动监控和调节设备能耗每月需约4小时,自动化系统仅需初始设置30分钟,之后完全自动运行,每年可节省约45小时。
反常识应用场景:解锁智能家居新可能
场景一:基于工作状态的智能调节
想象一下,你的电脑可以感知你是否在工作,并自动调节环境:
- 当你连续5分钟没有键盘鼠标操作,自动调暗灯光
- 当代码编译或视频渲染时(CPU占用率>80%),自动开启风扇
- 当你开始视频会议时,自动关闭背景噪音源(如空气净化器)
实现这个场景的核心代码片段:
import psutil # 需要安装:pip install psutil
def check_work_status():
# 检查最近5分钟是否有键盘鼠标活动
# 实际实现需结合系统API,此处为伪代码
user_active = True # 假设通过系统API获取
# 检查CPU使用率
cpu_usage = psutil.cpu_percent(interval=1)
# 检查是否在视频会议(检测摄像头使用)
camera_used = False
for proc in psutil.process_iter(['name']):
if 'zoom' in proc.info['name'].lower() or 'teams' in proc.info['name'].lower():
camera_used = True
break
return {
'user_active': user_active,
'high_cpu': cpu_usage > 80,
'in_meeting': camera_used
}
# 集成到主控制循环
work_status = check_work_status()
if not work_status['user_active']:
# 调暗灯光
adjust_light_brightness(smart_home, 30) # 30%亮度
elif work_status['high_cpu']:
# 开启风扇
control_fan(smart_home, True)
if work_status['in_meeting']:
# 关闭背景噪音设备
control_noise_devices(smart_home, False)
场景二:基于天气和日程的预测性控制
通过结合天气预报和你的日程安排,系统可以提前调整家居环境:
- 根据明天的天气预报,提前预热或预冷房间
- 当日程显示你即将回家时,提前开启空调和灯光
- 检测到未来几天外出,自动进入节能模式
实现这个场景的核心代码片段:
import requests
from ics import Calendar # 需要安装:pip install ics
def get_weather_forecast(city="北京"):
# 获取未来3天天气预报(实际应用需使用真实API)
# 此处为模拟数据
return [
{"date": "2023-11-15", "high": 18, "low": 8, "condition": "晴天"},
{"date": "2023-11-16", "high": 15, "low": 5, "condition": "多云"},
{"date": "2023-11-17", "high": 12, "low": 3, "condition": "小雨"}
]
def get_calendar_events():
# 从日历服务获取今日和明日事件
# 此处为模拟数据
return [
{"start": "2023-11-15T14:00:00", "end": "2023-11-15T16:00:00", "summary": "在家办公"},
{"start": "2023-11-16T09:00:00", "end": "2023-11-16T18:00:00", "summary": "外出会议"}
]
def predictive_control(smart_home):
weather = get_weather_forecast()
events = get_calendar_events()
tomorrow = (datetime.now() + timedelta(days=1)).strftime("%Y-%m-%d")
# 查找明天的天气
tomorrow_weather = next((w for w in weather if w["date"] == tomorrow), None)
# 查找明天的事件
tomorrow_events = [e for e in events if e["start"].startswith(tomorrow)]
# 如果明天有外出且天气寒冷,提前预热
if tomorrow_events and any("外出" in e["summary"] for e in tomorrow_events):
if tomorrow_weather and tomorrow_weather["low"] < 10:
# 明天早上6点开始预热
预热_time = "06:00"
print(f"明天有外出计划且气温较低,已设置{预热_time}自动预热")
# 设置定时任务代码...
实用配置模板:快速部署智能家居自动化
模板一:基础设备控制配置
创建config.json文件存储设备ID和常用配置:
{
"device_ids": {
"living_room_light": "your_device_id_here",
"bedroom_light": "your_device_id_here",
"air_conditioner": "your_device_id_here",
"humidifier": "your_device_id_here"
},
"scenes": {
"good_morning": {
"time": "07:00",
"actions": [
{"device": "living_room_light", "action": "turn_on", "brightness": 70},
{"device": "air_conditioner", "action": "set_temp", "value": 24}
]
},
"good_night": {
"time": "23:00",
"actions": [
{"device": "living_room_light", "action": "turn_off"},
{"device": "bedroom_light", "action": "turn_on", "brightness": 20},
{"device": "air_conditioner", "action": "set_temp", "value": 22}
]
}
}
}
模板二:能耗监控配置
创建energy_monitor_config.json配置文件:
{
"monitor_interval": 900, # 15分钟记录一次
"devices": [
{
"name": "客厅空调",
"did": "your_device_id_here",
"siid": 4,
"energy_piid": 1,
"power_piid": 2,
"thresholds": {
"max_power": 1500, # 超过此功率发出警告
"daily_budget": 5 # 每日能耗预算(kWh)
}
},
{
"name": "电热水器",
"did": "your_device_id_here",
"siid": 4,
"energy_piid": 1,
"power_piid": 2,
"thresholds": {
"max_power": 2000,
"daily_budget": 3
}
}
],
"notifications": {
"enable": true,
"method": "console", # 可以扩展为email或推送通知
"threshold_percent": 80 # 达到预算的80%时通知
}
}
模板三:环境自动调节配置
创建environment_config.json配置文件:
{
"sensor_device": {
"name": "客厅温湿度传感器",
"did": "your_device_id_here",
"siid": 3,
"temp_piid": 6,
"humidity_piid": 7
},
"target_ranges": {
"temperature": {
"daytime": [22, 26], # 白天温度范围
"nighttime": [18, 22], # 夜间温度范围
"away": [16, 28] # 离家时温度范围
},
"humidity": {
"ideal": [40, 60], # 理想湿度范围
"tolerance": 5 # 容忍偏差
}
},
"control_devices": {
"air_conditioner": {
"did": "your_device_id_here",
"siid": 2,
"power_piid": 1,
"temp_piid": 5,
"mode_piid": 4
},
"humidifier": {
"did": "your_device_id_here",
"siid": 2,
"power_piid": 1,
"level_piid": 2
}
},
"presence_detection": {
"enabled": true,
"timeout_minutes": 30 # 30分钟无人活动视为离家
}
}
总结:智能家居自动化的价值与未来
通过Python控制米家智能设备,不仅解决了日常操作的痛点,更开启了个性化智能家居的无限可能。从简单的远程控制到复杂的预测性自动化,米家API为我们提供了强大而灵活的工具。
效率提升数据:
- 基础自动化:减少90%的手动操作时间
- 场景联动:实现复杂场景一键触发,响应速度提升80%
- 能耗优化:通过智能调节平均节省15-25%的能源消耗
随着技术的发展,智能家居将更加智能和人性化。未来,结合AI和机器学习,我们的家居系统将能更准确地预测需求,自动调整环境,真正实现"懂你"的智慧生活。
现在就开始你的智能家居自动化之旅吧!从本文提供的基础案例出发,逐步构建属于你的智能生活系统。记住,最好的智能家居系统是能够完美适应你的生活习惯,而不是让你去适应它。
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5.1GLM-5.1是智谱迄今最智能的旗舰模型,也是目前全球最强的开源模型。GLM-5.1大大提高了代码能力,在完成长程任务方面提升尤为显著。和此前分钟级交互的模型不同,它能够在一次任务中独立、持续工作超过8小时,期间自主规划、执行、自我进化,最终交付完整的工程级成果。Jinja00
LongCat-AudioDiT-1BLongCat-AudioDiT 是一款基于扩散模型的文本转语音(TTS)模型,代表了当前该领域的最高水平(SOTA),它直接在波形潜空间中进行操作。00- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
HY-Embodied-0.5这是一套专为现实世界具身智能打造的基础模型。该系列模型采用创新的混合Transformer(Mixture-of-Transformers, MoT) 架构,通过潜在令牌实现模态特异性计算,显著提升了细粒度感知能力。Jinja00
FreeSql功能强大的对象关系映射(O/RM)组件,支持 .NET Core 2.1+、.NET Framework 4.0+、Xamarin 以及 AOT。C#00