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

 找回密码
 立即注册
查看: 2022|回复: 17

[技术探讨] [讨论] 如何在HA里编写重复性高且容易维护的配置代码?

[复制链接]

29

主题

922

帖子

4166

积分

论坛元老

Rank: 8Rank: 8

积分
4166
金钱
3234
HASS币
70
发表于 2022-8-13 00:22:43 | 显示全部楼层 |阅读模式
本帖最后由 relliky 于 2023-1-11 21:09 编辑

现阶段自动化的配置主要的代码都是yaml,但有很多重复代码,有一些逻辑给一个房间改了,就得给其他房间也再改一遍。毕竟不是所有的代码都可以放到可以重复利用的脚本script里面。这个时候,蓝图blueprint的优势就显现了出来。如果把蓝图比作面对对象语言里的类,而用蓝图代入参数后生成的自动化是一个实例的话,蓝图的局限性就在于这个类最大就只能是一条自动化。而HA自带的模板jinja连个自动化都模板不了,只能支持模板一个entity的代码。

因为家里有三个卧室,我更想把这个类扩大成一个房间的类,然后给它放入每个房间具体的参数,生成每个房间的实例,这个实例就是这个房间的package,还是以自动化为主,包括其他的部分像groups/scripts/template之类的也可以。举个例子,我的其中一个主卧厕所的yaml文件长这样:https://github.com/relliky/Tais_Home_Assistant_Config/blob/8caf667533f6337fe7f5159eb9015336cd86f5c6/packages/rooms/master_toilet.yaml

我设想的文件结构会是类似于这样的:
render_room_package.py
template/base_bedroom.yaml.templ
room_config/master_room.conf
room_config/guest_room.conf
room_config/en_suite_room.conf
auto_generated_packages/master_room.yaml
auto_generated_packages/guest_room.yaml
auto_generated_packages/en_suite_room.yaml


template里面包含每种房间的模板(类),room_config里面包含每个房间的参数,auto_generated_packages的就是每个房间的package yaml文件(实例化)。只有这些yaml文件会被HA读取,HA不读取templ和conf文件。现在就只想到了这里,大家有没有更好的方法去维护相似的代码呢?我知道pyscript不能实例化package,也只能实例化脚本和自动化。不知道node-red,appdaemon或者其他的工具可不可以。
-------------------------------------------------------EDIT: 20/08/22------------------------------------------------------------------------------------------------
受各位大神启发,用Python加PyYaml搞定了。用python写的模板然后用PyYaml输出。

至于如何迁移现有的yaml文件,大致就是先用PyYaml把现有的yaml读进python,打印出来,弄成python描述directory的python语言,修改一下把里面的可变量加进去变成模板,最后再生成出各个房间的yaml。

-------------------------------------------------------EDIT: 11/01/23------------------------------------------------------------------------------------------------

现在基本结构已经完成

render_room_package.py
template/base_bedroom.yaml.templ
room_config/master_room.conf
room_config/guest_room.conf
room_config/en_suite_room.conf
被合并成一个python文件,用面对对象的思路代替了上面的conf文件,给每个房间直接生成了一个新的类
https://github.com/relliky/Tais_ ... /gen_config_yaml.py

然后生成了13个自动化配置文件
https://github.com/relliky/Tais_ ... _generated_packages
和1个仪表盘配置文件
https://github.com/relliky/Tais_ ... c76c9fc015/lovelace

我家全屋智能的HA设置 https://github.com/relliky/Tais_Home_Assistant_Config
回复

使用道具 举报

3

主题

222

帖子

3027

积分

元老级技术达人

积分
3027
金钱
2800
HASS币
10
发表于 2022-8-13 12:49:39 | 显示全部楼层
appdaemon是肯定可以 就是写py。。。
回复

使用道具 举报

29

主题

922

帖子

4166

积分

论坛元老

Rank: 8Rank: 8

积分
4166
金钱
3234
HASS币
70
 楼主| 发表于 2022-8-13 18:53:42 | 显示全部楼层
本帖最后由 relliky 于 2022-8-13 19:01 编辑
ryanh7 发表于 2022-8-13 09:54
你是想解决什么蓝图解决不了的问题?

用蓝图的话,得手动给每个房间配置各种蓝图的自动化。我想把手动给蓝图配置这步也变成可以轻易维护的。

举个例子,现在我有一个蓝图b1,需要参数x1,x2,x3. 一个蓝图b2,需要参数x2,x3,一个蓝图b3,需要参数x1,x2. 先阶段用蓝图的话,如果我要改每个房间的x2,那我得把每个自动化调用的x2的地方都改一遍。比如我一个房间三个蓝图,就得在引用3个蓝图的x2的自动化上改。但是如果按照我在一楼里的想法,我只需要修改每个房间的conf文件,那里只有一个x2,只用修改一次,然后用我想的render_room_package.py可以生成这个房间的三个自动化,三个自动化里的x2自动生成且更新了。希望我描述的清楚了,不过如果需要我可以再举例说明。

更进一步,蓝图只支持自动化和脚本,如果我要批量生产template binary sensor之类的,现在除了一个个手动写,也没有其他好的办法。但如果我用一个可以生成yaml的模板语言,就可以解决这个问题。

最后,蓝图最大的局限性就是它只支持一个自动化的蓝图,而我更想要的是一堆自动化,一堆脚本,和一堆传感器等各种东西的一个房间的蓝图。
我家全屋智能的HA设置 https://github.com/relliky/Tais_Home_Assistant_Config
回复

使用道具 举报

29

主题

922

帖子

4166

积分

论坛元老

Rank: 8Rank: 8

积分
4166
金钱
3234
HASS币
70
 楼主| 发表于 2022-8-13 19:04:52 | 显示全部楼层
本帖最后由 relliky 于 2022-8-13 19:06 编辑
blindlight 发表于 2022-8-13 12:49
appdaemon是肯定可以 就是写py。。。

确实python是点学习成本,但生命的意义在于折腾嘛

好像看着appdaemon想也是主要给脚本和自动化用的,可以用appdaemon来创造sensor吗?
我家全屋智能的HA设置 https://github.com/relliky/Tais_Home_Assistant_Config
回复

使用道具 举报

17

主题

762

帖子

5284

积分

论坛元老

Rank: 8Rank: 8

积分
5284
金钱
4517
HASS币
0
发表于 2022-8-13 19:12:47 | 显示全部楼层
重复的不多,一般手改了。
如果真需要比较多的,做个外部工具读yaml简单替换一下生成其他房间的就好了。
回复

使用道具 举报

0

主题

22

帖子

123

积分

注册会员

Rank: 2

积分
123
金钱
101
HASS币
0
发表于 2022-8-14 00:39:17 | 显示全部楼层
是个好思路, 我现在是用代码生成yaml再复制进去
回复

使用道具 举报

3

主题

222

帖子

3027

积分

元老级技术达人

积分
3027
金钱
2800
HASS币
10
发表于 2022-8-14 01:03:58 | 显示全部楼层
relliky 发表于 2022-8-13 19:04
确实python是点学习成本,但生命的意义在于折腾嘛

好像看着appdaemon想也是主要给脚本和自动化用的 ...

能的 创什么都可以 你新建个根本没有的integrate都没问题
回复

使用道具 举报

14

主题

191

帖子

888

积分

高级会员

Rank: 4

积分
888
金钱
697
HASS币
0
发表于 2022-8-14 02:33:10 来自手机 | 显示全部楼层
pyscript不行吗?
回复

使用道具 举报

29

主题

922

帖子

4166

积分

论坛元老

Rank: 8Rank: 8

积分
4166
金钱
3234
HASS币
70
 楼主| 发表于 2022-8-14 05:37:33 | 显示全部楼层
coderwj 发表于 2022-8-14 00:39
是个好思路, 我现在是用代码生成yaml再复制进去

具体怎么弄的能说说吗?
我家全屋智能的HA设置 https://github.com/relliky/Tais_Home_Assistant_Config
回复

使用道具 举报

29

主题

922

帖子

4166

积分

论坛元老

Rank: 8Rank: 8

积分
4166
金钱
3234
HASS币
70
 楼主| 发表于 2022-8-14 05:38:42 | 显示全部楼层
ryanh7 发表于 2022-8-13 20:47
抽象能力对普通用户来说基本是个不可能的事,而对于会编程的人来说有一百种方法。 ...

哈哈哈,一针见血。我就想看看有没有人前人栽树,可以少走点弯路~
我家全屋智能的HA设置 https://github.com/relliky/Tais_Home_Assistant_Config
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-29 15:37 , Processed in 0.083825 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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