基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验

DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验

  • 一个简单MySensors客户端的验证实验
    • 一、硬件和IDE
    • 二、客户端源代码
      • 1、实验要达到的目标
      • 2、源码
    • 三、在domoticz平台上配置接入MySensors网关(即前篇介绍的DIY网关)
    • 四、使用MySensors客户端来跟domoticz通信
      • 1、给客户端设备上电
      • 2、在dototicz平台查看MySensors的网关接收到的传感器节点介绍信息
      • 3、在domoticz上添加一个MySensors设备
    • 总结

一个简单MySensors客户端的验证实验

本文在前面一篇的基础上,利用两套wifi+RF模块来进行无线通信,通过domoticz来控制。
一套作为网关(Gateway),另一套作为客户端。
本文重点在客户端的源代码编写和domoticz平台的使用。

一、硬件和IDE

本文所述客户端的硬件跟前面一片文章的网关的硬件是一模一样的,用相同的ESP8266模块和NRF24L01+模块,线路接法也一样。
请参考:
https://blog.csdn.net/sqshining/article/details/87459032#_31

IDE也是使用Arduino,跟上一篇一样,需要安装有MySensors库,请参考上一篇文章。

二、客户端源代码

1、实验要达到的目标

本次实验,是用代码模拟一个继电器的控制器设备,定时每隔10秒钟,更变到跟当前相反的状态,并随时受domoticz平台的控制。

2、源码

我们借用Arduino上的MySensors库给的样例代码,在此基础上做修改。

打开Arduino,文件–>示例 第三方库示例–>MySensors–>RelayActuator,如下图:
基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验_第1张图片
把它另存为一个新的工程。

在那份代码基础上修改成如下:

// Enable debug prints to serial monitor
#define MY_DEBUG

// Enable and select radio type attached
#define MY_RADIO_RF24


#include 

#define RELAY_ON 1  // 继电器吸合
#define RELAY_OFF 0 // 继电器断开

#define CHILD_ID_RELAY 1 //继电器在本无线节点上的设备ID号
MyMessage msgContacteur(CHILD_ID_RELAY, V_STATUS); //发送的消息,V_STATUS代表可以发二值消息,具体可以参考MySensors官方网站对它的定义

static os_timer_t relay_update_timer;//为定时更新状态定义一个系统定时器
static bool ReLayStatus = false; //记录继电器当前的状态

void RF24Send_Test_Task_Run(void *)
{
    ReLayStatus = ReLayStatus ?false :true;
    send( msgContacteur.set( ReLayStatus ? "1" : "0" ) );//向网关发送消息,如果ReLayStatus为true发送“1”,否则发送“0”
}
void setup()
{
  Serial.begin(115200); 
  os_timer_disarm( &relay_update_timer );//关闭定时器
  os_timer_setfn( &relay_update_timer, (ETSTimerFunc *) ( RF24Send_Test_Task_Run ), NULL );//为定时器设置回调函数RF24Send_Test_Task_Run
  os_timer_arm( &relay_update_timer, 10000, true );// 启动该定时器,定时10秒
}

//发送介绍信息
void presentation()
{
	// Send the sketch version information to the gateway and Controller
	sendSketchInfo("Relay_Test", "1.0");//发送sketch版本信息和相关信息到网关。是梗概性的信息,不是必需的。
	present(CHILD_ID_RELAY, S_BINARY);//发送介绍性的信息到网关。这个实际上会向网关申请注册设备ID号和传感器的类型。
}


void loop()
{

}

//接受消息,这个是在MySensors库中去调用的。定义了之后就会被调用,否则就不会调用。
void receive(const MyMessage &message)
{
  // We only expect one type of message from controller. But we better check anyway.
    if( message.sensor == CHILD_ID_RELAY )//如果消息中的ID号是我们所需匹配的CHILD_ID_RELAY
    {   
        if( message.type == V_STATUS )//消息的类型是二值类型
        {
            Serial.print("Incoming change for sensor:");
            Serial.print(message.sensor);
            Serial.print(", New status: ");
            ReLayStatus = message.getBool();//读取消息值,并更新记录
            Serial.println(ReLayStatus);
        }
    }
}

编译之后烧录到ESP8266模块中。

注意下载的时候,选对客户端的串口号!

本人的是COM12。

三、在domoticz平台上配置接入MySensors网关(即前篇介绍的DIY网关)

进入domoticz服务器主页,然后在右上角,设置–>硬件:
基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验_第2张图片
更改下图画圈的部分:
基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验_第3张图片

设置如下:
基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验_第4张图片
名称本人填的的是“NRF24 MySensors 网关”,这个名称是网关节点的名称,这里和下面的“Topic Prefix”设置项有关,如果“Topic Prefix”使用MyMQTT(defual)的选项,那么这里可以随便填,否则的话,这里的名字将作为MQTT消息收发的前缀使用。
类型这里,去选“MySensors Gateway with MQTT interface”,即通过MQTT协议接口的MySensors网关。
远端地址是要填你的MQTT Broker 的IP,因为我的domoticz和MQTT boker都在同一个arm开发板上,所以,就可以是用本地ip。
端口,一般默认1883,这个参数在domoticz的配置中所设定的,可以在配置中去修改修改之后,domoticz默认使用的MQTT端口都将改变。我们这里先不用改。

Topic Prefix(MQTT消息话题前缀)这个选项中,我们使用MyMQTT(默认值)。
这个是domoticz将使用"domoticz/out/MyMQTT"和"domoticz/in/MyMQTT"来发送和接收MQTT broker的消息来跟我们的网关进行通信。
这个地方和上一篇的代码修改有关系。

设置好之后,点下面的“增加”。

可以看到:
基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验_第5张图片

现在,给前篇DIY的那个网关上电,用串口观察消息:
基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验_第6张图片

可以看到MySensors网关跟domoticz已经有消息收发了。
点击domoticz上这个网关的设置:
基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验_第7张图片
可以看到:
基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验_第8张图片

点Nodes 的 ID号为0的那一个行,可以看到:

基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验_第9张图片

这个Node ID为0 的设备,就是网关本身的ID,也就是说网关的ID为0。
所以,我们使用MySensors开发自己的无线客户端的时候,ID号不可以为0,否则你这个无线设备就被定义成了网关。

那么网关的这个孩子ID为255的ID,实际上是用来广播消息的。
所以,我们使用MySensors开发自己的无线客户端的时候,ID号也不可以为255。
在MySensors协议中,每个设备节点,都是有这个基本的子ID。
所以,每个节点可用的子ID数目为254个

四、使用MySensors客户端来跟domoticz通信

1、给客户端设备上电

连接这个客户端的RF24模块,串口可以看到:
基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验_第10张图片

网关那边的信息如下:
基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验_第11张图片

后面我们可能会详细研究这些信息代表的含义。
暂时不去研究。

2、在dototicz平台查看MySensors的网关接收到的传感器节点介绍信息

在上面那个domoticz界面上刷新一下,也就是,设置->硬件,
然后在网关那个ID行,点“设置”,可以看到我们在代码中所发送的所谓的介绍(presentation)信息:

基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验_第12张图片
点进去:

基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验_第13张图片

3、在domoticz上添加一个MySensors设备

在domoticz界面上点 设置–>设备:
基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验_第14张图片
可以看到,平台已经自动搜索到这个设备了,右边有个绿色的向右箭头,这个是还没有添加到domoticz的意思,点它可以添加这个设备,添加好之后它就变成了蓝色向左的箭头,我们点击它
基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验_第15张图片
可以看到设备添加界面:
基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验_第16张图片
名称可以随便起,默认作为主设备,填好之后,下面那个“设为使用”按钮。
然后可以看到成了这样:
基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验_第17张图片
然后,在domoticz上,点菜单栏中的“开关”,就可以看到这个设备了:

基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验_第18张图片
会看到RF24继电器1会自动的亮、灭。
现在我们点击一下这个开关,看网关和客户端如何反应:

网关发了一条信息:
基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验_第19张图片
串口的Log是“TSF:MSG:SEND,0-0-1-1,s=1,c=1,t=2,pt=0,l=1,sg=0,ft=0,st=OK:0”
可以去这个网站解析一下这个LOG:
https://www.mysensors.org/build/parser
我们暂时不解读。

客户端串口消息如下:
基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验_第20张图片
客户端Log消息:
“219448 TSF:MSG:READ,0-0-1,s=1,c=1,t=2,pt=0,l=1,sg=0:0”
可以看到我们程序中设定的更新状态已经能执行了。
多点几次,可以看到:
基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验_第21张图片
当然除了在domoticz上手动改变继电器的状态之外,我们还在程序上定时自动更改了。
到这里,实验做完了。

总结

我们这次实验,是验证这个MySensors的库和上次DIY的网关运行过程,和domoticz平台的通信以及如何使用domoticz添加传感器设备,如何控制这个设备。

现在已经验证了这个过程。
以后,我们会用这个网关搭配其他的MySensors设备来做智能家居系统。

MySensors这个库主要是用在了Arduino这个IDE上,当然,这个库还可以用在Linux上。

我把它的设备端核心代码用C改写过了一下,这样可以用在更多的平台上,相关代码还有待改进,以后有机会再发布吧。

使用Arduino和MySensors可以快速的开发一个传感器设备出来,还是非常方便的。
当然,本次实验,用ESP8266作为CPU,有点浪费了,大材小用。
只是做实验之用。

你可能感兴趣的:(物联网与MQTT,智能家居)