|
悬赏10金钱未解决
求救sos
我的HAOS是部署在飞牛虚拟机上的,现在Node-Red通过Glances 服务获取到了飞牛主机的CPU,内存等信息,然后通过MQTT out传给了HA的MQTT也能监听到消息,但无论如何都识别不了实体,deepseek和豆包都用了,请大佬帮忙看一下哪里错了吗。
NodeRED流程截图
{"name":"飞牛NAS CPU使用率","state_topic":"fnos/monitor","value_template":"{{ value_json.cpu_usage }}","unit_of_measurement":"%","device_class":"percentage","state_class":"measurement","unique_id":"fnos_cpu_usage","device":{"identifiers":["fnos_monitor"],"name":"飞牛NAS监控","model":"自定义监控","manufacturer":"Node-RED"}}
MQTT监听
{"name":"飞牛NAS CPU使用率","state_topic":"fnos/monitor","value_template":"{{ value_json.cpu_usage }}","unit_of_measurement":"%","device_class":"percentage","state_class":"measurement","unique_id":"fnos_cpu_usage","device":{"identifiers":["fnos_monitor"],"name":"飞牛NAS监控","model":"自定义监控","manufacturer":"Node-RED"}}
mqtt out截图
function函数代码
// 获取输入数据
const data = msg.payload;
// 精确匹配物理网卡(排除虚拟接口)
const getPhysicalNic = (baseName) => {
return data.network?.find(nic =>
nic.interface_name === baseName &&
nic.is_up === true &&
nic.speed > 0 // 确保是物理网卡
);
};
const nic1 = getPhysicalNic("enp1s0"); // 爱快软路由网卡
const nic2 = getPhysicalNic("enp4s0"); // 飞牛NAS网卡
// 字节转MB换算函数
const bytesToMB = (bytes) => bytes ? (bytes / 1048576).toFixed(2) : 0;
// 原始数据处理
const payloadData = {
// 基础监控指标
cpu_usage: data.cpu?.total || 0,
mem_usage: data.mem ? (data.mem.used / data.mem.total * 100).toFixed(1) : 0,
disk_usage: data.fs?.[0] ? (data.fs[0].used / data.fs[0].size * 100).toFixed(1) : 0,
// 爱快软路由网卡数据(使用累计值)
network_up_ik: bytesToMB(nic1?.cumulative_tx),
network_down_ik: bytesToMB(nic1?.cumulative_rx),
nic_name_ik: nic1?.interface_name || "未连接",
nic_speed_ik: nic1?.speed ? `${(nic1.speed / 1000000).toFixed(0)} Mbps` : "未知",
// 飞牛NAS网卡数据(使用累计值)
network_up_fn: bytesToMB(nic2?.cumulative_tx),
network_down_fn: bytesToMB(nic2?.cumulative_rx),
nic_name_fn: nic2?.interface_name || "未连接",
nic_speed_fn: nic2?.speed ? `${(nic2.speed / 1000000).toFixed(0)} Mbps` : "未知",
timestamp: new Date().toISOString()
};
// MQTT自动发现配置(核心部分)
const discoveryPrefix = "homeassistant"; // HA默认发现前缀
const baseTopic = "fnos/monitor"; // 你的数据发送主题(可根据实际修改)
// 所有需要生成的实体配置
const sensors = [
// CPU使用率
{
object_id: "cpu_usage",
name: "飞牛NAS CPU使用率",
value_key: "cpu_usage",
unit: "%",
device_class: "percentage"
},
// 内存使用率
{
object_id: "mem_usage",
name: "飞牛NAS 内存使用率",
value_key: "mem_usage",
unit: "%",
device_class: "percentage"
},
// 磁盘使用率
{
object_id: "disk_usage",
name: "飞牛NAS 磁盘使用率",
value_key: "disk_usage",
unit: "%",
device_class: "percentage"
},
// 爱快上行流量
{
object_id: "network_up_ik",
name: "爱快软路由 上行流量",
value_key: "network_up_ik",
unit: "MB",
device_class: "data_size"
},
// 爱快下行流量
{
object_id: "network_down_ik",
name: "爱快软路由 下行流量",
value_key: "network_down_ik",
unit: "MB",
device_class: "data_size"
},
// 爱快网卡速度
{
object_id: "nic_speed_ik",
name: "爱快软路由 网卡速度",
value_key: "nic_speed_ik",
unit: ""
},
// 飞牛上行流量
{
object_id: "network_up_fn",
name: "飞牛NAS 上行流量",
value_key: "network_up_fn",
unit: "MB",
device_class: "data_size"
},
// 飞牛下行流量
{
object_id: "network_down_fn",
name: "飞牛NAS 下行流量",
value_key: "network_down_fn",
unit: "MB",
device_class: "data_size"
},
// 飞牛网卡速度
{
object_id: "nic_speed_fn",
name: "飞牛NAS 网卡速度",
value_key: "nic_speed_fn",
unit: ""
}
];
// 生成自动发现消息
const discoveryMessages = sensors.map(sensor => {
return {
topic: `${discoveryPrefix}/sensor/fnos_${sensor.object_id}/config`,
payload: {
name: sensor.name,
state_topic: baseTopic,
value_template: `{{ value_json.${sensor.value_key} }}`,
unit_of_measurement: sensor.unit,
device_class: sensor.device_class || null,
state_class: "measurement",
unique_id: `fnos_${sensor.object_id}`,
device: {
"identifiers": ["fnos_monitor"],
"name": "飞牛NAS监控",
"model": "自定义监控",
"manufacturer": "Node-RED"
}
},
retain: true // 保留配置,HA重启后仍有效
};
});
// 数据消息(发送实际监控值)
const dataMessage = {
topic: baseTopic,
payload: payloadData,
retain: false
};
// 输出所有消息(配置消息 + 数据消息)
return [...discoveryMessages, dataMessage];
|
|