首页
/ 米家智能设备Python实战指南:零门槛实现家居自动化效率提升

米家智能设备Python实战指南:零门槛实现家居自动化效率提升

2026-03-16 02:44:13作者:谭伦延

你是否曾因每天重复操作智能设备而感到繁琐?是否想过用几行代码就能让家中设备自动响应你的生活习惯?本文将带你通过Python编程实现米家智能设备的自动化控制,从解决实际问题出发,逐步掌握从基础控制到高级自动化的全流程技能。无论你是编程新手还是有经验的开发者,都能在这里找到提升智能家居效率的实用方案。

问题篇:智能家居控制的三大核心痛点

痛点一:多设备操作的时间成本陷阱

每天重复手动开关灯光、调节空调温度、检查设备状态,这些碎片化操作累计起来每年会消耗超过20小时的宝贵时间。更令人沮丧的是,当你忘记关闭设备时,不仅浪费能源,还可能带来安全隐患。你是否计算过这些重复操作占用了你多少专注工作的时间?

痛点二:场景联动的实现壁垒

大多数智能家居APP提供的场景模式固定且有限,无法满足个性化需求。比如"回家模式"需要同时开启灯光、空调和净化器,但不同品牌设备往往无法无缝协同。你是否曾因系统不支持特定设备组合而放弃打造理想的生活场景?

痛点三:批量管理的效率瓶颈

当家中智能设备超过5个,手动逐个检查状态和更新设置就变得异常繁琐。想象一下,在出门前需要检查每个房间的灯光是否关闭,这种体验显然与"智能"二字背道而驰。如何才能像管理电脑文件一样高效管理所有智能设备?

方案篇:米家API技术原理与核心优势

技术原理通俗解读:智能家居的"翻译官"

米家API就像一位精通所有智能设备语言的翻译官,它在你的Python程序和智能设备之间搭建了沟通桥梁。当你发送指令时,API负责:

  1. 身份验证:像机场安检一样确认你的权限
  2. 指令编码:将Python命令翻译成设备能理解的"方言"
  3. 数据传输:通过加密通道安全传递信息
  4. 结果解析:把设备响应转化为易懂的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和机器学习,我们的家居系统将能更准确地预测需求,自动调整环境,真正实现"懂你"的智慧生活。

现在就开始你的智能家居自动化之旅吧!从本文提供的基础案例出发,逐步构建属于你的智能生活系统。记住,最好的智能家居系统是能够完美适应你的生活习惯,而不是让你去适应它。

登录后查看全文
热门项目推荐
相关项目推荐