前言
环境准备
- 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进入方法:
- 如果是Pycharm新版(2024.2以上 可直接在服务 终端里进入,如果是以下 请进入docker shel后,使用
sudo passwd root
来设置root账户,随后使用su root切换即可) - 如果是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平台
- 前往 Home Assistant core 官方仓库地址 点击 “fork”.
-
填入你的仓库地址后点击打开即可
- 您的浏览器会提示您是否要使用 Visual Studio Code 打开链接,请单击“打开链接”。
- 当 Visual Studio Code 询问您是否要安装远程扩展时,单击“安装”。
- 然后将构建 Dev Container 映像(这可能需要几分钟),之后您的开发环境将准备就绪。
- 您可以通过以下步骤验证您的开发容器是否设置正确:
- 在 Visual Studio Code 中打开命令面板 –
Shift
+Command
+P
(Mac) /Ctrl
+Shift
+P
(Windows/Linux)。 - 选择
Tasks: Run Task
->Run Home Assistant Core
- 终端应打开并开始输出活动。检查错误并等待输出停止/减慢。
- 通过网络浏览器导航至
http://localhost:8123
,您应该会看到 Home Assistant 设置屏幕。
- 在 Visual Studio Code 中打开命令面板 –
将来,如果您想回到您的开发环境:打开 Visual Studio Code,点击侧边栏中的“远程资源管理器”按钮,选择侧边栏顶部的“容器”。
Pycharm平台
前往 Home Assistant core 官方仓库地址 点击 “fork”.
Pycharm打开后,点击 文件->远程开发->创建 Dev Container,从VCS项目->git仓库填写你克隆后的仓库地址->检测 devcontainerjson 文件(自动)->构建容器并继续
以后再次打开可通过 文件->远程开发->连接->Dev Container 找到自己的项目打开即可
进入root shell可在本机的Pycharm底部工具栏->服务->终端 不要关闭本地Pycharm 否则会终止容器
Mac/Linux 不用容器开发(强烈推荐)
Mac OS
- 安装Homebrew,然后使用它安装依赖项:
brew install python3 autoconf ffmpeg cmake make
cryptography
如果在运行以下脚本时遇到构建问题script/setup
,请查看加密文档中的 安装说明。 - 访问 Home Assistant Core 存储库 并单击Fork。分叉后,使用以下命令设置源的本地副本:
git clone 你的仓库地址 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 - 这将创建一个虚拟环境并安装所有必需的要求。您现在已设置完毕!(访问 http://localhost:8123/ 即可)注意需要等待5-10分钟,否则你即便进入了一会出错,以后每次启动仅需几秒
- 启动命令(请进入到core目录再执行,Home Assistant 配置存储在
config
您的存储库的目录中):./.venv/bin/python -m homeassistant
- 如果需要执行config目录,可以(你需要先自行创建文件夹):
— config 自定义config目录./.venv/bin/python -m homeassistant
SIGKILL
如果在macOS上运行此命令时遇到崩溃 ( ) ,则可能是由于缺少蓝牙权限。您可以通过为终端应用添加此权限来修复此问题(系统偏好设置 -> 安全和隐私 -> 蓝牙)。- 如果是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的除了第一条
创建组件
可先参考以下文档,如看不懂,再根据本文档进行或共同查看以学习开发
- 薛定谔の艾瑞 的博客
- 官方文档 这个只教了安装Vscode+Docker的组件开发环境,其余只是一些文档,没有教程
创建组件
请在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可分为三步(不一定这个顺序和次数,按照实际情况来)
- 账号密码等配置输入
- 选择房间
- 选择或排除你的设备
如果需要调试日志,使用 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:家庭名称}),选择房间后读取所有此家庭此用户的设备到类成员变量,因为要第三步的选择设备
此页面仍在编辑中…
最近一次修改日期:
微信扫描下方的二维码阅读本文