impress_sig_mesh_hacs/custom_components/sigmesh_gateway/const.py
impressionyang 6a66c9b474 初始提交:SigMesh Gateway HACS 集成
项目结构:
- custom_components/sigmesh_gateway/ - Home Assistant 集成
  - serial_reader.py - 串口读取器
  - protocol_parser.py - 协议解析器
  - coordinator.py - 数据协调器
  - platforms/ - 传感器/开关/灯光/设备追踪实体

文档:
- PRD.md - 产品需求文档
- README.md - 用户使用指南
- 可行性分析.md - 技术可行性分析
- 参数配置表.md - 配置参数记录
- 调试检查清单.md - 问题排查指南

功能特性:
- 串口通信 (115200 波特率)
- Bluetooth Mesh 协议解析
- 支持 200+ 设备接入
- UI 配置界面
- 多平台实体支持

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 18:20:48 +08:00

132 lines
3.3 KiB
Python

"""SigMesh Gateway 常量定义."""
from enum import IntEnum, StrEnum
from typing import Final
# 集成配置
DOMAIN = "sigmesh_gateway"
DEFAULT_NAME = "SigMesh Gateway"
DEFAULT_BAUDRATE = 115200
DEFAULT_BYTESIZE = 8
DEFAULT_PARITY = "N"
DEFAULT_STOPBITS = 1
DEFAULT_TIMEOUT = 5
# 串口配置常量
CONF_SERIAL_DEVICE = "serial_device"
CONF_BAUDRATE = "baudrate"
class MeshModelId(IntEnum):
"""蓝牙 Mesh 模型 ID."""
# 开关模型
ONOFF_SERVER = 0x1000
ONOFF_CLIENT = 0x1001
# 灯模型
LIGHT_LIGHTNESS_SERVER = 0x1300
LIGHT_HSL_SERVER = 0x1307
LIGHT_COLOR_SERVER = 0x130C
LIGHT_CTL_SERVER = 0x130D
# 传感器模型
SENSOR_SERVER = 0x1100
SENSOR_SETUP_SERVER = 0x1101
# 二进制传感器
SENSOR_ONOFF_SERVER = 0x1104
class MeshOpcode(IntEnum):
"""蓝牙 Mesh Opcode."""
# 开关相关
ONOFF_GET = 0x8201
ONOFF_SET = 0x8202
ONOFF_SET_UNACK = 0x8203
ONOFF_STATUS = 0x8204
# 灯泡相关
LIGHT_LIGHTNESS_GET = 0x8229
LIGHT_LIGHTNESS_SET = 0x822B
LIGHT_LIGHTNESS_STATUS = 0x822C
LIGHT_HSL_SET = 0x8231
LIGHT_HSL_STATUS = 0x8232
LIGHT_CTL_SET = 0x825D
LIGHT_CTL_STATUS = 0x825E
LIGHT_COLOR_SET = 0x8200
LIGHT_COLOR_STATUS = 0x8201
# 传感器相关
SENSOR_GET = 0x8230
SENSOR_STATUS = 0x8231
SENSOR_CADENCE = 0x8237
SENSOR_SETTINGS = 0x8238
SENSOR_SETTING_GET = 0x8239
SENSOR_SETTING_STATUS = 0x823A
SENSOR_SERIES_GET = 0x823B
SENSOR_SERIES_STATUS = 0x823C
# 时间相关
TIME_GET = 0x1200
TIME_STATUS = 0x1201
TIME_SET = 0x1202
# 电池
BATTERY_STATUS = 0x820C
class MeshPropertyId(IntEnum):
"""Mesh 属性 ID - 用于解析传感器数据."""
PRESENCE_DETECTED = 0x0050 # 存在检测
MOTION_DETECTED = 0x0051 # 运动检测
AMBIENT_TEMPERATURE = 0x0059 # 环境温度
AMBIENT_HUMIDITY = 0x005A # 环境湿度
LIGHT_INTENSITY = 0x005D # 光照强度
BATTERY_LEVEL = 0x0075 # 电池电量
CO2_CONCENTRATION = 0x0092 # CO2 浓度
PM2_5_CONCENTRATION = 0x00B4 # PM2.5 浓度
TVOC_CONCENTRATION = 0x00B9 # TVOC 浓度
class SensorUnit(StrEnum):
"""传感器单位."""
NONE = ""
CELSIUS = "°C"
PERCENTAGE = "%"
LUX = "lx"
PPM = "ppm"
UG_M3 = "μg/m³"
PPB = "ppb"
MV = "mV"
VOLTAGE = "V"
# Mesh 属性 ID 到单位的映射
PROPERTY_UNIT_MAP: Final[dict[int, SensorUnit]] = {
MeshPropertyId.AMBIENT_TEMPERATURE: SensorUnit.CELSIUS,
MeshPropertyId.AMBIENT_HUMIDITY: SensorUnit.PERCENTAGE,
MeshPropertyId.LIGHT_INTENSITY: SensorUnit.LUX,
MeshPropertyId.BATTERY_LEVEL: SensorUnit.PERCENTAGE,
MeshPropertyId.CO2_CONCENTRATION: SensorUnit.PPM,
MeshPropertyId.PM2_5_CONCENTRATION: SensorUnit.UG_M3,
MeshPropertyId.TVOC_CONCENTRATION: SensorUnit.PPB,
MeshPropertyId.PRESENCE_DETECTED: SensorUnit.NONE,
MeshPropertyId.MOTION_DETECTED: SensorUnit.NONE,
}
# 事件类型
EVENT_SERIAL_DATA: Final = f"{DOMAIN}_serial_data"
EVENT_MESH_MESSAGE: Final = f"{DOMAIN}_mesh_message"
EVENT_DEVICE_JOINED: Final = f"{DOMAIN}_device_joined"
EVENT_DEVICE_LEFT: Final = f"{DOMAIN}_device_left"
# 串口通信
SERIAL_EVENT_PREFIX = "+EVENT="
SERIAL_MESH_RECV = "+EVENT=MESH,recv"
SERIAL_PROV_DEVICE_JOINED = "+EVENT=PROV,device_joined"
SERIAL_PROV_DEVICE_LEFT = "+EVENT=PROV,device_left"