HomeAssistant自定义组件学习-【三】

HomeAssistant自定义组件学习-【一】 HomeAssistant自定义组件学习-实现中盛科技IO控制器接入HA,控制家里的灯。 阅读详情

#要说的话#

因为自己其他事情,小半年没有更新HomeAssistant自定义组件内容了,这次把一个7合一的空气质量传感器实现了,硬件搭建还是使用的亿佰特的RS485模块+M702(RS485版)传感器,这次有几点更新:

  1. 把亿佰特模块独立出来了;
  2. 把实体数据放到设备里;
  3. 亿佰特模块和传感器代码传到优快云,大家可以下载;

硬件的淘宝链接:

亿佰特模块(NA111):商品详情

传感器模块(M702):商品详情

亿佰特模块有个遗憾的地方,就是没有5V的电源输出,我另外配了一个电源模块给M702供电。

#组件思路#

在亿佰特模块中进行设备的发现,模块的IP、端口配置,并使用json文件把信息保存在系统中;

在传感器模块中选择亿佰特模块中配置的设备,然后两者关联起来,

#具体实现#

亿佰特模块的发现功能在上一篇文章《HomeAssistant自定义组件学习-二》中有说明。本次只是需要把发现的设备模块给其他模块进行调用,这里我采用的是通过json配置文件进行数据配置的传递。json文件的操作方法同样在前几章中有实现,感兴趣的可以翻一下我之前的文章,或者直接下载我上传的资源,下载地址附后面。

设备模块的占用冲突,在json文件里增加used信息,其他模块选择设备时检查used字段,防止占用冲突,实现代码在传感器模块的config_flow.py中。

async def async_step_user(
        self, user_input: dict[str, Any] | None = None
    ) -> ConfigFlowResult:
        """Handle the initial step."""
        errors: dict[str, str] = {}
        ent_data: dict[str, Any] = {}
        if self._device_manager is None:
            self._device_manager = EbyteDeviceManager(self.hass)
        if user_input is not None:
            # 如果有用户输入,则处理输入的信息
            if CONFIG_USER_INPUT_EBYTE_DEVICE in user_input:
                # 保存选择通讯设备,
                mac: str = user_input[CONFIG_USER_INPUT_EBYTE_DEVICE]
                name: str = user_input[CONF_NAME]
                sd: EbyteDeviceInfo = self._device_manager.get_device_by_mac(mac)
                if sd is not None:
                    ent_data[CONF_NAME] = name
                    ent_data[CONF_HOST] = sd.Ip
                    ent_data[CONF_PORT] = sd.Port
                    ent_data[CONF_MAC] = sd.MAC
                    dp: map[str, Any] = {}
                    dp[CONF_HOST] = sd.Ip
                    dp[CONF_MAC] = sd.MAC
                    dp[CONF_NAME] = name
                    dp[CONF_HOST] = sd.Ip
                    ret: ConfigFlowResult = self.async_create_entry(
                        title=f"AirQuality[{sd.Ip}]",
                        description="This is a air quality device!",
                        description_placeholders=dp,
                        options=dp,
                        data=ent_data,
                    )
                    # 标识选择的设备已经使用
                    sd.set_used(True)
                    sd.set_device_name(name)
                    sd.save_config()
                    return ret
                _LOGGER.error(f"EbyteDeviceInfo:{mac} is None")  # noqa: G004
        # 如果没有用户输入,则显示选择列表
        ops = []
        devices: dict[str, EbyteDeviceInfo] = self._device_manager.get_all_devices()
        if len(devices) > 0:
            for d in devices.values():
                # 通讯设备没有使用的才能给用户选择
                if not d.Used:
                    ops.append(SelectOptionDict(value=d.MAC, label="Ebyte:" + d.Ip))  # noqa: PERF401
            if len(ops) > 0:
                schema = vol.Schema(
                    {
                        vol.Required(
                            schema=CONF_NAME,
                            description="Enter Device Name.",
                            default="Air Quality",
                        ): str,
                        vol.Required(CONFIG_USER_INPUT_EBYTE_DEVICE): SelectSelector(
                            SelectSelectorConfig(
                                options=ops,
                                mode=SelectSelectorMode.DROPDOWN,
                            )
                        ),
                    }
                )
            else:
                schema = vol.Schema(
                    {
                        "ERROR:": "No Unused Ebyte RS485 device, please config device in ebyte!"
                    }
                )
        else:
            schema = vol.Schema({"ERROR:": "No Ebyte RS485 device founded!"})
        return self.async_show_form(step_id="user", data_schema=schema, errors=errors)

由于是7合1传感器,不可能每个值 都写一个类,看了一下其他组件的实现方法,采用dict来保存值 ,传感器不同的值,通过key进行区分,所以设备类就成了这样:

"""空气传感器设备类文件."""

# from ..const import _LOGGER
from enum import StrEnum
import logging

from ...ebyte.base.base import BaseLink
from ..const import DOMAIN

_LOGGER = logging.getLogger(DOMAIN)

"""
Description:空气传感器设备操作类,实现与设备的通讯功能。获取设备的
version: 1.0.0.0
Author: Cubar
Date: 2025-06-03 15:19:17
LastEditors: hht
LastEditTime: 2025-06-03 15:19:20
"""


class AirQualityAttribute(StrEnum):
    """空气质量属性."""

    attr_co2 = "attr_co2"
    attr_co = "attr_co"
    attr_tvoc = "attr_tvoc"
    attr_pm2d5 = "attr_pm2d5"
    attr_pm10 = "attr_pm10"
    attr_temperature = "attr_temperature"
    attr_humidity = "attr_humidity"


class AirQualityDevice:
    """空气质量传感器操作类."""

    _link: BaseLink
    # 查询命令
    _cmd_query_status: bytes = b"\x01\x03\x00\x02\x00\x07"
    # 空气质量数据
    _attrs: dict[str, float]
    # 属性单位
    _units: dict[str, str]
    # 属性名称
    _names: dict[str, str]
    # ICON
    _icons: dict[str, str]

    def __init__(self, link: BaseLink):
        """初始化函数."""
        self._link = link
        self._attrs = {
            AirQualityAttribute.attr_co2: 0.0,
            AirQualityAttribute.attr_co: 0.0,
            AirQualityAttribute.attr_tvoc: 0.0,
            AirQualityAttribute.attr_pm2d5: 0.0,
            AirQualityAttribute.attr_pm10: 0.0,
            AirQualityAttribute.attr_temperature: 0.5,
            AirQualityAttribute.attr_humidity: 0.0,
        }
        self._units = {
            AirQualityAttribute.attr_co2: "PPM",
            AirQualityAttribute.attr_co: "ug",
            AirQualityAttribute.attr_tvoc: "ug",
            AirQualityAttribute.attr_pm2d5: "ug",
            AirQualityAttribute.attr_pm10: "ug",
            AirQualityAttribute.attr_temperature: "℃",
            AirQualityAttribute.attr_humidity: "%RH",
        }
        self._names = {}
        self._names[AirQualityAttribute.attr_co2] = "CO2"
        self._names[AirQualityAttribute.attr_co] = "CO"
        self._names[AirQualityAttribute.attr_tvoc] = "TVOC"
        self._names[AirQualityAttribute.attr_pm2d5] = "PM2.5"
        self._names[AirQualityAttribute.attr_pm10] = "PM10"
        self._names[AirQualityAttribute.attr_temperature] = "Temperature"
        self._names[AirQualityAttribute.attr_humidity] = "Humidity"
        self._icons = {
            AirQualityAttribute.attr_co2: "mdi:molecule-co2",
            AirQualityAttribute.attr_co: "mdi:molecule-co",
            AirQualityAttribute.attr_tvoc: "mdi:virus",
            AirQualityAttribute.attr_pm2d5: "mdi:grain",
            AirQualityAttribute.attr_pm10: "mdi:grain",
            AirQualityAttribute.attr_temperature: "mdi:temperature-celsius",
            AirQualityAttribute.attr_humidity: "mdi:virus",
        }

    @property
    def CO2(self) -> float:
        """获取CO2值,单位:PPM."""
        return self._attrs.get(AirQualityAttribute.attr_co2)

    @property
    def CO(self) -> float:
        """获取甲醛值,单位:ug."""
        return self._attrs.get(AirQualityAttribute.attr_co)

    @property
    def TVOC(self) -> float:
        """获取TVOC值,单位:ug."""
        return self._attrs.get(AirQualityAttribute.attr_tvoc)

    @property
    def PM25(self) -> float:
        """获取PM2.5的值,单位:ug."""
        return self._attrs.get(AirQualityAttribute.attr_pm2d5)

    @property
    def PM10(self) -> float:
        """获取PM10值,单位:ug."""
        return self._attrs.get(AirQualityAttribute.attr_pm10)

    @property
    def Temperature(self) -> float:
        """获取温度值,单位:摄氏度."""
        return self._attrs.get(AirQualityAttribute.attr_temperature)

    @property
    def Humidity(self) -> float:
        """获取湿度,单位:%RH."""
        return self._attrs.get(AirQualityAttribute.attr_humidity)

    # CRC16位校验计算程序
    def calculate_crc(self, data: bytes):
        """CRC计算函数."""
        crc = 0xFFFF
        for pos in data:
            crc ^= pos
            for _ in range(8):
                if (crc & 1) != 0:
                    crc >>= 1
                    crc ^= 0xA001
                else:
                    crc >>= 1
        return [(crc & 0xFF), (crc >> 8) & 0xFF]

    def _check_crc(self, data: bytes) -> bool:
        """校验CRC,最后两字节为CRC."""
        crc = self.calculate_crc(data[0 : len(data) - 2])
        if crc[0] == data[len(data) - 2] and crc[1] == data[len(data) - 1]:
            return True
        return False

    def _anally_data(self, data: bytes) -> bool:
        """分析数据."""
        raise NotImplementedError

    def get_unit(self, name: str) -> str:
        """获取指定属性的单位."""
        if name in self._units:
            return self._units.get(name)
        return "Nan"

    def get_value(self, name: str) -> float:
        """获取指定属性的值."""
        if name in self._attrs:
            return self._attrs.get(name)
        return 0

    def get_name(self, name: str) -> str:
        """获取指定属性的名称."""
        if name in self._names:
            return self._names[name]
        return "Unkown"

    def get_icon(self, name: str) -> str:
        """获取ICON."""
        if name in self._icons:
            return self._icons[name]
        return None

    def update_date(self) -> None:
        """更新数据."""
        try:
            ret: bytes = self._link.send_data(self._cmd_query_status)
            if len(ret) > 0:
                if not self._anally_data(ret):
                    _LOGGER.error(f"err:{ret!r}")  # noqa: G004

        except ConnectionRefusedError:
            _LOGGER.error("error: ConnectionRefusedError")

    def close(self) -> None:
        """关闭链路."""
        try:
            self._link.close()
        except ConnectionError as ce:
            _LOGGER.error(f"err:{ce}")  # noqa: G004

在添加实体时,通过传入key以区分。


async def async_setup_entry(
    hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
    """实例化实体方法."""
    # 获取配置中的信息
    ip: str = entry.data[CONF_HOST]
    mac: str = entry.data[CONF_MAC]
    port: int = entry.data[CONF_PORT]
    # 获取链路
    link: EbyteRS485Link = static_ebyte_manager.get_link_by_mac(
        mac, ip, port, 9600, 8, 1
    )
    # 实例化设备操作类
    device: AirQualityDevice_M702 = AirQualityDevice_M702(link)
    # 从系统中获取设备
    deviceEntry: DeviceEntry = hass.data[DOMAIN][DEVICES].get(
        entry.data.get(CONF_DEVICE_ID)
    )
    devs = []
    # 添加数据实体
    devs.append(
        AirQualitySensor(AirQualityAttribute.attr_co2, device, entry, deviceEntry)
    )
    devs.append(
        AirQualitySensor(AirQualityAttribute.attr_co, device, entry, deviceEntry)
    )
    devs.append(
        AirQualitySensor(AirQualityAttribute.attr_tvoc, device, entry, deviceEntry)
    )
    devs.append(
        AirQualitySensor(AirQualityAttribute.attr_pm2d5, device, entry, deviceEntry)
    )
    devs.append(
        AirQualitySensor(AirQualityAttribute.attr_pm10, device, entry, deviceEntry)
    )
    devs.append(
        AirQualitySensor(
            AirQualityAttribute.attr_temperature, device, entry, deviceEntry
        )
    )
    devs.append(
        AirQualitySensor(AirQualityAttribute.attr_humidity, device, entry, deviceEntry)
    )
    # 调用添加回调,把实体添加到系统
    async_add_entities(devs, True)

关键的部分来了,前两章中,我也提到过,把实体放到设备中显示,这次参考了cpuspeed组件,这个组件很简单,其实很简单,Entity中有一个DeviceInfo,只要把这个属性设置成想要附上去的设备,就可以了。具体类代码:


class AirQualitySensor(SensorEntity):
    """空气质量传感器实体类."""

    _name: str
    _device: AirQualityDevice
    _value: float

    def __init__(
        self,
        name: str,
        device: AirQualityDevice,
        entry: ConfigEntry,
        device_entry: DeviceEntry,
    ):
        """初始化方法."""
        self._name = name
        self._device = device
        super().__init__()
        self._attr_native_unit_of_measurement = self._device.get_unit(self._name)
        self._attr_name = self._device.get_name(self._name)
        self._attr_unique_id = f"sensor.{DOMAIN}_{entry.data[CONF_MAC]}_{self._name}"
        self.entity_id = self._attr_unique_id
        # 把实体放到设备中
        self._attr_device_info = DeviceInfo(
            name=device_entry.name,
            identifiers=device_entry.identifiers,
        )
        self._attr_icon = self._device.get_icon(self._name)
        # _LOGGER.critical(f"name: {self._name}: entry_id:{device_entry.id}")

    @property
    def unit_of_measurement(self) -> str:
        """测量单位."""
        return self._device.get_unit(self._name)

    @property
    def native_value(self) -> float:
        """返回传感器值."""
        return self._device.get_value(self._name)

    @property
    def status(self) -> float:
        """返回传感器值."""
        return self._value

    async def async_update(self) -> None:
        """数据更新."""
        self._device.update_date()
        self._value = self._device.get_value(self._name)
        self._attr_native_value = self._value

部分代码是实现图标的,现在使用的是系统默认图标,后续可以研究一下使用自己的图标。

最终显示效果:

模块资源下载地址:

亿佰特:亿佰特组件

空气质量传感器:空气质量传感器

Win11在docker环境安装homeassistant,安装HACS并集成小米官方组件 目标是在docker中安装homeassistant,并且将本地目录做为工作目录,方便管理。然后在ha中安装HACS商店,并集成小米官方组件。 阅读详情

相关推荐

HomeAssistant自定义组件学习-【前言】

国内手把手写一个组件的教程或者日记还是比较少,虽然自己老大不小了,但是折腾的心还没冷,自己选择了HomeAssistant做为智能平台,把基于485、RJ45的设备接入进来,由于是小众的品牌,没人写过这类的接入,就自己边研究边写组件,本文章就是把编写过程记录下来,作为日记,也希望能帮到需要的人。

Cubar的专栏 699

探索智能家居的新可能:Home Assistant 自定义配置库

探索智能家居的新可能:Home Assistant 自定义配置库 1、项目介绍 在智能家庭自动化领域,Home Assistant 是一款强大的开源平台,它允许你轻松集成和控制各种智能家居设备。而这个名为 "Examples of Home Assistant custom config" 的项目,则是针对 Home Assistant 用户的一份宝藏资源,集合了一系列自定义组...

gitblog_00033的博客 921

HomeAssistant自定义组件开发实战-【设备发现与实体注册】

本文详细讲解了HomeAssistant自定义组件开发中设备发现与实体注册的核心流程。通过实战案例,介绍了如何利用UDP广播自动发现局域网设备,构建设备通信类,并最终将设备功能注册为HomeAssistant中的可用实体(如灯光、传感器),实现智能家居设备的无缝接入。

weixin_29291185的博客 539

构建 Home Assistant 自定义组件(第四部分):选项流程

接下来,我们生成初始选项流程并捕获流程 ID。需要注意的是,只有当我们在 Options Flow 类中传递给self.async_create_entry的数据与之前不同时,更新监听器函数才会被调用。这对于你可能编写的几乎每个组件都是必需的,因为我们将使用config_entry的options属性为选项流程表单填充默认值。一般来说,这些配置值是可选的,而配置流程中的值是使组件正常工作所必需的。在创建传感器之前,我们用更新后的存储库扩充初始配置数据,这些存储库可能在配置流程中的初始配置之后被删除或添加。

tre4321的博客 1020

home-assistant-custom-components:用于自定义组件开发的公共存储库

Home-Assistant 自定义组件 我为家庭助理设计的一些自定义组件的第一次迭代。 ( ) 组件概览 pfSense 规则开关组件 编写此组件以打开(启用)或关闭(禁用)pfSense 防火墙规则。 我的一个问题是为什么世界上会有人想要从 HA 做到这一点。 简而言之,我的孩子有时会拒绝打扫房间,并且需要在飞行中而不是在严格的时间表上获得更多动力。 但是,我相信除了凌乱的孩子之外,其他人可能会找到更好的用例。 先决条件 pfSense 2.3.x 或 2.4.x FauxAPI 1.3+ 安装 具有适当权限的 FauxAPI API 密钥和秘密 安装 将目录pfsense_rule复制到您的<config>/custom_components目录。 使用下面的配置进行配置。 重新启动家庭助理。 用法 要在您的安装中使用此组件,请将以下内容添加到您的configura

快速了解GPU分布通信技术:PCIe、NVLink与NVSwitch

PCIe(Peripheral Component Interconnect Express)是一种高速串行计算机扩展总线标准,广泛用于连接计算机的各种硬件设备。PCIe4.0是目前较为先进的版本,提供了高达64GB/s的带宽。InfiniBand是一种用于高性能计算的高速互连技术,通过交换机在节点之间直接创建一个专用的受保护通道。InfiniBand适配器通过PCIe接口连接到CPU,另一端通过InfiniBand网络端口连接到InfiniBand子网。

全世界的博客 7543

探索智能家居的无限可能:Home Assistant 自定义配置详解

探索智能家居的无限可能:Home Assistant 自定义配置详解 在智能家居领域,一个灵活且功能强大的平台是实现家庭自动化梦想的关键。今天,我们将探索 Home Assistant Configuration —— 一个专为Home Assistant发烧友设计的开源宝藏,它为您的智能家居布局增添个性化和深度定制的新维度。 项目介绍 Home Assistant Configuration 是...

gitblog_01158的博客 952

深入解析安卓性能分析工具systrace/atrace的使用技巧与实战场景

本文深入解析了安卓性能分析工具systrace/atrace的核心使用技巧与实战场景。文章澄清了环境搭建的常见误区,详细拆解了命令参数,并通过列表卡顿、启动优化等具体案例,手把手指导开发者利用这些工具精准定位性能瓶颈,提升应用流畅度。

yyy34的博客 240

推荐开源项目:Home Assistant 配置与扩展组件库

推荐开源项目:Home Assistant 配置与扩展组件库 homeassistant-configHome Assistant Configuration项目地址:https://gitcode.com/gh_mirrors/homea/homeassistant-config 在这个智能家居的时代,Home Assistant 已经成为了一款备受赞誉的开源自动化平台,帮助用户轻松管理家中的...

gitblog_00023的博客 596

Jenkins+docker 微服务实现自动化部署安装和部署过程

本文详细介绍了如何使用Docker部署Jenkins自动化服务器。主要内容包括:1)拉取Jenkins官方或BlueOcean镜像;2)创建容器并配置端口映射、数据卷挂载;3)设置防火墙规则;4)配置清华大学镜像加速;5)安装必要插件;6)SSH密钥配置;7)构建触发器设置;8)编写自动化构建脚本。通过Docker部署Jenkins可以简化安装流程,确保环境一致性,并利用容器特性实现快速启动和管理。文章提供了完整的配置步骤和注意事项,帮助用户快速搭建CI/CD环境。

qq_33665793的博客 1687

变邻域搜索(VNS)原理梳理和应用细节-附求解VRPTW问题C++代码

文章目录1、简介-introduction2、VNS的基本机制2.1 变邻域下降方法-Variable Neighborhood Descent2.2基本变邻域搜索方法-Basic Variable Neighborhood Search2.3 终止准则3、VNS的拓展和混杂算法3.1 VNS的拓展3.2 变邻域分解搜索-Variable Neighborhood Decomposition Search3.3 偏变邻域搜索-Skewed VNS3.4 并行变邻域搜索-Parallel VNS4、VNS和其

dragon Fly的博客 6826

Meross HomeAssistant开发者指南:自定义组件架构与扩展开发

Meross HomeAssistant自定义组件是一个强大的工具,它利用Meross IoT库与Homeassistant集成,为开发者提供了丰富的智能家居设备控制功能。本指南将深入剖析组件的架构设计,帮助开发者快速掌握扩展开发的核心要点。 ## 组件架构概览 Meross HomeAssistant自定义组件采用模块化设计,主要由核心模块和设备类型模块组成。核心模块负责设备连接、数据同步和

gitblog_00912的博客 1107

Apple Store 上架过包:iOS审核4.3被拒原因分析与解决修改方案

Apple Store 上架过包:iOS审核4.3被拒原因分析与解决修改方案

专业解决各种上架过包问题,专业团队专业处理 751

HomeAssistant自定义组件开发:从抓包分析到设备控制的完整实现

本文详细介绍了HomeAssistant自定义组件开发的完整流程,从网络抓包分析设备通信协议开始,到构建组件骨架、实现设备通信层,最终集成实体与用户界面。通过一个真实案例,指导开发者如何为未知协议的智能设备创建功能完整的自定义组件,实现设备发现、TCP/UDP通信及状态控制,助力智能家居深度定制。

ttt77的博客 718

【ComfyUI】【Nunchaku】【diffusers报错解决】秋叶整合包安装 Nunchaku 报错的解决方法

最近在折腾 AI 绘图时,我尝试在秋叶的 ComfyUI 整合包中安装 `ComfyUI-nunchaku` 插件(版本 0.3.3),结果启动后直接报错,提示无法从 `accelerate.utils.memory` 中导入 `clear_device_cache`,让我一度怀疑插件是否兼容。查阅了一堆 issue 和源码之后,总算找到了原因和解决方法。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1856

2024年11月架构设计师案例分析真题回顾,附参考答案、解析及所涉知识点(二)

软考高级系统架构设计师考试包含三个科目:信息系统综合知识、案例分析和系统架构设计论文。考试形式为机考。本文主要回顾2024年下半年(2024-11-10)系统架构设计师考试上午第二科案例分析的题目,同时附带参考解答、解析和所涉知识点。

一几文的编程学习笔记。 1661

HomeAssistant自定义组件学习-【二】

前面把中盛科技的控制器组件写完了。稍稍熟悉了一些HA,现在准备写窗帘控制组件,构想的东西会比较多,估计有些难度,过程会比较长,边写边记录吧!#设备和场景环境#使用的是Novo的电机,淘宝链接在【前言】文章中有,轨道应该是佳丽斯的,买电机的时候一起配的。

Cubar的专栏 1674

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Meross HomeAssistant 组件使用教程

Meross HomeAssistant 组件使用教程 1. 项目介绍 Meross HomeAssistant 组件是一个全功能的Homeassistant组件,用于控制Meross设备。该组件基于MerossIot库开发,支持各种Meross设备,如灯泡、开关、车库门开启器和智能阀门/恒温器等,与HomeAssistant完美集成。 2. 项目快速启动 安装方式 有两种方式可以安装此组件:通过...

gitblog_00283的博客 809

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

HomeAssistant - SamsungTV Smart 组件使用教程

HomeAssistant - SamsungTV Smart 是一个自定义组件,用于在 HomeAssistant 中控制 SamsungTV 设备。该项目是基于内置的 `samsungtv` 组件进行的修改,添加了一些额外功能。此插件仅适用于2016年及以后型号的电视(可能是所有Tizen系列)。本项目是对 SamsungTV Tizen 组件的分支,增加了使用 HomeAssistant 用

gitblog_00793的博客 870

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Meross HomeAssistant 组件安装与配置指南

Meross HomeAssistant 组件是一个开源项目,旨在将 Meross 智能家居设备与 HomeAssistant 集成。它允许用户通过 HomeAssistant 控制他们的 Meross 设备,如智能灯泡、开关、车库门开启器和智能阀门/恒温器等。该项目主要是用 Python 语言编写的。 ## 2. 项目使用的关键技术和框架 - **Python**: 该项目使用 Python

gitblog_00233的博客 1199

探索智能家居的新边界:HomeAssistant三星智能电视自定义组件

探索智能家居的新边界:HomeAssistant三星智能电视自定义组件 在智能家居的广阔天地里,您是否渴望更加个性化的控制体验?今天,我们为您带来一款名为ha-samsungtv-custom的开源项目,这是一款专为HomeAssistant设计的三星智能电视自定义组件,它的功能强大且易于使用,将重新定义您的家庭娱乐体验。 1、项目介绍 ha-samsungtv-custom不仅是一个简单的集成工...

gitblog_00037的博客 1074

用ESP8266实现HomeAssistant下自定义语音播报(TTS)

在HomeAssistant下使用NodeRed的TTS组件结合智能音箱比较容易实现语音播报功能,但一般家里不会在每个房间都放一个智能音箱。本文旨在低成本(十几元)实现自定义语音播报。首先通过NodeRed合成需要播报的文本,用微软的Edge TTS将文本转换成MP3格式文件,再使用ESP8266来播放该MP3文件,并通过小型功放驱动喇叭播出。

qq_31400983的博客 4439

HomeAssistant SamsungTV Smart 组件安装与配置指南

HomeAssistant SamsungTV Smart 是一个开源项目,旨在为 HomeAssistant 智能家居平台提供一个用于控制 Samsung TV 的组件。这个组件是基于 HomeAssistant 内置的 `samsungtv` 组件改进而来,增加了使用 HomeAssistant 用户界面进行配置的功能,以及其他一些优化和特性。主要编程语言为 Python。 ## 二、项目使

gitblog_00913的博客 1070

家庭智能 HomeAssistant 四大组件的安装

简介 Home Assistant:是一款基于 Python 的智能家居开源系统,支持接入众多品牌的智能家居设备,可以轻松实现设备的语音控制、自动化等。其实最大的优势是集中化管理,比如小米,飞利浦等等这些智能化的产品你需要在他们的APP上使用并进行控制,而有了hass你就可以摆脱那些APP集中控制他们,并且相互关联实现自动化。还有就是有些模块是没有APP的 但是那些模块可以通过某种通讯协议来实现与...

小单的博客专栏 12万+
上一篇: HomeAssistant自定义组件学习-【二】
下一篇: [一]开源ERP:odoo19二次开发问题-原库存模块问题
Cubar
博客等级 码龄20年 53粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值