【Follow me第2期】进阶任务 通过Wi-Fi,利用MQTT协议接入到开源的智能家居平台HA...
[复制链接]
本帖最后由 eew_HqZm7h 于 2024-10-9 12:59 编辑
Home Assistant简介
Home Assistant 是一款免费的开源家庭自动化软件,将可联网的设备接入到Home Assistant中,可以实现对它们远程控制,在手机上可以远程控制灯光、电气设备,监控室内温度并自动执行开空调等操作。也可以关联不同的设备,使它们流程化操作。
任务步骤:
1.单片机连接WIFI
2.部署Home Assistant
3.部署MQTT服务器
4.Home Assistant与MQTT服务器连接
5.单片机通过MQTT服务连接到Home Assistant中
1.单片机连接WIFI
使用arduino自带的样例连接WIFI
注意点:1.自己手动创建arduino_secrets.h头文件,设置SECRET_SSID(WIFI名称)和SECRET_PASS(WIFI密码)。或者在代码中直接对ssid和pass赋值。
2.单片机只能接受到2.4GHZ信号的WIFI,可以先用ScanNetworksAdvanced样例,扫描是否能接收到WIFI的信号。
/*
This example connects to an unencrypted WiFi network.
Then it prints the MAC address of the WiFi module,
the IP address obtained, and other network details.
created 13 July 2010
by dlf (Metodo2 srl)
modified 31 May 2012
by Tom Igoe
Find the full UNO R4 WiFi Network documentation here:
https://docs.arduino.cc/tutorials/uno-r4-wifi/wifi-examples#connect-with-wpa
*/
#include <WiFiS3.h>
#include "arduino_secrets.h"
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID; // your network SSID (name)
char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP)
int status = WL_IDLE_STATUS; // the WiFi radio's status
void setup() {
//Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// check for the WiFi module:
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("Communication with WiFi module failed!");
// don't continue
while (true);
}
String fv = WiFi.firmwareVersion();
if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
Serial.println("Please upgrade the firmware");
}
// attempt to connect to WiFi network:
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
// Connect to WPA/WPA2 network:
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
// you're connected now, so print out the data:
Serial.print("You're connected to the network");
printCurrentNet();
printWifiData();
}
void loop() {
// check the network connection once every 10 seconds:
delay(10000);
printCurrentNet();
}
void printWifiData() {
// print your board's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// print your MAC address:
byte mac[6];
WiFi.macAddress(mac);
Serial.print("MAC address: ");
printMacAddress(mac);
}
void printCurrentNet() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print the MAC address of the router you're attached to:
byte bssid[6];
WiFi.BSSID(bssid);
Serial.print("BSSID: ");
printMacAddress(bssid);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.println(rssi);
// print the encryption type:
byte encryption = WiFi.encryptionType();
Serial.print("Encryption Type:");
Serial.println(encryption, HEX);
Serial.println();
}
void printMacAddress(byte mac[]) {
for (int i = 0; i < 6; i++) {
if (i > 0) {
Serial.print(":");
}
if (mac[i] < 16) {
Serial.print("0");
}
Serial.print(mac[i], HEX);
}
Serial.println();
}
连接成功后会打印单片机的IP地址以及Mac地址
2.部署Home Assistant(Docker部署)
刚开始,我是直接下载Home Assistant镜像直接部署的,等了很久下载文件,但是最后还是失败了。
使用Docker部署Home Assistant
前提提要:将docker的拉取镜像的源换成国内源(如阿里云)
(1)拉取镜像(连接WIFI下载好多次都失败,换成流量下载试了两三次成功了)
docker pull homeassistant/home-assistant:latest //获取最新版的Home Assistant
也可以获取稳定版
docker pull homeassistant/home-assistant:stable
等待所有相关程序Pull complete就安装成功了。
(2)创建并运行容器
docker run -d --name="hass" -v /home/hass/config:/config -p 8123:8123 homeassistant/home-assistant:latest
(3)查看容器
docker ps -a
(4)使用自己的虚拟机IP+端口号8123在主机上访问Home Assistant
(5)创建账号并成功登录
3.部署MQTT服务器
(1)拉取EMQX镜像
docker pull emqx/emqx:5.8.0
(2)创建并启动EMQX容器
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:5.8.0
(3)通过虚拟机IP+端口号18083访问EMQX(默认用户名:admin,密码:public)
4.Home Assistant与MQTT服务器通信
(1)创建内置数据库(数据库用来记录连接的信息)(全部选默认的即可)
(2)创建用户(Home Assistant通过创建的用户账号和密码连接到EMQX)
(3)Home Assistant连接EMQX
在Home Assistant主页面点击设置--设备与服务--添加集成(右下角)--搜索MQTT--点击MQTT
注意点(这里的代理是EMQX节点的地址,不是EMQX服务器的地址)
连接成功后连接数变为1(注意图中的EMQX节点地址)
5.单片机通过MQTT服务连接到Home Assistant中
(1)下载ArduinoMqttClient库,使用WiFiSimpleSender样例(此样例会连接WIFI并连接MQTT服务器)
需要修改的地方:(注:MQTT服务器的账号和密码为注释项,如果自己的服务器设置账号和密码,需要自己取消注释并修改。)
连接成功后一直发送消息:
两个错误点:
(1) MQTT connection failed! Error code = -2
这个问题困扰了我很长时间。最后解决的方法:将虚拟机的网络和单片机的网络接入到同一个网段。
将虚拟机网络连接模式改为桥接模式,并在“编辑”中选择“虚拟网络编辑器”,指定桥接的网卡为无线网卡。并将单片机连接的热点和主机连接的热点一致。
之前 一直连接失败,是将虚拟机的连接模式设置为NAT模式,而且将单片机连接到了电脑的热点上。
(2)MQTT connection failed! Error code = 5
这是连接MQTT时认证失败,应该检查账号和密码,或者关闭MQTT服务器的内置数据库(起认证作用)。
|