Noolite MTRF-32 + Arduino + Domoticz

在本文中,我描述了如何将Noolite MTRF-32模块连接到基于Domoticz的智能家居控制系统。

关于房屋本身的一些知识


我的房子是私人的。 它已经在MySensors上引入了一些基于Domoticz的智能家居和无线执行器的基础知识。

目前,已经实现了开门传感器,房屋照明,家庭和街道上的温度和湿度传感器,有关事件和天气预报的语音通知。

房子是木制的,所以我真的不想通过关闭来自中国的卷轴来控制照明。 也不能选择在任何地方拉电线。 经过深思熟虑,灯光控制已在动力装置和Noolite控制台上完成,但仍以某种方式与Domoticz成为了朋友。

此时,Noolite的有关MTRF-32模块的文章引起了我的注意。 Domoticz支持发送HTTP GET请求。 使用带有反馈的模块的前景也很诱人,因此订购了该模块。

关于切割前需要测量7次的内容


事实证明,我购买的不是您所需要的。 购买时,有一个MTRF-32模块可用。 在阅读本文时,我没有看到有关这些模块种类的信息。 通常,我需要USB版本的MTRF-32-USB。

应该澄清
32表示可以控制32个通道。 迄今为止,noolite网站上提供了具有64个通道的模块,具有带或不带USB的两个选项。 给MTRF-32读者的问题可以以某种方式更新为MTRF-64吗?

完成的工作已经完成。 披肩被推迟,直到有人安排更好的图书馆

由于某些原因,最好的时机还没有到。 尽管我认为该系统很受欢迎。

第一次尝试


访问该站点后,Noolite找到了可与MTRF-64-USB一起使用的NooliteOne软件。 事实证明,它通过一个COM端口工作,我意识到MTRF-64与带有内置USB-COM适配器的MTRF-64-USB不同。 捆绑的软件包括来自FTDI芯片的驱动程序,而我的开发板具有合适的接触垫。

我没有焊接芯片。 但是我用FTDI用中文Arduino Nano制造了一个USB-COM适配器,并将其连接到板上。

它没有起飞。 由于某些原因,NooliteOne无法找到我的适配器。 当我发现MT1132模块的时,我已经开始着眼于反编译。

第二次尝试


我比较了模块的描述,并意识到在数据传输方面,它们几乎没有区别。 对于我来说,在MT1132库中实现的功能就足够了(尚不需要反馈-没有合适的电源装置)。

在更正了库中的代码之后,我开始收到来自MTRF-32的响应。 奇怪的是,一切都在第一次生效。 这是最后发生的事情:

阿敦努
  

#ifndef ARDUNOO_H
#定义ARDUNOO_H

#如果已定义(ARDUINO)&& ARDUINO> = 100
#include“ Arduino.h”
#else
#include“ WProgram.h”
#endif

#include <SoftwareSerial.h>

ArduNoo类{

字节chnl;
ns系列软件;

公开:
ArduNoo(字节rx,字节tx,字节ch = 0);
无效(字节ch = -1);
无效(字节ch = -1);
无效的onoff(字节ch = -1);
无效绑定(字节ch = -1);
无效解除绑定(字节ch = -1);

bool命令(字节通道,字节命令);
};

#endif

Ardunoo.cpp
#include <ardunoo.h>

ArduNoo :: ArduNoo(字节RX,字节TX,字节ch):ns(RX,TX){
chnl = ch;
ns.begin(9600);
}

void ArduNoo ::关闭(字节ch){
命令(ch,0);
}

void ArduNoo :: on(字节ch){
命令(ch,2);
}

void ArduNoo :: onoff(字节ch){
命令(ch,4);
}

void ArduNoo ::解除绑定(字节ch){
命令(ch,9);
}

void ArduNoo ::绑定(字节ch){
命令(ch,15);
}

bool ArduNoo ::命令(字节chnl,字节命令){
静态字节i,r,buf [17] = {171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172);
int sum = 0;

memset(buf + 2,0,14); / *清除邮件正文* /
buf [4] = chnl;
buf [5] =命令;

对于(i = 0; i <15; ++ i){// 10
和+ = buf [i];
}
buf [15] = lowByte(sum); // 10
buf [16] = 172; // 11

对于(i = 0; i <17; ++ i){
ns.write(buf [i]);
}
//调试代码
对于(i = 0; i <17; ++ i){
while(!ns.available())延迟(10);
r = ns.read();
Serial.print®;
}
Serial.println();

返回true;
}

Ardunoo.ino
#include <SoftwareSerial.h>
#include <ardunoo.h>

#定义RXpin 10
#定义TXpin 11

ArduNoo noo(RXpin,TXpin);
字符串readString,chString;

无效设置(){
Serial.begin(9600);
}

无效循环(){
readString =“”;
chString =“”;
而(Serial.available()){
延迟(3); //延迟以允许缓冲区填充
如果(Serial.available()> 0){
char c = Serial.read(); //从串行缓冲区获取一个字节
readString + = c; //使字符串为readString
}
}
if(readString.length()> 1 && readString.length()<4){//我们期望1个字母和1或2个数字(ch = 0-31)
for(int i = 1; i <readString.length(); i ++){
如果(isDigit(readString [i])){
chString.concat(readString [i]);
}
}
//Serial.println(readString[0]);
int ch = chString.toInt();
开关(readString [0]){
情况'n'://开
noo.on(ch);
打破
情况'f'://关闭
noo.off(ch);
打破
case'x'://切换
noo.onoff(ch);
打破
案例'b'://绑定
noo.bind(ch);
打破
案例'u'://取消绑定
noo.unbind(ch);
打破
案例'y'://在所有频道上
for(int i = 0; i <32; i ++){
不(i);
延误(100);
}
打破
案例'z'://关闭所有频道
for(int i = 0; i <32; i ++){
noo.off(i);
延误(100);
}
打破
}
}
}

Zhumatiy Sergey的图书馆许可
MIT许可证(MIT)

版权所有©2014 Zhumatiy Sergey

特此授予获得副本的任何人免费的许可
软件和相关文档文件(以下简称“软件”)的交易
在软件中不受限制,包括但不限于权利
使用,复制,修改,合并,发布,分发,再许可和/或出售
本软件的副本,并允许本软件所针对的人
具备以下条件:

上述版权声明和此许可声明应包含在所有
软件的副本或实质性部分。

本软件按“原样”提供,不提供任何形式的明示或明示保证。
暗示(包括但不限于对适销性的保证),
适用于特定目的和非侵权。 在任何情况下都不会
作者或版权持有人对任何索赔,损害或其他责任
无论是由于合同,侵权或其他原因而引起的责任,
与软件或软件的使用或其他处理无关或与之有关
软件。

已实现的命令将关闭,打开,切换,全部打开,全部关闭。

事情很小,您需要向com端口提供命令。 由于这在Windows上的Domoticz中是有问题的,因此我决定编写一个控制台应用程序,该应用程序将转换lua脚本中的命令。 命令作为启动参数传递给应用程序。

noo.cs
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Text;
使用System.IO.Ports;

命名空间noo
{
班级计划
{
静态void Main(字符串[] args)
{
如果(args.Length == 2)
{
SerialPort COM =新的SerialPort(参数[0]);
COM.Open();
COM.WriteLine(args [1]);
COM.Close();
}
}
}
}

命令示例:


noo.exe com5 n4-打开通道4上的灯,将其传输到COM5端口上的Arduino板。 第二个触发器参数的可能值:

  • nX-启用通道X
  • fX-关闭频道X
  • xX-切换频道X
  • bX-将电源块绑定到通道X
  • uX-从通道X解开电源块
  • yX-启用所有通道,X任意值
  • zX-关闭所有通道,X任意值

lua脚本
本地传感器1 ='SWHallWay'
本地传感器2 ='SWHall'
本地传感器3 ='SWKitchen'
本地传感器4 ='SWBedroom'
本地传感器5 ='BTNLiteOff'
commandArray = {}
如果(devicechanged [sensor1] =='On'),则
os.execute(“ c:\\ PROGRA〜1 \\ Domoticz \\脚本\\ noo.exe com4 n3”)
结束
如果(devicechanged [sensor1] =='Off'),则
os.execute(“ c:\\ PROGRA〜1 \\ Domoticz \\脚本\\ noo.exe com4 f3”)
结束
如果(devicechanged [sensor2] =='On'),则
os.execute(“ c:\\ PROGRA〜1 \\ Domoticz \\脚本\\ noo.exe com4 n0”)
结束
如果(devicechanged [sensor2] =='Off'),则
os.execute(“ c:\\ PROGRA〜1 \\ Domoticz \\脚本\\ noo.exe com4 f0”)
结束
如果(devicechanged [sensor3] =='On'),则
os.execute(“ c:\\ PROGRA〜1 \\ Domoticz \\脚本\\ noo.exe com4 n1”)
结束
如果(devicechanged [sensor3] =='Off'),则
os.execute(“ c:\\ PROGRA〜1 \\ Domoticz \\脚本\\ noo.exe com4 f1”)
结束
如果(devicechanged [sensor4] =='On'),则
os.execute(“ c:\\ PROGRA〜1 \\ Domoticz \\脚本\\ noo.exe com4 n2”)
结束
如果(devicechanged [sensor4] =='Off'),则
os.execute(“ c:\\ PROGRA〜1 \\ Domoticz \\脚本\\ noo.exe com4 f2”)
结束
如果(devicechanged [sensor5] =='Off'),则
os.execute(“ c:\\ PROGRA〜1 \\ Domoticz \\脚本\\ noo.exe com4 z9”)
结束
返回commandArray

Domoticz底层平面图


短片

Source: https://habr.com/ru/post/zh-CN402799/


All Articles