激动!!!!
早就想着分享一些知识但是一直不知道该写些什么,最近在做基于home assistant +树莓派的只能家居,所以将这个过程的收获和知识记录下来分享给大家,这次就分享一个大致的过程。
在Home assistant在添加一个小灯并且控制小灯的亮灭。
首先给大家介绍一种协议,学过网络技术的应该知道常用的协议有:TCP,UDP,HTTP等等 。 MQTT是通过主题对消息进行分类的,本质就是一个UTF-8的字符串,每个主题都有自己的生产者(producer)和消费者(consumer).消费者订阅了只要相关主题,在生产者在该主题上发布消息时就会收到消息。
esp8266和h a 同时作为MQTT客户端,对于不同的主题充当着不同的角色。
例如本次的控制小灯实验:对于state主题来说,8266就是producer,h a是consumer。
8266把小灯的状态发到服务器上,h a以此为依据判断小灯的状态。对于switch主题来说
h a 就是producer,8266是consumer。
编辑h a 配置文件添加一个小灯的组件,默认开关状态是”on”,”off”。首先是点击ha上添加的组件,执行开或者关的操作,h a 会自动将命令通过switch主题发送给服务器,8266订阅该主题并执行相应操作,然后通过state主题将现在的状态发给h a 。h a 上小灯状态的信息完全由state主题传来的信息决定。
在arduino IDE上进行编程定义的引脚号与nodemcu上标注的引脚号并不一致,所以使用是要注意。(例:编程中的2号引脚对应nodemcu 上的D4引脚)。
程序分析:
client.setCallback(callback) ; 这条语句是定义回调函数,即当订阅的主题有消息的时候会自动调用callback这个函数。注意callback这个函数中参数的个数类型都不能变,只有名字可以改。
#include
#include
#define led 2
#define wifi_ssid “1235”
#define wifi_password “123456789”
#define mqtt_server “” // MQTT服务器的IP地址
#define mqtt_user “admin” // MQTT 用户名
#define mqtt_password “password” //MQTT 密码
#define pub_topic “hachina/hardware/led01/state”
const char* topic = “hachina/hardware/led01/switch”;
int flag =0;
String strRecv = “”;
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(9600);
pinMode(led,OUTPUT);
digitalWrite(led,HIGH);
setup_wifi();
client.setServer(mqtt_server, 61613);
client.setCallback(callback) ; //设定回掉方式,当8266收到订阅消息时调用此方法
}
void setup_wifi() { //链接wifi
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(wifi_ssid);
WiFi.begin(wifi_ssid, wifi_password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print("- ");
}
Serial.println("");
Serial.println(“WiFi connected”);
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect()
{
while (!client.connected()) {
Serial.print(“Attempting MQTT connection…”);
if (client.connect(“ESP8266Client”, 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);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print(“Message arrived [”);
Serial.print(topic); // 打印主题信息
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]); // 打印主题内容
}
Serial.println();
if ((char)payload[1] == ‘n’) {
digitalWrite(led, HIGH); // 亮灯
strRecv = “on”; flag=1;
Serial.print(“liangle”);
client.publish(pub_topic, String(strRecv).c_str(), true);
}
else {
digitalWrite(led, LOW); // 熄灯
strRecv = “off”; flag=2;
Serial.print(“Mie le”);
client.publish(pub_topic, String(strRecv).c_str(), true);
}
}
int i=0;
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
if(!i) //这几句不能写在setup
{
client.subscribe(“hachina/hardware/led01/switch”);
strRecv=“on”;
client.publish(pub_topic, String(strRecv).c_str(), true);
i++;
}
}
client.subscribe(“hachina/hardware/led01/switch”);//订阅switch主题
strRecv=“on”;
client.publish(pub_topic, String(strRecv).c_str(), true); i++;
基于以上的程序就能控制小灯的亮灭,同样我们可以把小灯换成任何传感器或者是开关,这就是智能家具的基本雏形了,当然真的去做还会有很多问题,比如传感器在 home assistant 中的配置问题等等。
第一篇博文就这么结束了,有没看懂的小伙伴千万不要灰心,因为这篇博文就是告诉大家这种东西离我们也没有那么远,也是可以掌握的,而我也没有具体的去讲解。从下一篇开始我就要从最基本的开始写起,教大家一步一步的实现自己的智能家居。