『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 14171|回复: 18

[经验分享] 米家HASS组件代码剖析

[复制链接]

7

主题

48

帖子

390

积分

论坛技术达人

积分
390
金钱
342
HASS币
0
QQ
发表于 2017-7-31 07:49:33 | 显示全部楼层 |阅读模式
本帖最后由 hevake_lcj 于 2017-7-31 12:54 编辑

上一个帖子里,博主分享了 首次按教程接入小米网关经历, 成功了。
秉着知其然,一定要知其所以然的探索精神,博主决定好好剖析一下组件的代码。
如有不对的地方,还请各位指正。



插件文件的组织结构:
Image.png

最上面有一个 xiaomi.py,是总的组件。下以的四个子目录各有一个 xiaomi.py,是顶对各种设备的组件。


./xiaomi.py
在这个文件里,定义了 setup(hass, config) 函数,这个函数的功能是安装组件的,每个组件都有。
它的执行过程如下:

  • 它从配置文件里读出有几个网关,每个网关的 sid 与 key。
    Image [1].png
  • 创建一个 PyXiaomiGateway 对象给 PY_XIAOMI_GATEWAY 用于管理所有的小米网关。
    Image [2].png
  • 用 PY_XIAOMI_GATEWAY 对象去发现网关。
    Image [3].png
  • PY_XIAOMI_GATEWAY 创建线程用于接收所有网关数据
    Image [4].png

    其实,PyXiaomiGateway.listen() 方法就是创建一个线程专门接收小米网关的 udp 数据包:
    Image [5].png
    PyXiaomiGateway._listen_to_msg() 函数内容:
    Image [6].png
    它是一个 while 循环,当 udp 接收到数据时,根据 ip 地址从 gateways 中找出对应的 XiaomiGateway 对象 gateway。
    如果是网关的 "heartbeat" 则 gateway.update_key(data['token']),如果是设备属性报告 "report" 或者是设备的心跳,则 hass.add_job(gateway.push_data, data)
    那 hass.add_job() 是干什么的?
  • 加载设备驱动
    Image [7].png
其中定义了三个类:
  • PyXiaomiGateway,管理所有网关的类。负责管理XiaomiGateway,与网络数据包的接收与发送。
  • XiaomiGateway,小米网关类。负责网关操作的命令封装与消息解释。
  • XiaomiDevice,小米设备基类。负责设备基本的方法实现。

XiaomiDevice类的定义:
    Image [8].png
    该类定义了所有小米设备的属性与方法。


./switch/xiaomi.py 小米开关代码
在这个文件里,定义了switch的设备加载与设备行为处理方法

该文件分如下几个部分:

  • import 模块
    Image [9].png
    导入的有:SwitchDevice(标准开关类的基类),PY_XIAOMI_GATEWAY(网关管理对象,见 ./xiaomi.py中定义),XiaomiDevice(小米设备定义)。
  • setup_platform(hass, config, add_device, discovery_info),设备组件安装函数
    Image [10].png
    创建对象,并 append 到 devices 列表中,然后调用 add_devices(devices),注册这些设备到 hass 中。
  • 实现 XiaomiGenericSwitch 类
    XiaomiGenericSwitch类继承于两个父类:XiaomiDevice(小米设备消息处理),SwitchDevice(开关设备模板定义)。
    其详细定义如下:
    Image [11].png
    主要定义了:icon,is_on 属性与 turn_on(), turn_off() 方法,与消息回调函数 parse_data()。


总类图:
    img_20170730_233512.jpg
    在 XiaomiGenericSwitch 继承 XiaomiDevice 与 SwitchDevice 这部分,与我们的 IoT-DAL 设计中有异曲同工之处。
    虽然多继承被唾弃,但在这里,我们都选择了多继承的方式,使得设备具有标准设备的定义,又有具体设备的实现。


总结:
HASS 的设备并不是动态加载的,而是在启动的时候,通过读取网关内部的设备列表来创建的。HASS本地本身没有保存有哪些设备可用。

评分

参与人数 2金钱 +10 收起 理由
yoyosuka + 5 标准的羡慕,嫉妒,恨。
lidicn + 5 很给力!真正的程序员

查看全部评分

造:超智能家居生活!
回复

使用道具 举报

8

主题

690

帖子

4556

积分

论坛元老

Rank: 8Rank: 8

积分
4556
金钱
3861
HASS币
0
QQ
发表于 2017-7-31 09:19:57 | 显示全部楼层
前排支持
回复

使用道具 举报

30

主题

997

帖子

4151

积分

论坛元老

Rank: 8Rank: 8

积分
4151
金钱
3149
HASS币
0

活跃会员

发表于 2017-7-31 10:39:19 | 显示全部楼层
谢谢分享!!!
回复

使用道具 举报

1

主题

105

帖子

416

积分

中级会员

Rank: 3Rank: 3

积分
416
金钱
311
HASS币
0
发表于 2017-8-1 05:54:33 | 显示全部楼层
高手,支持
回复

使用道具 举报

7

主题

48

帖子

390

积分

论坛技术达人

积分
390
金钱
342
HASS币
0
QQ
 楼主| 发表于 2017-8-1 07:22:21 | 显示全部楼层

我仅仅是学习了大神的代码。
回复

使用道具 举报

1

主题

9

帖子

233

积分

中级会员

Rank: 3Rank: 3

积分
233
金钱
224
HASS币
0
发表于 2017-8-2 01:30:38 | 显示全部楼层
学习了,感谢~
回复

使用道具 举报

2

主题

284

帖子

2279

积分

金牌会员

Rank: 6Rank: 6

积分
2279
金钱
1994
HASS币
0
发表于 2017-8-4 10:32:47 | 显示全部楼层
学习了,谢谢分享
回复

使用道具 举报

6

主题

261

帖子

3614

积分

论坛元老

Rank: 8Rank: 8

积分
3614
金钱
3353
HASS币
0
发表于 2017-8-5 00:15:32 来自手机 | 显示全部楼层
学习学习,谢谢分享
回复

使用道具 举报

9

主题

382

帖子

3702

积分

论坛元老

Rank: 8Rank: 8

积分
3702
金钱
3320
HASS币
0
发表于 2017-8-10 15:29:05 | 显示全部楼层
谢谢分享!!
回复

使用道具 举报

9

主题

382

帖子

3702

积分

论坛元老

Rank: 8Rank: 8

积分
3702
金钱
3320
HASS币
0
发表于 2017-8-21 11:25:18 | 显示全部楼层
学习了!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-25 01:59 , Processed in 0.203432 second(s), 37 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表