from ast import List
from enum import Enum
from typing import Union
import datetime
from ...model.log import log
[文档]
class DataItem:
"""数据项实体类,表示一个具体的数据项。
:ivar di: 数据标识 (DI),4 字节。
:ivar name: 数据项名称。
:ivar data_format: 数据格式字符串(如 "XXXXXX.XX")。
:ivar value: 数据值。
:ivar unit: 数据单位。
:ivar update_time: 最后更新时间戳。
"""
def __init__(
self,
di: int,
name: str,
data_format: str,
value: Union[str, float, List] = 0,
unit: str = "",
update_time: datetime.datetime = datetime.datetime.now(),
):
"""初始化 DataItem 实例。
:param di: 数据标识 (DI)。
:type di: int
:param name: 数据项名称。
:type name: str
:param data_format: 定义数据结构的格式。
:type data_format: str
:param value: 数据项的实际值,默认为 0。
:type value: Union[str, float, List], 可选
:param unit: 单位字符串(如 "kWh"),默认为空字符串。
:type unit: str, 可选
:param update_time: 数据更新的时间戳,默认为当前时间。
:type update_time: datetime.datetime, 可选
"""
self.di = di
self.name = name
self.data_format = data_format
self.value = value
self.unit = unit
self.update_time = update_time
def __repr__(self):
"""返回 DataItem 的字符串表示。
:return: 字符串表示。
:rtype: str
"""
return (
f"DataItem(name={self.name}, di={format(self.di, '#x')}, value={self.value}, "
f"unit={self.unit},data_format={self.data_format}, timestamp={datetime.datetime.strftime(self.update_time, '%Y-%m-%d %H:%M:%S')})"
)
[文档]
class DataType:
"""数据类型配置类。
:ivar di: 数据标识 (DI),整数形式。
:ivar name: 数据类型名称。
:ivar unit: 计量单位。
:ivar data_format: 格式字符串定义。
"""
def __init__(self, Di="", Name="", Unit="", DataFormat=""):
"""初始化 DataType 实例。
:param Di: 数据标识字符串(十六进制),默认为空字符串。
:type Di: str, 可选
:param Name: 数据类型名称,默认为空字符串。
:type Name: str, 可选
:param Unit: 计量单位,默认为空字符串。
:type Unit: str, 可选
:param DataFormat: 格式字符串,默认为空字符串。
:type DataFormat: str, 可选
"""
self.di = uint32_from_string.from_json(Di)
self.name = Name
self.unit = Unit
self.data_format = DataFormat
[文档]
@classmethod
def from_dict(cls, data):
"""从字典创建 DataType 实例。
:param data: 包含 'Di', 'Name', 'Unit', 'DataFormat' 的字典。
:type data: dict
:return: DataType 实例。
:rtype: DataType
"""
return cls(**data)
[文档]
class uint32_from_string(int):
"""自定义整数类型,用于处理从字符串(包括十六进制)解析 uint32。"""
[文档]
@classmethod
def from_json(cls, data):
"""将输入数据解析为 uint32 整数。
处理以下情况:
- 空字符串 -> 0
- 十六进制字符串(带或不带 0x 前缀)
- 普通整数
:param data: 待解析的输入数据。
:type data: Union[str, int]
:return: 解析后的整数值。
:rtype: uint32_from_string
:raises ValueError: 如果转换失败。
"""
if data == "":
return cls(0)
if isinstance(data, str):
try:
return cls(int(data, 16))
except ValueError as e:
raise ValueError(f"无法转换为 uint32: {e}")
return cls(data)
[文档]
def init_data_type_from_list(data_list):
"""从 Python 数据列表初始化 DataType 对象列表。
:param data_list: 包含字典的可迭代对象,每个字典包含 DataType 的字段。
:type data_list: Iterable[dict]
:return: 初始化后的 DataType 对象列表。
:rtype: list[DataType]
"""
return [DataType.from_dict(item) for item in data_list]