埋没技术 / 教程 · 2024年11月19日 0

Home Assistant 组件开发教程

前言

环境准备

  • Docker(windows可选择 WSL2 ,很不推荐)
  • Pycharm / VSCode
  • Git
  • Git仓库(github / gitee 等)
  • Python3.12(无需手动安装)
  • Windows(无论是否使用WSL2,都必须遵守 安装环境->安装WSL2,安装1,2,3条) / Linux / MacOs均可
  • 本文HomeAssistant环境为2024.11.2(你们可直接最新版本,不必理会,如果要一样就指定一下版本)

本文介绍

    需要Python精通(如果不想复杂调试,需要设计单元测试)+掌握linux+熟悉你的开发工具+熟悉docker

Windows平台+Docker+Pycharm+Git+Github进行教程,其余平台几乎一样,因为HomeAssistant Core不支持运行在windows 只能在linux平台运行,所以步骤大同小异

    将不再介绍如何安装以上环境 均是下一步 本文只教HomeAssistant开发环境准备,请安装好环境准备里的所有,再次观看本文

    确保你拥有魔法环境,请在适当时候开启魔法

    请把Git的proxy删除,容器会复制你的Git配置(.gitconfig 里 删掉 http/https/socket节点)

    wsl2开发 homeassistant的默认config在 /用户主目录/.homeassistant

docker开发 请手动 –config指定 后边会教

安装环境(三选一,根据你的平台)

安装WSL2(仅限windows 10 21H以上)

控制面板->程序->启用或关闭Windows功能

  • 打开Hyper-V
  • 打开虚拟机平台
  • 打开容器
  • 打开适用于Linux的Windows子系统

设置为wsl2/安装ubuntu/设置ubuntu默认

wsl --set-default-version 2
wsl --install
wsl --set-version Ubuntu

进入Ubuntu安装环境

    找到程序 Ubuntu,点击进入shell,默认是root,如果不是,请手动切换,随后安装环境

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install -y python3 python3-dev python3-venv python3-pip bluez libffi-dev libssl-dev libjpeg-dev zlib1g-dev autoconf build-essential libopenjp2-7 libtiff6 libturbojpeg0-dev tzdata ffmpeg liblapack3 liblapack-dev libatlas-base-dev

制作HomeAssistant开发环境

git clone https://github.com/home-assistant/core.git
cd core
python3 -m venv .venv
python3 -m pip install wheel
./.venv/bin/pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
./.venv/bin/pip install -r requirements_all.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
./.venv/bin/pip install -r requirements_test.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
./.venv/bin/pip install -r requirements_test_all.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
./.venv/bin/pip install homeassistant -i https://pypi.tuna.tsinghua.edu.cn/simple/
./.venv/bin/python -m homeassistant

若要指定homeassistant config目录,请加上参数 –config 自定义config目录

至此环境准备完成,请注意,根据网络环境不同,初次启动需要5-10分钟,后边每次启动仅需1-3秒,根据自定义组件多与少决定

VSCode/Pycharm开发

Pycharm打开后,点击文件->远程开发->连接WSL。下次再次打开点击文件->远程开发->连接->WSL即可看到自己的项目

随后在Pycharm进行映射端口8123即可

VSCode打开后,安装此扩展(官方扩展) ,此后左侧图标会出现 <远程资源管理器> ,点击后,找到WSL目标->Ubuntu 即可。下次再打开可在连接后在主页面看到最近的项目以快速进入

至于映射8123端口,这方面vscode不强,请百度wsl映射端口,毕竟我不用vscode进行开发

Docker开发(Windows/Mac/Linux。建议windows)

开发容器创建好+Homeassistant环境准备好后,重启docker发现Homeassistant不启动?请使用root身份进入docker shell,并运行 python -m homeassistant 即可

docker shell root进入方法:

  1. 如果是Pycharm新版(2024.2以上 可直接在服务 终端里进入,如果是以下 请进入docker shel后,使用sudo passwd root 来设置root账户,随后使用su root切换即可)
  2. 如果是vscode 请进入docker shel后,使用sudo passwd root 来设置root账户,随后使用su root切换即可

默认config在/root/.homeassistant 若要指定homeassistant config目录,请加上参数 –config 自定义config目录

!!!请注意,请映射你的HomeAssistant Core到本地目录(你必须到HomeAssistant Core进行开发,不然会很难受,当然你也可以本地开发后再复制到容器,如果你忍受得了没提示的话),否则容器崩溃将造成不可挽回的损失。windows不建议直接在Pycharm的服务里设置映射,会导致容器崩溃;Pycharm开发者也不要映射(因为会重新构建,pycharm远程开发处于beta阶段,容易出问题),会导致无法远程开发

请到 官方Home Assistant Core仓库地址 forks为自己的,用自己的仓库进行操作,因为容器需要你的github账号密码(容器内 你的魔法将会失效 如果你的网络环境原生不支持github,请使用支持GitHub 下载的镜像地址)

python虚拟环境在/home/vscode/.local/ha-venv 但这里的python是替身 指向 /usr/local/bin/python。只不过库用的这里的库,望各位明白。root用户的python环境变量自动指向该地址,从而使用这里的库,容器用户不会,如果是容器用户运行python,请加前缀/home/vscode/.local/ha-venv/bin/python

VSCode平台

  1. 前往 Home Assistant core 官方仓库地址 点击 “fork”.
  2. 填入你的仓库地址后点击打开即可
  3. 您的浏览器会提示您是否要使用 Visual Studio Code 打开链接,请单击“打开链接”。
  4. 当 Visual Studio Code 询问您是否要安装远程扩展时,单击“安装”。
  5. 然后将构建 Dev Container 映像(这可能需要几分钟),之后您的开发环境将准备就绪。
  6. 您可以通过以下步骤验证您的开发容器是否设置正确:
    • 在 Visual Studio Code 中打开命令面板 – ShiftCommandP(Mac) / CtrlShiftP(Windows/Linux)。
    • 选择Tasks: Run Task->Run Home Assistant Core
    • 终端应打开并开始输出活动。检查错误并等待输出停止/减慢。
    • 通过网络浏览器导航至http://localhost:8123,您应该会看到 Home Assistant 设置屏幕。

将来,如果您想回到您的开发环境:打开 Visual Studio Code,点击侧边栏中的“远程资源管理器”按钮,选择侧边栏顶部的“容器”。

Pycharm平台

前往 Home Assistant core 官方仓库地址 点击 “fork”.

Pycharm打开后,点击 文件->远程开发->创建 Dev Container,从VCS项目->git仓库填写你克隆后的仓库地址->检测 devcontainerjson 文件(自动)->构建容器并继续

以后再次打开可通过 文件->远程开发->连接->Dev Container 找到自己的项目打开即可

进入root shell可在本机的Pycharm底部工具栏->服务->终端 不要关闭本地Pycharm 否则会终止容器

Mac/Linux 不用容器开发(强烈推荐)

Mac OS

  1. 安装Homebrew,然后使用它安装依赖项:
    brew install python3 autoconf ffmpeg cmake make

    cryptography如果在运行以下脚本时遇到构建问题script/setup,请查看加密文档中的 安装说明

  2. 访问 Home Assistant Core 存储库 并单击Fork。分叉后,使用以下命令设置源的本地副本:
    git clone 你的仓库地址
    cd core
  3. 创建虚拟环境并安装依赖
    python3 -m venv .venv
    python3 -m pip install wheel
    ./.venv/bin/pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
    ./.venv/bin/pip install -r requirements_all.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
    ./.venv/bin/pip install -r requirements_test.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
    ./.venv/bin/pip install -r requirements_test_all.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
    ./.venv/bin/pip install homeassistant -i https://pypi.tuna.tsinghua.edu.cn/simple/
    ./.venv/bin/python -m homeassistant
  4. 这将创建一个虚拟环境并安装所有必需的要求。您现在已设置完毕!(访问 http://localhost:8123/ 即可)注意需要等待5-10分钟,否则你即便进入了一会出错,以后每次启动仅需几秒
  5. 启动命令(请进入到core目录再执行,Home Assistant 配置存储在config您的存储库的目录中):
    ./.venv/bin/python -m homeassistant
  6. 如果需要执行config目录,可以(你需要先自行创建文件夹):
    ./.venv/bin/python -m homeassistant
    — config 自定义config目录
  7. SIGKILL如果在macOS上运行此命令时遇到崩溃 ( ) ,则可能是由于缺少蓝牙权限。您可以通过为终端应用添加此权限来修复此问题(系统偏好设置 -> 安全和隐私 -> 蓝牙)。
  8. 如果是pycharm ,运行更加简单,右上角点击添加运行配置(编辑配置)->+->找到Python->找到你core的虚拟环境->更改为module->[增加自定义配置文件夹]->确定即可

Ubuntu

参考安装环境->安装wsl2

Fedora

sudo dnf update
sudo dnf install python3-pip python3-devel python3-virtualenv autoconf openssl-devel libxml2-devel libxslt-devel libjpeg-turbo-devel libffi-devel systemd-devel zlib-devel pkgconf-pkg-config libavformat-free-devel libavcodec-free-devel libavdevice-free-devel libavutil-free-devel libswscale-free-devel ffmpeg-free-devel libavfilter-free-devel ffmpeg-free gcc gcc-c++ cmake

之后参考安装环境->Mac/Linux 不用容器开发->Mac OS的除了第一条

Arch

sudo pacman -Sy base-devel python python-pip python-virtualenv autoconf libxml2 libxslt libjpeg-turbo libffi systemd zlib pkgconf ffmpeg gcc cmake

之后参考安装环境->Mac/Linux 不用容器开发->Mac OS的除了第一条

创建组件

可先参考以下文档,如看不懂,再根据本文档进行或共同查看以学习开发

创建组件

请在core根目录下进行创建(我的推荐)

pip install cookiecutter
cookiecutter https://github.com/boralyl/cookiecutter-homeassistant-component
domain [my_component]: github_custom
name [My Component]: Github Custom
docs_url [https://github.com/user/my_component/]: https://github.com/boralyl/github-custom-component-tutorial
owner [@user]: @boralyl
Select config_flow:
1 - yes
2 - no
Choose from 1, 2 [1]: 2
Select iot_class:
1 - Assumed State
2 - Cloud Polling
3 - Cloud Push
4 - Local Polling
5 - Local Push
Choose from 1, 2, 3, 4, 5 [1]: 2

注意:一开始我们跳过了使用配置流(Config Flow)。我们将在教程的后续文章中添加这部分功能。

现在我们忽略根目录文件夹下的文件和测试文件夹。让我们关注 custom_components 和github_custom 文件夹。manifest.json 包含了一些我们这个组件的基础信息,Home Assistant 在加载的时候会用到。const.py 只包含了我们的常量,在这个案例中,我们只有组件的 DOMAIN__init__.py 包含了 async_setup 方法,用于 Home Assistant 加载我们的组件。

此时自定义组件是合法的,如果你放在自己的 Home Assistant config 目录下,Home Assistant 会正常加载,并不会实际创建任何实体(entities)。

实现配置流

用过第三方组件的都知道,比如xiaomi miot,配置流分为在HA可分为三步(不一定这个顺序和次数,按照实际情况来)

  1. 账号密码等配置输入
  2. 选择房间
  3. 选择或排除你的设备

如果需要调试日志,使用 logging即可,我相信善于查看core的虚拟环境模块的开发者已经发现了

配置项第一步(账号密码等配置输入)

在custom_components/const.py里添加

CONF_USERNAME = "username"
CONF_PASSWORD = "password"

在 custom_components/my_name 下,创建config_flow.py,定义你的类(命名规范以ConfigFlow进行结尾,因为要继承ConfigFlow类。Myname为你的组件name,而不是组件domain domain用于让HA识别icon,比如你填baidu 就是百度的图标 name和domain可以不为同名,请严格遵守开发规范。),并创建第一步方法(必须为async_step_user),例如

import voluptuous as vol
import logging
from homeassistant import config_entries
from .const import DOMAIN, CONF_USERNAME, CONF_PASSWORD
class MynameConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
    async def async_step_user(self, user_input=None):
        errors = {}
        if user_input is not None:
            return await self.async_step_home()
        return self.async_show_form(
            step_id="user",
            data_schema=vol.Schema(
                {
                    vol.Required(CONF_USERNAME): str,
                    vol.Required(CONF_PASSWORD): str,
                }
            ),
            description_placeholders={
                "username_hint": "app login username",
                "password_hint": "app login password",
            },
            errors=errors,
        )

恭喜你 成功创建了第一个组件并做出了第一步配置项,你可将你的插件复制到core的config/custom_components下进行尝试,点击设备后添加集成,搜索你的 name ,点击后即可看到你创建的第一步配置项,并让你输入账号和密码,但只是界面,如果需要配置登录,我相信你已经知道了怎么写,用户的输入参数就在user_input里,只需要判断user_input是否为空即可,不为空执行登录。如果需要输出错误信息,将errors[‘base’] = “错误信息” 即可,登录完成后,保存你的cookie信息和所有家庭列表到类成员变量,随后使用 return await self.async_step_home() 进入第二步,理论上 第二步开始,方法名可随意你取名字,不受HA Core进行调用,而是你来调。不管你往后的配置流方法名如何定义,你都必须以async_step_xx进行命名,而后必须对应return里async_show_form()里的step_id。请严格遵守命名规范和开发规范

配置项第二步(选择家庭)

仍旧在config_flow.py里,你定义的类里写,添加:

    async def async_step_home(self, user_input=None):
        # logging.info("选择家庭页面")
        errors = {}
        if user_input is not None:
            return await self.async_step_device()
        return self.async_show_form(
            step_id="home",
            data_schema=vol.Schema(
                {vol.Required("houseId"): vol.In({})}
            ),
            errors=errors,
        )

第一步后就是进入第二步选择家庭,和第一步是一样的,vol.In({})的{}替换为你的所有家庭类成员变量(格式为:{houseId:家庭名称}),选择房间后读取所有此家庭此用户的设备到类成员变量,因为要第三步的选择设备

此页面仍在编辑中…

最近一次修改日期:



微信扫描下方的二维码阅读本文