HomeAssistant 编写 Python 程序,实现自定义事件

HomeAssistant 编写 Python 程序,实现自定义事件

官方接口文档:https://developers.home-assistant.io/docs/api/rest

设想一种场景,当用户从家里离开,或者回到家里的时候,自动记录并提示用户回家或离家
本身 HomeAssistant 支持编写事件,但是再去学习 HomeAssistant 的语法规则,显然是不想的
所以这里使用 Python 直接编写程序,接入远程 api ,当事件发生时,执行自定义措施

下面的教程文章假定已经成功安装并运行了 HomeAssistant

获取秘钥

使用账户密码登录 HomeAssistant 后,点击左下角用户
将网页拉到最下面有一个选项 长期访问令牌 , 点击创建令牌

输入名称后即会出现一串字符串。请注意保管这串字符串

Python 请求 HomeAssistant 接口

注意,所有的请求中,都要携带两个请求头:

    headers = {
        "Authorization": "Bearer {}".format(api_key),
        "Content-Type": "application/json"
    }

其中 AuthorizationBearer api_key 这种形式

注意 Bearerapi_key 中间有空格,至于 api_key 就是第一步中获取的访问秘钥,也叫 长期访问令牌

获取HomeAssistant 配置信息

接口为: /api/config ,完整的路径是 http://xxxxx/api/config , 如果 HomeAssistant 安装在本机上,那么就是使用:http://127.0.0.1:8123/api/config 接口

请求方式为: GET

注意添加两个请求头:

    headers = {
        "Authorization": "Bearer {}".format(api_key),
        "Content-Type": "application/json"
    }

python 代码示例:

需要定义自己的 api_keyapi_url

def _build_headers(hmap={}):
    headers = {
        "Authorization": "Bearer {}".format(api_key),
        "Content-Type": "application/json"
    }
    for k, v in hmap:
        headers[k] = v
    return headers

def _get_config():
    """
    首先获取一次运行配置,检测服务器是否正在运行
    """
    res = requests.get("http://127.0.0.1:8123/api/config", headers = _build_headers())
    if res.status_code != 200 :
        print("get config faild")
        return False
    jres = json.loads(res.text)
    print("res:" + str(jres))
    return True

获取所有传感器状态

接口: /api/states
方法: GET

需要上文中提到的请求头

获取到的数据同样是 json 格式,这里回返回所有传感器状态数据,非常多,建议通过 id 获取单个传感器状态

获取单个传感器状态

接口: /api/states/<传感器id>
方法: GET

需要上文中提到的请求头

返回数据为 json

其中传感器id可以在 HomeAssistant 的管理员账户中查看到
如果不是管理员账户,则 获取所有传感器状态 会返回一个 Json Array 数据,每一个 item 中的 entity_id 即传感器id
想要单独获取某个传感器状态,使用这个 id 即可,以下是我检测手机是否在线的传感器id 数据示例:

{
	"attributes": {
		"device_class": "connectivity",
		"friendly_name": "xiaomi10"
	},
	"context": {
		"id": "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
		"parent_id": null,
		"user_id": null
	},
	"entity_id": "binary_sensor.xiaomi10",
	"last_changed": "2020-09-03T00:15:41.075866+00:00",
	"last_updated": "2020-09-03T00:15:41.075866+00:00",
	"state": "off"
}

其中 state 表示处于关闭状态,如果 state 为 on 表示开启


既然能获取传感器状态了,那么轮询该接口,根据状态做判断即可实现自定义事件了
例如我所实现的场景是根据传感器得知用户回家或者离家状态,随后给自己手机发送通知
也可以用 Pushbear 给微信发条信息

如果需要Python控制开关,需要阅读官方HomeAssistant 官方文档,这份文档是会被更新的(最新的官方文档和某些镜像站的文档内容已经不同了)
只是文档是英文的,但也能从官方的伪代码中得知用途和请求方式

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://zwc365.com/2020/09/04/homeassistant-python-api

Buy me a cup of coffee ☕.