设备1

上电自动注册自己是个1个开关

HASS网页和手机APP控制

外部开关上升沿中断控制

天猫精灵语音控制

一键配网

记录以往WIFI信息

设备2

上电后,自动注册自己有三个开关控制

HASS网页和手机APP控制

外部开关上升沿中断控制

天猫精灵语音控制

设备1 代码

需添加

一键配网

记录以往WIFI信息

需去掉 打印注释

/***************************************************

 ****************************************************/
#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h" /*-------------------------------------------------------------------------------------------
* 配置WIFI信息
*------------------------------------------------------------------------------------------*/ #define WLAN_SSID "dongdong"
#define WLAN_PASS "ldd123456" /*-------------------------------------------------------------------------------------------
* 配置MQTT服务器信息
*------------------------------------------------------------------------------------------*/ //#define AIO_SERVER "io.adafruit.com" // 不稳定
//#define AIO_SERVER "broker.mqtt-dashboard.com" // 稳定
#define AIO_SERVER "www.dongvdong.top"
#define AIO_SERVERPORT 1883 // use 8883 for SSL
#define AIO_USERNAME ""
#define AIO_KEY "" /*-------------------------------------------------------------------------------------------
* 配置外接设备
*------------------------------------------------------------------------------------------*/
// 灯的接口 D4口-继电器
int Light_1 = D4;
// 灯的按键 D2- 按键开关
int Light_1_btn = D8;
/*-------------------------------------------------------------------------------------------
* 开启MQTT服务
*------------------------------------------------------------------------------------------*/ // Create an ESP8266 WiFiClient class to connect to the MQTT server.
WiFiClient client; // Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_USERNAME, AIO_KEY); /*-------------------------------------------------------------------------------------------
-由于MQTT发布信息有长度限制 130个左右,不能一次性发送太多自身配置信息,因此发杂的设备无法注册
*/ //------------------1 设备自身配置信息 ------------------------ //-------------------新设备 (1)修改在hass中显示的名字(可以不改) // 在hass中显示的名字
#define name_s "rgb"
//-------------------新设备 (2)修改设备分配的话题(必须改) 可修改第二 产品 ID
// 用户 + 产品 ID + 属性+ 接收或发送
//接收开关命令话题
#define command_topic_s "DD/rgb/o/c"
// 自身开关状态发布话题
#define state_topic_s "DD/rgb/o/s"
// 接收亮度命令话
#define brightness_command_topic_s "DD/rgb/b/c"
// 自身亮度发布话题
#define brightness_state_topic_s "DD/rgb/b/s"
// 接收颜色命令话题
#define rgb_command_topic_s "DD/rgb/r/c"
// 自身颜色状态发布话题
#define rgb_state_topic_s "DD/rgb/r/s" #define optimistic_c "false" //-------------------2 hass自动发现MQTT设备话题-------第三参数 ID 必须改------------------ //-------------------新设备 (3)修改设备注册ID 第三个参数 (不同于名字)
#define MQTT_config_TOPIC "homeassistant/light/rgb_test_v1/config" //-------------------新设备 (4)修改设备属性 有什么属性加入json包
//------------------灯 JSON打包 开关 亮度 颜色------------------------
// 灯必须先有 开关 然后有亮度 然后 再有颜色 (跳过顺序将不会正常显示功能)
String my_config_s=
String("{\"name\":\"")+ name_s
+String("\",\"command_topic\":\"")+command_topic_s
+String("\",\"state_topic\":\"")+state_topic_s
+String("\",\"brightness_command_topic\":\"")+brightness_command_topic_s
+String("\",\"brightness_state_topic\":\"")+brightness_state_topic_s
//+String("\",\"rgb_command_topic_topic\":\"")+rgb_command_topic_s
//+String("\",\"rgb_state_topic\":\"")+rgb_state_topic_s
//+String("\",\"optimistic\":\"")+optimistic_c
+String("\"}"); // 发布自己的配置信息
Adafruit_MQTT_Publish hass_config = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME MQTT_config_TOPIC); // 发布自己的开关信息
Adafruit_MQTT_Publish state_topic = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME state_topic_s);
//hachina
//发布自己的亮度信息
Adafruit_MQTT_Publish brightness_state_topic = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME brightness_state_topic_s); //发布自己的颜色信息
Adafruit_MQTT_Publish rgb_state_topic = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME rgb_state_topic_s); /*-------------------------------------------------------------------------------------------
* 功能:订阅开关信息
* 输入:颜色数据
* 输出:空
*------------------------------------------------------------------------------------------*/ //订阅开关命令
Adafruit_MQTT_Subscribe command_topic = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME command_topic_s, MQTT_QOS_1);
//订阅亮度命令
Adafruit_MQTT_Subscribe brightness_command_topic = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME brightness_command_topic_s, MQTT_QOS_1);
//订阅颜色命令
Adafruit_MQTT_Subscribe rgb_command_topic = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME rgb_command_topic_s, MQTT_QOS_1); /*************************** 接受信息订阅函数 ************************************/ void state_topic_send(String state){ if (!mqtt.connected()) {
Serial.println(F("state_topic.publish Failed"));
return;
} if (! state_topic.publish(state.c_str())) {
Serial.println(F("state_topic.publish Failed"));
} else {
Serial.println(String("state_topic.publish ")+state);
} } /*-------------------------------------------------------------------------------------------
* 功能:接收开关命令回掉函数
* on 开灯 off 关灯
* 输入:接收数据+数据长度
* 输出:空
*------------------------------------------------------------------------------------------*/
void command_topic_call(char *data, uint16_t len) {
//Serial.print("the button value is: ");
//Serial.println(data); String msg=String(data);
// 收到 打开
if(msg=="ON") { Serial.println("light is open");
digitalWrite(Light_1, HIGH);
state_topic_send("ON");// 返回 打开状态
} if(msg=="OFF") { Serial.println("light is close");
digitalWrite(Light_1, LOW);
state_topic_send("OFF");
} }
/*-------------------------------------------------------------------------------------------
* 功能:接收亮度命令回掉函数
* 向电脑打印输出亮度值 0-255
* 输入:亮度数据
* 输出:空
*------------------------------------------------------------------------------------------*/
void brightness_command_topic_call(double x) {
Serial.print("Hey we're in a slider callback, the slider value is: ");
Serial.println(x); if (! brightness_state_topic.publish(x)) {
Serial.println(F("brightness_state_topic.publish Failed"));
} else {
Serial.print(F("brightness_state_topic.publish "));Serial.println(x);
} }
/*-------------------------------------------------------------------------------------------
* 功能:接收颜色命令回掉函数
* 向电脑打印输出亮度值 255,255,255
* 输入:颜色数据
* 输出:空
*------------------------------------------------------------------------------------------*/
void rgb_command_topic_call(char *data, uint16_t len) {
Serial.print("the button value is: ");
Serial.println(data); }
/*-------------------------------------------------------------------------------------------
* 功能:外部设备中断函数
*------------------------------------------------------------------------------------------*/
bool Light_1_state=LOW;// 开关状态
bool Light_1_stateSend=0; // 是否返回开关数据 void Light_1_btn_highInterrupt(){ Light_1_state=!Light_1_state;// 硬件开关每次按一下,开关状态反转一下
Light_1_stateSend=1;// 打开发送标志位,在主函数中调用publish将自己的状态返回去,在中断里调用会报错
digitalWrite(Light_1, Light_1_state); }
/*-------------------------------------------------------------------------------------------
* 功能:外部设备初始化
*------------------------------------------------------------------------------------------*/
void IO_int(){
//继电器初始化--灯
pinMode(Light_1, OUTPUT);
digitalWrite(Light_1, LOW); // 灯的按键开关初始化
pinMode(Light_1_btn, INPUT);
attachInterrupt(Light_1_btn, Light_1_btn_highInterrupt, RISING);// 上升沿触发 } void setup() { IO_int(); Serial.begin(115200);
delay(10); Serial.println(F("Adafruit MQTT demo")); // Connect to WiFi access point.
Serial.println(); Serial.println();
Serial.print("Connecting to ");
Serial.println(WLAN_SSID); WiFi.begin(WLAN_SSID, WLAN_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(); Serial.println("WiFi connected");
Serial.println("IP address: "); Serial.println(WiFi.localIP()); // 配置信息转换
// strcpy( my_config_c, my_config.c_str()); // 回掉函数
command_topic.setCallback(command_topic_call);
brightness_command_topic.setCallback(brightness_command_topic_call);
rgb_command_topic.setCallback(rgb_command_topic_call);
// 订阅话题注册 mqtt.subscribe(&command_topic);
mqtt.subscribe(&brightness_command_topic);
mqtt.subscribe(&rgb_command_topic); } uint32_t x=0; void loop() { MQTT_connect();
// this is our 'wait for incoming subscription packets and callback em' busy subloop
// try to spend your time here:
mqtt.processPackets(1000); //按键对灯的控制以及返回灯的状态
if(Light_1_stateSend==1){ if(Light_1_state==HIGH)
{state_topic_send("ON");}
else if(Light_1_state==LOW)
{state_topic_send("OFF");} Light_1_stateSend=0; // 发送置于0 关闭
} // ping the server to keep the mqtt connection alive
// NOT required if you are publishing once every KEEPALIVE seconds
if(! mqtt.ping()) {
mqtt.disconnect();
} } // Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
void MQTT_connect() {
int8_t ret; // Stop if already connected.
if (mqtt.connected()) {
return;
} Serial.print("Connecting to MQTT... "); uint8_t retries = 3;
while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
Serial.println(mqtt.connectErrorString(ret));
Serial.println("Retrying MQTT connection in 3 seconds...");
mqtt.disconnect();
delay(3000); // wait 10 seconds
retries--;
if (retries == 0) {
// basically die and wait for WDT to reset me
while (1); // ESP.wdtFeed();
}
}
Serial.println("MQTT Connected!"); hass_config.publish(my_config_s.c_str());
// 内存不够大 ,一直重启 只能注册个简单的有开关功能
Serial.println(my_config_s); }

  

(二 -3-1) 天猫精灵接入Home Assistant-自动发现Mqtt设备--灯系列 esp8266程序的更多相关文章

  1. (二 -3-1) 天猫精灵接入Home Assistant-自动发现Mqtt设备--灯系列 实战

    #本片教程介绍了具体如何实现天猫精灵控制一个灯. 前提: HASS平台 你已经搭建一个可以在公网IP访问到的HASS平台--- 我用的是租了阿里云服务器,买了个域名,ubuntu1604系统 你已经搭 ...

  2. (二 -3) 天猫精灵接入Home Assistant-自动发现Mqtt设备--灯系列

    参考网站 1该mqtt光平台可以让您控制您的MQTT启用灯.它支持设置亮度,色温,效果,闪烁,开/关,RGB颜色,过渡,XY颜色和白色值. https://www.home-assistant.io/ ...

  3. (二 -4) 天猫精灵接入Home Assistant-自动发现Mqtt设备--传感器系列

    https://www.home-assistant.io/blog/2015/10/11/measure-temperature-with-esp8266-and-report-to-mqtt/ 最 ...

  4. (二 -5) 天猫精灵接入Home Assistant-自动发现Mqtt设备--电风扇

    官网:https://www.home-assistant.io/components/fan.mqtt/ 1 添加配置文件 要在安装中启用MQTT风扇,请将以下内容添加到您的configuratio ...

  5. (二 -3-3) 天猫精灵接入Home Assistant-自动发现Mqtt设备-自动生成配置信息

    http://www.hassmart.com/products/switches/#tab=config switch: - platform: mqtt name: keting state_to ...

  6. (二 -2) 天猫精灵接入Home Assistant-自动发现Mqtt设备

    参考中文教程:  https://www.hachina.io/docs/7230.html 英文官网 两个温度传感器:https://www.home-assistant.io/docs/mqtt/ ...

  7. (二 -1) 天猫精灵接入Home Assistant-控制Mqtt设备

    关于hass对接mqtt 请参考官网 https://www.hachina.io/docs/7083.html 1 登陆运行着hass的阿里云服务器 2 修改hass配置文件,添加mqtt服务信息 ...

  8. (二 -0) 天猫精灵接入Home Assistant-安装MQTT服务器

    ubuntu 1604  阿里云 学生版轻型服务器 1 安装MQTT 进入官网 http://emqtt.com/ 点击下载 找到  ubuntu 1604  右键-复制链接 粘贴办理内容是下载链接第 ...

  9. (四) 天猫精灵接入Home Assistant-ESP-WIFI模块通过mqtt协议接入HASS

    总过程 1 ESP8266上电后,初始化 连接MQTT服务器 发布自身配置信息----hass自动发现该设备 订阅hass的命令话题---接收命令 发布hass的状态话题---返回自身状态 2 ESP ...

随机推荐

  1. [Linux]lnmp一键安装包,访问yii/tp5/laravel的时候,报错500或者空白页面

    当你将默认的访问路径改后(nginx.conf中的root 之后的路径),同时应该将/home/wwwroot/default/.user.ini 中的路径也改了! .user.ini 是隐藏文件,需 ...

  2. 你用过CSS3的这个currentColor新属性吗?使用与兼容性

    currentColor顾名思意就是“当前颜色”,准确讲应该是“当前的文字颜色”,例如: .xxx { border: 1px solid currentColor; } currentColor表示 ...

  3. BZOJ1007: [HNOI2008]水平可见直线(单调栈)

    Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8638  Solved: 3327[Submit][Status][Discuss] Descripti ...

  4. 洛谷P4723 【模板】线性递推(多项式取模 线性代数)

    题意 题目链接 Sol Orz shadowice 注意,下面的代码自带O(随时TLE)倍大常数.. #include<bits/stdc++.h> #define Pair pair&l ...

  5. Spring AOP原理(续)

    十二.AOP 1. 说出Spring的通知类型有哪些? spring共提供了五种类型的通知: 通知类型 接口 描述 Around 环绕通知 org.aopalliance.intercept.Meth ...

  6. 小程序实践(二):swiper组件实现轮播图效果

    swiper组件类似于Android中的ViewPager,实现类似轮播图的效果,相对于Android的Viewpager,swiper实现起来更加方便,快捷. 效果图: 首先看下swiper支持的属 ...

  7. input range样式优化

    首先HTML代码: <input id="snrPollInterval" type="range" min="1" max=&quo ...

  8. 从文本中提取图片路径(java 解析富文本处理 img 标签)

    很多项目都需要到富文本来添加内容,就好比新闻啊,旅游景点之类的,都需要使用富文本去添加数据,然而怎么我这边就发现了两个问题 怎样将富文本的图片的 src 获取出来? 方法一: 利用正则表达式: pub ...

  9. 使用混淆ProGuard压缩代码和资源/减少方法数量

    ProGuard介绍 ProGuard是一个Java类文件压缩器,优化器,混淆器和预先文件验证器. 压缩步骤检测和删除未使用的类,字段,方法和属性. 优化步骤分析和优化方法的字节码. 混淆步骤使用短无 ...

  10. svn状态与常见错误

    TortoiseSVN 1.6.16是最后一个目录独立管理自身cache的svn版本(每个目录下都有一个隐藏的.svn文件夹) 之后的版本会则会根目录上统一进行管理(只有根目录下有一个隐藏的.svn文 ...