【Follow me第二季第2期】+通过Wi-Fi,利用MQTT协议接入到开源的智能家居平台HA
[复制链接]
本帖最后由 王嘉辉 于 2024-9-9 23:32 编辑
此次主要就是想借此次活动来学习HA相关的知识,之前有了解到HA是一个功能非常庞大的物联网平台,但是由于自己的知识储备不足(大部分是没有学习的动力,hhh),一直没有接触到相关的知识。正好有这次活动,让我能够“被迫”学习HA相关的内容,发现要是实现数据的上传功能也不是很难,但是HA的庞大还需要继续进行探索。这篇就是简单介绍一下在Windows中使用VMware搭建HA的过程,以及怎么在HA中安装MQTT相关的内容和与Arduino R4 WIFI板子进行数据的交互。
首先是在Windows中安装VMware,我用的是VMware PRO 17的版本,这个的安装过程我参考了网上的一篇博客,相关的内容还是很多,大家可以自行去搜索安装。(当然其他版本的VMware应该也是可以的,网上相关的信息较多,大家可以自行尝试)
然后打开安装好的VMware开始进行HA平台的搭建。详细的过程大家可以去网上搜索帖子学习搭建,需要注意的两个地方(被坑了一个多小时),第一个是网络类型要选择桥接网络,第二个是要修改虚拟机的固件类型为UEFI。(我是被卡了一个小时,然后找到一篇帖子改了这两项后,就可以用了,具体的原理还没有深究,有懂的大佬可以指点一下)完成虚拟机的创建和配置后,直接一键开机。。。然后就会虚拟机就会打印出当前虚拟机的网络相关的信息,找到ipv4的地址,然后在浏览器中输入ipv4地址:8123就会进入到虚拟机中创建的HA的网页,大概需要等待20分钟的时间(网上的普遍说法,但是我大概等了几分钟的样子)就会进入HA的登陆界面,点击创建账户,输入一些信息,就可以创建属于自己的HA账户。
进入HA网页后,点击设置,选择加载项
点击右下角的加载项商店,搜索Mosquitto进行下载。
下载完后,点击设置->设备与服务->MQTT->配置对MQTT进行一些配置。用户名和密码填写创建HA的用户名和密码即可,也可以添加成员,使用新成员的用户名和密码。其余的可以保持默认不变。完成后,可以在MQTT设置页面进行PUB和SUB的测试。
下图所示,配置两个的主题保持一致,然后开启监听主题的开始监听,在上面发送信息,就会在下面收到。
然后就是怎么把Arduino的数据上传到HA中了,这第一步就是要在HA中创建一个设备。(这一步也难了一个小时,因为网上大部分的方案都是用NAS或者树莓派搭建的HA,使用命令行和修改yaml文件就实现了新建设备的功能,但是我使用虚拟机加网页的形式,没有找到yaml文件,所以找了很多的资料)最终,发现可以开启MQTT的自发现功能,然后向这个代理发送符合规则的PUB就可以添加设备。
下载一个MQTTX(也可以使用其他的相关模拟软件),免费、有中文。然后建立一个新的连接。填入的信息和创建的HA信息保持一致即可。
然后发送一个标准的PUB就可以添加设备到HA中了。topic填写在输入栏上方的topic栏中,信息填写在输入栏中,然后点击右下角的小飞机,就可以了。
topic:homeassistant/sensor/sensorBedroomH/config
{
"device_class":"humidity",
"name":"Humidity",
"state_topic":"homeassistant/sensor/sensorBedroom/state",
"unit_of_measurement":"%",
"value_template":"{{ value_json.humidity}}",
"unique_id":"hum01ae",
"device":{
"identifiers":[
"bedroom01ae"
],
"name":"Bedroom"
}
}
然后打开HA的网页,设置->设备与服务->MQTT->1个设备就可以看到传感器栏上有一个新的条目信息。说明添加设备成功了。
然后我们开始使用Arduino更新这个条目信息。先安装两个MQTT相关的库。
复制下面的代码,记得更改WIFI和MQTT相关的配置信息,然后下载到板子上,打开串口查看打印信息。并打开HA查看数据是否更新。(数据应该是21.5)
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
// 替换为你的网络信息
const char* ssid = "WIFI名称";
const char* password = "WIFI密码";
// 替换为你的Mosquitto broker信息
const char* mqtt_server = "IPV4地址";
const int mqtt_port = 1883;
const char* mqtt_user = "HA用户名";
const char* mqtt_password = "HA密码";
// 初始化WiFi和MQTT客户端
WiFiClient espClient;
PubSubClient client(espClient);
// 传感器数据发布主题
const char* topic = "homeassistant/sensor/sensorBedroom/state";
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// 假设你有一个温度传感器,获取温度数据
float temperature = readTemperature();
StaticJsonDocument<200> jsonDoc;
jsonDoc["humidity"] = temperature;
char jsonBuffer[512];
serializeJson(jsonDoc, jsonBuffer);
client.publish(topic, jsonBuffer);
// 每隔5秒发送一次数据
delay(5000);
}
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ArduinoClient", mqtt_user, mqtt_password)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
float readTemperature() {
// 在这里读取实际传感器的数据
// 示例中返回一个固定值
return 21.5;
}
这样就完成了HA的搭建以及Arduino R4 WIFI上传数据到HA平台。
在HA学习过程中遇到很多问题,借助了强大的AI工具,帮助我解决了很多疑惑,大家可以擅用AI工具,帮助自己对代码进行分析以及对问题进行处理。
|