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

标题: ESPHome 1.18.0版本引入了一个非常方便、非常科学的新特性! [打印本页]

作者: XCray    时间: 2021-6-15 22:53
标题: ESPHome 1.18.0版本引入了一个非常方便、非常科学的新特性!
本帖最后由 XCray 于 2021-6-15 22:56 编辑

前段时间折腾 《esp32自制蓝牙网关,直接接收解密米家蓝牙门锁发出的消息》 的时候,由于水平知识所限,用了一个很笨拙的办法,就是把代码拷贝到 esphome 容器里,每次修改代码都要重新拷贝一遍然后编译测试。。。。。。
如果重启 esphome 容器,自己拷贝进去的内容就会自动消失,当时也觉得这不是一个正儿八经的好办法。

现在静下心来,翻了翻官方文档,发现有一个非常好、非常方便、非常科学的新特性(也许是我火星了?)—— External Components。

利用这个特性,自己或者其他网友开发的非官方组件也可以更加方便的使用了。

具体来说,就是:

1. 在 config 目录中新建一个子目录,比如 mine ,把非官方组件代码拷贝到这个目录里面。
  比如我用的是hassio addon的esphome,配置目录是 config/esphome,那么这个新的目录就是config/esphome/mine

2. 在用到这些非官方组件代码的节点对应的 yaml 文件里,增加这么两行:
  1. external_components:
  2.   - source: mine
复制代码
其他配置内容不变。

3. 照常编译、上传即可。

再也不用费劲巴拉的到容器里面折腾了!话说我之前怎么辣么呆呢???

~~~~~~~~~~~~~~~~~~
官文介绍:
You can easily import community or personal components using the external components feature. Bundled components can be overridden using this feature.
.....
You can specify a local path containing external components. This is most useful when developing a component or if you want to manually control the origin of the files.

利用这个特性,你可以很轻松地导入社区或者个人开发的组件,如有重名,官方组件将被无视。

你可以指定本地包含外部组件代码的路径,这在开发组件时最有用啦啦啦啦啦!

除了本地,还支持 git !也许git更有用吧?

官文链接


作者: hunterfox    时间: 2021-6-15 23:31
虽然不是很明白意思,但esphome 的通用文件想共享引用一直想学,可以减少代码编译,也可以减少一处修改处处修改的问题,目前用的packages,但好像不能设置到下一级目录。大佬的方法貌似可以
作者: XCray    时间: 2021-6-16 08:45
hunterfox 发表于 2021-6-15 23:31
虽然不是很明白意思,但esphome 的通用文件想共享引用一直想学,可以减少代码编译,也可以减少一处修改处处 ...

你说的我是真没明白。。。

可以减少代码编译?——不知道啥意思

esphome也支持packages吗?
作者: hunterfox    时间: 2021-6-16 08:51
XCray 发表于 2021-6-16 08:45
你说的我是真没明白。。。

可以减少代码编译?——不知道啥意思

我说的不准确,不是减少代码编译。编译肯定全文件编译的。 主要是代码模块化管理


[attach]30129[/attach]


作者: XCray    时间: 2021-6-16 09:57
hunterfox 发表于 2021-6-16 08:51
我说的不准确,不是减少代码编译。编译肯定全文件编译的。 主要是代码模块化管理

学习了!

可能是因为我玩的节点太少(只有3~4个)、时间太短,从来没想过使用packages简化配置文件编辑。。。
作者: evantalk    时间: 2021-6-16 10:53
我是win10上装了个esphome,没有你这个烦恼
作者: hunterfox    时间: 2021-6-16 11:07
我接点配的比较多,通用部分全部用packages 了,代码简洁了不少,主要好批量修改
作者: XCray    时间: 2021-6-16 11:23
hunterfox 发表于 2021-6-16 11:07
我接点配的比较多,通用部分全部用packages 了,代码简洁了不少,主要好批量修改 ...

嗯,清楚了。你说的“代码”实际上是配置文件,yaml;我说的“代码”是c++的功能实现组件。二者有关系但不是一个概念。

配置文件通过packages实现高效管理,确实是一个好办法,尤其是节点多了。
在官方组件之外开发的c++功能代码,通过external components导入,也是便于管理和使用的一个很好的特性。
作者: hunterfox    时间: 2021-6-16 11:36
嗯嗯,是配置,各种组件配置引用,c++组件高端玩法,只能前人栽树 后人乘凉了。一个c++的uart组件搞的我半死不活的
作者: jack9603301    时间: 2021-6-18 15:15
米家设备,好像可以用Xiaomi MIoT集成直接从云端拿到,或者,可以试试看miio方案,前提是,有蓝牙网关
作者: XCray    时间: 2021-6-18 15:18
jack9603301 发表于 2021-6-18 15:15
米家设备,好像可以用Xiaomi MIoT集成直接从云端拿到,或者,可以试试看miio方案,前提是,有蓝牙网关 ...

没看明白,你想说啥?
作者: jack9603301    时间: 2021-6-18 17:17
XCray 发表于 2021-6-18 15:18
没看明白,你想说啥?

我的意思是,通常情况下可能不需要使用ESPHOME,比如我的wifi的创米红外,就是使用Xiaomi Miio接入的
作者: XCray    时间: 2021-6-18 17:37
jack9603301 发表于 2021-6-18 17:17
我的意思是,通常情况下可能不需要使用ESPHOME,比如我的wifi的创米红外,就是使用Xiaomi Miio接入的 ...

很简单啊,不需要就不用呗,没说一定要用啊。。。
作者: jack9603301    时间: 2021-6-18 17:58
XCray 发表于 2021-6-18 17:37
很简单啊,不需要就不用呗,没说一定要用啊。。。

好吧,我只是补充一下
作者: bainiu    时间: 2021-6-21 08:25
evantalk 发表于 2021-6-16 10:53
我是win10上装了个esphome,没有你这个烦恼

能出个教程么,谢谢,不想在docker版上搞,怕搞坏软路由,难得恢复。油管上介绍最好安在linux上,我感觉如果能在win10上折腾,一顿乱刷肯定爽,就是不会。
作者: evantalk    时间: 2021-6-21 09:53
本帖最后由 evantalk 于 2021-6-21 10:10 编辑
bainiu 发表于 2021-6-21 08:25
能出个教程么,谢谢,不想在docker版上搞,怕搞坏软路由,难得恢复。油管上介绍最好安在linux上,我感觉 ...

windows上装好python3,然后一条命令就可以了
  1. pip3 install esphome
复制代码


参考官方文档:https://esphome.io/guides/gettin ... e.html#installation
windows安装有个新手不友好的地方时,没有图形化界面,只能用命令行
ESPHome features a dashboard that you can use to easily manage your nodes from a nice web interface. It was primarily designed for the Home Assistant add-on, but also works with a simple command on *nix machines (sorry, no windows).




作者: XCray    时间: 2021-6-21 11:23
evantalk 发表于 2021-6-21 09:53
windows上装好python3,然后一条命令就可以了

我个人不赞同在windows上搞这些东西,也认为这类软件大部分都不是针对windows弄的。

还不如弄个虚拟机、装个debian之类的呢

esphome也不需要持续运行,在需要编译时打开就可以了
作者: 刻刻崖    时间: 2022-9-17 12:15
2. 在用到这些非官方组件代码的节点对应的 yaml 文件里,增加这么两行: external_components:   - source: mine 其他配置内容不变。
作者: 刻刻崖    时间: 2022-9-17 12:16
2. 在用到这些非官方组件代码的节点对应的 yaml 文件里,增加这么两行: external_components:   - source: mine 其他配置内容不变。   这是直接替换使用外部组件吗?对应应该替换哪些原有文件?
作者: 刻刻崖    时间: 2022-9-17 21:21
本帖最后由 刻刻崖 于 2022-9-17 21:23 编辑

楼主您好,想修改mhz19.cpp文件,按照下面方式操作,不对,怎么回事?1、test.yaml中添加:
esphome:
  name: test
  platform: ESP8266
  board: esp01_1m
external_components:
  source:
    type: local
    path: mine
# Enable logging
logger:
  baud_rate: 0
# Enable Home Assistant API

2、路径添加:
[attach]41324[/attach][attach]41326[/attach]
作者: XCray    时间: 2022-9-18 06:46
本帖最后由 XCray 于 2022-9-18 06:51 编辑

mine下面再建一级子目录,名称就是你的组件名称,比如aaa;
aaa下面存放你的代码,除了cpp、h之外,更关键的是python脚本,包括__init__.py(可以是0字节)和sensor.py(或者binary_sensor.py,看你的功能需要)。

官方文档你没好好看呀!
https://esphome.io/components/ex ... of-local-components
这一段说的很清楚了,稍微有点基础应该就能理解
然后yaml里你要使用这个组件才行,并不是只配置一个目录就完事儿了,比如:
sensor:
  - platform: aaa

     xxx: xxx

程序看到这个platform后的aaa就会到external_components指定的路径下寻找aaa名称的目录,然后加载其中的python脚本、再根据python脚本加载剩余的代码。

另外,任何问题,出错提示也值得仔细查看。

作者: XCray    时间: 2022-9-18 06:57
evantalk 发表于 2021-6-16 10:53
我是win10上装了个esphome,没有你这个烦恼

这个主题说的是自定义组件,那么,在windows上装esphome,自定义组件应该怎么弄呢?更省事儿?
作者: evantalk    时间: 2022-9-19 12:38
XCray 发表于 2022-9-18 06:57
这个主题说的是自定义组件,那么,在windows上装esphome,自定义组件应该怎么弄呢?更省事儿? ...

把.h文件放在yaml文件同一个目录下编译就行了
作者: XCray    时间: 2022-9-19 14:03
evantalk 发表于 2022-9-19 12:38
把.h文件放在yaml文件同一个目录下编译就行了

之前用的那个mqttl就是yaml同目录下放一个.h文件,docker安装esphome,确实很省事儿。不过好像不是所有自定义组件都能这么弄吧?
作者: 刻刻崖    时间: 2022-9-20 23:31
XCray 发表于 2022-9-18 06:46
mine下面再建一级子目录,名称就是你的组件名称,比如aaa;
aaa下面存放你的代码,除了cpp、h之外,更关键 ...

sensor.py文件有语法介绍吗?看各个传感器写得不一样,看不明白哪些是必须的。
作者: 刻刻崖    时间: 2022-9-21 00:32
XCray 发表于 2022-9-18 06:46
mine下面再建一级子目录,名称就是你的组件名称,比如aaa;
aaa下面存放你的代码,除了cpp、h之外,更关键 ...

我试了一下还是报错,咋回事?
.yaml如下:
esphome:
  name: test
  platform: ESP8266
  board: esp01_1m
external_components:
  source:
    type: local
    path: mine
# Enable logging
logger:
  baud_rate: 0
# Enable Home Assistant API
api:

ota:
  password: "3bb0962c1dd6108ad9d25f3d2caeb265"

wifi:
  ssid: "2108_AC66"
  password: "[email protected]"
  manual_ip:
    static_ip: 10.5.0.200    ##固定此设备IP地址为192.168.123.156;
    gateway: 10.5.0.1        ##路由器、网关地址;
    subnet: 255.255.255.0         ##子网掩码;

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Test Fallback Hotspot"
    password: "88888888"

  #captive_portal:

uart:
  rx_pin: GPIO3
  tx_pin: GPIO1
  baud_rate: 9600

sensor:
  - platform: mhz19
    co2:
      name: "MH-Z19 CO2 Value"
    temperature:
      name: "MH-Z19 Temperature"
    update_interval: 10s
    automatic_baseline_calibration: false

captive_portal:


编译报错:
INFO Reading configuration /config/esphome/test.yaml...
ERROR Unable to load component mhz19.sensor:
Traceback (most recent call last):
  File "/opt/esphome/esphome/loader.py", line 163, in _lookup_module
    module = importlib.import_module(f"esphome.components.{domain}")
  File "/usr/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 786, in exec_module
  File "<frozen importlib._bootstrap_external>", line 923, in get_code
  File "<frozen importlib._bootstrap_external>", line 853, in source_to_code
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "/config/esphome/mine/mhz19/__init__.py", line 1
    0 lines (0 sloc)  0 Bytes
      ^
SyntaxError: invalid syntax
Failed config

sensor.mhz19: [source /config/esphome/test.yaml:39]
  
  Platform not found: 'sensor.mhz19'.
  platform: mhz19
  co2:
    name: MH-Z19 CO2 Value
  temperature:
    name: MH-Z19 Temperature
  update_interval: 10s
  automatic_baseline_calibration: False
路径:

[attach]41325[/attach]

作者: XCray    时间: 2022-9-21 06:39
刻刻崖 发表于 2022-9-21 00:32
我试了一下还是报错,咋回事?
.yaml如下:
esphome:

代码级别的东西我没能力帮你,自己慢慢玩吧。

多看看esphome本身自带的组件代码,有能力自己写,没能力就找最接近的试着改。
作者: 刻刻崖    时间: 2022-9-21 13:13
XCray 发表于 2022-9-21 06:39
代码级别的东西我没能力帮你,自己慢慢玩吧。

多看看esphome本身自带的组件代码,有能力自己写,没能力 ...

我是拿的官网gihub的源码,啥也没改,但是报错了,能给我一个你成功的参考一下吗?十分感谢,我估计还是哪里配置的不对。
作者: XCray    时间: 2022-9-21 14:19
刻刻崖 发表于 2022-9-21 13:13
我是拿的官网gihub的源码,啥也没改,但是报错了,能给我一个你成功的参考一下吗?十分感谢,我估计还是 ...

你找找我之前的帖子吧,另外官方除了每个组件外还有示例代码




欢迎光临 『瀚思彼岸』» 智能家居技术论坛 (https://bbs.hassbian.com/) Powered by Discuz! X3.5