受欢迎的博客标签

实现MQTT协议 - How to implement a custom MQTT Client device on home assistant via c# .net -开源库:MQTTnet

Published

Home Assistant 支持通过 MQTT 协议与设备通信;

使用 C# 和 .NET 可以开发 Home Assistant 集成,但需要结合 MQTT 协议或第三方库实现。

 .NET 可以通过 MQTT 库(MQTTnet)实现设备控制与状态上报。

例如:

​​自动发现设备​​:按照 MQTT 发现消息格式发布配置信息(如 [homeassistant/button/pc/mac/config](@ref)),Home Assistant 会自动识别设备1

​​状态控制​​:通过发布消息到 command_topic 控制设备,订阅 availability_topic 更新设备状态

我们已经成功在 Home Assistant 平台添加了 MQTT 服务器。通过 MQTT Client, 自己开发的设备或者传感器都能很方便的接入 Home Assistant

我们将介绍如何在.NET 中使用MQTTnet来创建一个简单的MQTT发布和订阅示例。这个示例包括一个树莓派上运行的MQTT服务端(home assistant)和一个MQTT客户端。

 

hass关于Discovery格式原文地址:https://www.home-assistant.io/integrations/mqtt/#mqtt-discovery

Discovery topic 

<discovery_prefix>/<component>/[<node_id>/]<object_id>/config

 

本次选用的类库为c# MQTTnet

MQTTnet的源码托管在GitHub上,地址为:https://github.com/dotnet/MQTTnet

https://github.com/dotnet/MQTTnet

 

C#的MQTT系列


​ ​MQTT(一)C#使用 MQTTnet 快速实现 MQTT 通信​​

​ ​MQTT(二)在windows64位上安装Python环境​​

​ ​MQTT(三)Python客户端+net客户端+net服务端 简单通信​​

​ ​MQTT(四)树莓派开机自动运行Python客户端​​

​ ​MQTT(五)实现开源MQTT消息服务器​​

 

可以通过MQTT协议实现设备之间的通信,包括设备的发现、状态更新等功能。

使用.NET为Home Assistant添加自定义设备,实现电脑远程关机的功能

 

利用 MQTT auto discovery 特点来自动创建实体

 

 

使用MQTTnet

官网项目网址:https://github.com/chkr1011/MQTTnet

首先我们需要在 .NET 中实现 MQTT 客户端

 

一种是更新ha中已有的实体;

一种是用自动发现直接在ha中创建实体

 

项目准备

首先,我们需要创建1个.NET 控制台项目,用作客户端。这个项目将实现MQTT消息发布和订阅功能。

然后,我们需要安装MQTTnet包。在本示例中,我们选择安装MQTTnet。

 

step 1.客户端-新建一个控制台项目

step 2.添加Nuget包:安装MQTTnet

<ItemGroup>
  <PackageReference Include="MQTTnet" Version="5.0.1.1416" />
</ItemGroup>

 

 

设备需要通过 MQTT 发送一条配置消息,HA会自动识别:
温度传感器配置消息:
发布到主题:homeassistant/sensor/temp_sensor/config

{
   
  "name": "Temperature Sensor",
  "device_class": "temperature",
  "state_topic": "homeassistant/all/esp8266/state",
  "unit_of_measurement": "°C",
  "value_template": "{
   { value_json.temperature }}",
  "unique_id": "temp_sensor",
  "device": {
   
    "identifiers": ["esp8266_sensor"],
    "name": "ESP8266 Sensor",
    "manufacturer": "Espressif",
    "model": "ESP8266EX",
    "sw_version": "1.0.0"
  }
}

 

 

// CPU占用

homeassistant/sensor/computer/cpu/config

{

  "unique_id": "computer_cpu_usage",

  "name": "电脑 CPU 占用",

  "state_topic": "home/computer/status/cpu",

  "unit_of_measurement": "%",

  "device_class": "power",

  "value_template": "{{ value }}",

  "device": {

    "identifiers": ["computer_unique_identifier"],

    "name": "电脑",

    "manufacturer": "期望氢气球",

    "model": "PC-Model",

    "sw_version": "1.0"

  }

}

// 内存占用

homeassistant/sensor/computer/memory/config

{

  "unique_id": "computer_memory_usage",

  "name": "电脑 内存占用",

  "state_topic": "home/computer/status/memory",

  "unit_of_measurement": "%",

  "device_class": "power",

  "value_template": "{{ value }}",

  "device": {

    "identifiers": ["computer_unique_identifier"],

    "name": "电脑",

    "manufacturer": "期望氢气球",

    "model": "PC-Model",

    "sw_version": "1.0"

  }

}

// 上传速度

homeassistant/sensor/computer/upload_speed/config

{

  "unique_id": "computer_upload_speed",

  "name": "电脑 上传速度",

  "state_topic": "home/computer/status/upload_speed",

  "unit_of_measurement": "bytes/s",

  "device_class": "data_rate",

  "value_template": "{{ value }}",

  "device": {

    "identifiers": ["computer_unique_identifier"],

    "name": "电脑",

    "manufacturer": "期望氢气球",

    "model": "PC-Model",

    "sw_version": "1.0"

  }

}

// 下载速度

homeassistant/sensor/computer/download_speed/config

{

  "unique_id": "computer_download_speed",

  "name": "电脑 下载速度",

  "state_topic": "home/computer/status/download_speed",

  "unit_of_measurement": "bytes/s",

  "device_class": "data_rate",

  "value_template": "{{ value }}",

  "device": {

    "identifiers": ["computer_unique_identifier"],

    "name": "电脑",

    "manufacturer": "期望氢气球",

    "model": "PC-Model",

    "sw_version": "1.0"

  }

}

// 开关配置

homeassistant/switch/computer/shutdown/config

{

  "unique_id": "computer_shutdown_switch",

  "name": "电脑关机开关",

  "command_topic": "home/computer/command/shutdown",

  "payload_on": "ON",

  "payload_off": "OFF",

  "device": {

    "identifiers": ["computer_unique_identifier"],

    "name": "电脑",

    "manufacturer": "期望氢气球",

    "model": "PC-Model",

    "sw_version": "1.0"

  }

}

 

// 开关配置

homeassistant/switch/computer/shutdown/config

{

  "unique_id": "computer_shutdown_switch",

  "name": "电脑关机开关",

  "command_topic": "home/computer/command/shutdown",

  "payload_on": "ON",

  "payload_off": "OFF",

  "device": {

    "identifiers": ["computer_unique_identifier"],

    "name": "电脑",

    "manufacturer": "期望氢气球",

    "model": "PC-Model",

    "sw_version": "1.0"

  }

}

 

 

local disk: F:\developer_mqtt_client\mqtt_client

remote github:https://github.com/iaspnetcore/mqtt_client.git

blog:https://www.iaspnetcore.com/Blog/BlogPost/67647cc2709e6b8b87a4d742/c-implementing-mqtt-communication-protocol-open-source-library-mqttnet

 

 

useful links

https://www.cnblogs.com/duhaoran/p/12718305.html

ASP.NET Core 实现 MQTT通讯协议 Demo(开源库:MQTTnet)

 

MQTTnet:在.NET 7中实现MQTT消息传输

https://www.mqtt.cn/616.html

ha and c#

https://blog.csdn.net/qq_41830158/article/details/131605651