『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 6609|回复: 4

MQTT局域网开关,局域网内通过mqtt协议控制esp8266DIY设备

[复制链接]

8

主题

73

帖子

723

积分

高级会员

Rank: 4

积分
723
金钱
650
HASS币
30
发表于 2020-12-21 19:44:30 | 显示全部楼层 |阅读模式
来论坛也一段时间了,看了很多教程,发现没有一个教程是完整记录如何通过mqtt接入DIY 8266开关设备的,也许大家都是大神吧,这种小儿科的东西不感兴趣,我贴出来也就是为了攒点积分~~~

首先我的平台是群晖+hassio+ncarlier/mqtt,这个大家在群晖套件中心下载docker后在里面搜索就可以下载了,具体就不讲了,直接贴代码:


#include <ESP8266WiFi.h>

#include <PubSubClient.h>



#define LED 0 // GPIO引脚别名 仅使用于NodeMCU开发板



//默认使用'$'符号作为调试信息输出的标识

//默认使用'#'符号作为控制信息的标识开头



const char *WIFI_SSID = "nicai";     // WIFI名称   必须2.4G  可以手机开热点

const char *WIFI_PASS = "qq19871414"; // WIFI密码  



const char *MQTT_BROKER = "192.168.1.4"; // MQTT服务器地址

const int MQTT_PORT = 1883;             // MQTT服务端口  服务器1883端口记得打开,不然连不进去

const char *CLIENT_ID = "c001";         //客户端ID

const char *PUBLISH_TOPIC = "pub01";    //发布的topic

const char *SUBSCRIBE_TOPIC = "sub01";  //订阅的topic





void callback(char *topic, uint8_t *message, unsigned int length); //回调函数声明,用于传入mqtt客户端构造函数作为参数





WiFiClient wifiClient;

//参数: MQTT服务器地址,端口号,回调函数名,承载的连接(WIFI)





PubSubClient mqttClient(MQTT_BROKER, MQTT_PORT, callback, wifiClient);



//回调函数

void callback(char *topic, uint8_t *message, unsigned int length) {

    Serial.println("$Received message:");



    String sTopic = topic; //将topic转换为String 可以加以处理



    String sMessage = (char *)message;        //将消息转换为String

    sMessage = sMessage.substring(0, length); //取合法长度 避免提取到旧消息

     Serial.println(sMessage); //输出消息 用于调试 可以注释掉





//判断接收字符,指定开关状态

    if (sMessage == "ON"){  //接收数据为ON,则打开开关

        Serial.println("print is HIGH");

        MQTT_doPublishOnDefaultTopic(sMessage); //发布话题,发送内容为ON

        //digitalWrite(LED_BUILTIN, HIGH);  //板载led输出高电平

        digitalWrite(LED, 1);//实际控制io口输出高电平

    }

    if (sMessage == "OFF"){  //接收数据为ON,则关闭开关

        Serial.println("print is LOW");

        MQTT_doPublishOnDefaultTopic(sMessage); //发布话题,发送内容为OFF

        //digitalWrite(LED_BUILTIN, LOW);  //板载led输出低电平

        digitalWrite(LED, 0);  //实际控制io口输出低电平

    }

}





// MQTT发布函数 需要使用可以解除注释 传入一个字符串 发送到默认配置的发布topic

void MQTT_doPublishOnDefaultTopic(String payload) {

    //参数: 发布的话题,发布的内容

    mqttClient.publish(PUBLISH_TOPIC, payload.c_str()); // String的c_str()方法将一个字符串转换为字符数组

}



//所有Arduino程序都具备的配置函数 系统初始化后只执行一次

void setup() {

    pinMode(LED, OUTPUT); //初始化引脚

    pinMode(LED_BUILTIN, OUTPUT);

    digitalWrite(LED, 0); //初始化输出高电平

     digitalWrite(LED_BUILTIN, HIGH);  



    //启用串口

    Serial.begin(115200);

    // Serial.println("$Hello world!"); //串口输出消息



    //连接WIFI

    WiFi.begin(WIFI_SSID, WIFI_PASS);



    //连接未成功时 循环等待

    while (WiFi.status() != WL_CONNECTED) {

        delay(1000);

        Serial.println("$Still waiting...");

    }



    Serial.println("$Wi-Fi connected");

    Serial.print("$IP address: ");

    Serial.println(WiFi.localIP());



    //进行MQTT连接

    //当MQTT服务器连接不成功时

    while (!mqttClient.connected()) {

        Serial.println("$Waiting for MQTT");

        //执行(重试)MQTT连接

        if (mqttClient.connect(CLIENT_ID)) {

            //连接成功后 订阅指定的topic

            if (mqttClient.subscribe(SUBSCRIBE_TOPIC, 0)) { // QoS: 0/1/2 [|0: 只发送一次(常用)|1: 至少发送一次|2: 一定收到一次]

                Serial.println("$Subscribed."); //订阅成功 发送调试消息





                int n =digitalRead(LED);

                //String n1 = String(n);

                if (n ==1){

                    MQTT_doPublishOnDefaultTopic("ON");

                    Serial.println(n);

                }

                if (n ==0){

                    MQTT_doPublishOnDefaultTopic("OFF");

                    Serial.println(n);

                }





            } else {

                Serial.println("$Subscribe failed."); //订阅不成功 发送调试消息

                //如有需要 可以加死循环阻止程序继续运行

            }

        }

        delay(1000);

    }

}


//所有Arduino程序都具备的循环函数 setup()函数执行后循环执行

void loop() {

    delay(500);

    mqttClient.loop(); //保证MQTT客户端持续运行和接收消息

}



这段代码复制下来保存为.ino文件(arduino文件),然后通过arduino IDE烧写就可以了,如果不会配置arduino的,建议下载mixly烧写,简单方便

在hass的configuration里添加如下配置:

mqtt:
  broker: 192.168.1.4  #这里是你mqtt的地址
  port: 1883
  discovery: true
  discovery_prefix: homeassistant


#Switch 开关
light:  
  - platform: mqtt
    name: "鱼缸插排"  #自己定义名字
    state_topic: "pub01"  #订阅的主题,这个每个设备都要不一样
    command_topic: "sub01"    #发送的主题,这个每个设备都要不一样
    qos: 1
    payload_on: "ON"
    payload_off: "OFF"
    retain: true



重启hass就可以了
回复

使用道具 举报

14

主题

430

帖子

2699

积分

金牌会员

Rank: 6Rank: 6

积分
2699
金钱
2269
HASS币
0
发表于 2020-12-23 09:26:59 | 显示全部楼层
此帖仅作者可见
若然,一切若然~

使用道具 举报

43

主题

412

帖子

3808

积分

元老级技术达人

积分
3808
金钱
3391
HASS币
136
发表于 2022-12-5 22:56:24 | 显示全部楼层
此帖仅作者可见

使用道具 举报

0

主题

1

帖子

22

积分

新手上路

Rank: 1

积分
22
金钱
21
HASS币
0
发表于 2023-1-3 13:24:20 | 显示全部楼层
此帖仅作者可见

使用道具 举报

22

主题

78

帖子

652

积分

高级会员

Rank: 4

积分
652
金钱
574
HASS币
0
发表于 2023-1-5 00:36:06 | 显示全部楼层
此帖仅作者可见

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-28 11:50 , Processed in 0.186474 second(s), 26 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表