Noolite MTRF-32 + Arduino + Domoticz

Neste artigo, descrevo como conectar o módulo Noolite MTRF-32 ao meu sistema de controle doméstico inteligente baseado em Domoticz.

Um pouco sobre a própria casa


Minha casa é particular. Ele já introduziu alguns rudimentos de atuadores domésticos e sem fio inteligentes baseados em Domoticz nos MySensors.

No momento, são implementados sensores de abertura de porta, inclusão de sensores de iluminação da casa, temperatura e umidade em casa e na rua, voz informando sobre eventos e previsões do tempo.

A casa é de madeira, então eu realmente não queria controlar a iluminação fechando os rolos da China. Puxar os fios para qualquer lugar também não é uma opção. Depois de muita deliberação, o controle da luz foi feito em unidades de energia e consoles noolites e restava apenas fazer amizade com Domoticz de alguma forma.

Neste momento, um artigo sobre o módulo MTRF-32 da Noolite chamou minha atenção. O Domoticz suporta o envio de solicitações HTTP GET. A perspectiva de usar módulos com feedback também acenou, então o módulo foi encomendado.

Sobre o que você precisa medir 7 vezes antes de cortar


Como se viu, eu comprei não exatamente o que você precisa. No momento da compra, um módulo MTRF-32 estava disponível. E ao ler o artigo, não vi informações sobre as variedades desses módulos. Em geral, eu precisava de uma versão USB do MTRF-32-USB.

Deve esclarecer
32 significa a capacidade de controlar mais de 32 canais. Até o momento, um módulo com 64 canais está disponível no site noolite, com as duas opções com ou sem USB. As perguntas aos leitores do MTRF-32 podem, de alguma forma, ser atualizadas para o MTRF-64?

O que está feito está feito. O xale foi adiado até que alguém arrumasse a biblioteca pronta dos melhores tempos.

Por alguma razão, tempos melhores não chegaram. Embora eu pensasse que o sistema era popular.

Primeira tentativa


Depois de visitar o site, a Noolite encontrou o software NooliteOne para trabalhar com o MTRF-64-USB. Aconteceu que ele funciona através de uma porta de comunicação e percebi que o MTRF-64 difere do MTRF-64-USB com um adaptador USB-COM embutido. O software incluído incluía drivers do chip FTDI e minha placa possuía um bloco de contato adequado.

Não soldei o chip. Mas fiz um adaptador USB-COM do chinês Arduino Nano com FTDI e conectei-o à placa.

Não decolou. Por alguma razão, o NooliteOne não conseguiu encontrar meu adaptador. Eu já comecei a procurar compilação quando descobri a biblioteca para o módulo MT1132.

Segunda tentativa


Comparei a descrição dos módulos e percebi que, em termos de transferência de dados, eles quase não diferem. A funcionalidade implementada na biblioteca do MT1132 foi suficiente para mim (o feedback ainda não é necessário - não há unidades de energia adequadas).

Depois de corrigir o código na biblioteca, comecei a receber respostas do MTRF-32. Curiosamente, tudo funcionou da primeira vez. E aqui está o que aconteceu no final:

Ardunoo.H
  

#ifndef ARDUNOO_H
#define ARDUNOO_H

#if definido (ARDUINO) && ARDUINO> = 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif

#include <SoftwareSerial.h>

classe ArduNoo {

byte chnl;
SoftwareSerial ns;

público:
ArduNoo (byte rx, byte tx, byte ch = 0);
nulo (byte ch = -1);
anular (byte ch = -1);
anular onoff (byte ch = -1);
ligação vazia (byte ch = -1);
anular a ligação (byte ch = -1);

comando bool (canal de bytes, comando de bytes);
};

#endif

Ardunoo.cpp
#include <ardunoo.h>

ArduNoo :: ArduNoo (byte rx, byte tx, byte ch): ns (rx, tx) {
chnl = ch;
ns.begin (9600);
}

void ArduNoo :: off (byte ch) {
comando (ch, 0);
}

void ArduNoo :: on (byte ch) {
comando (ch, 2);
}

void ArduNoo :: onoff (byte ch) {
comando (ch, 4);
}

void ArduNoo :: unbind (byte ch) {
comando (cap. 9);
}

void ArduNoo :: bind (byte ch) {
comando (cap, 15);
}

bool ArduNoo :: command (byte chnl, comando byte) {
byte estático 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 soma = 0;

memset (buf + 2,0,14); / * limpar corpo da mensagem * /
buf [4] = chnl;
buf [5] = comando;

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

para (i = 0; i <17; ++ i) {
ns.write (buf [i]);
}
// código de depuração
para (i = 0; i <17; ++ i) {
while (! ns.available ()) delay (10);
r = ns.read ();
Serial.print®;
}
Serial.println ();

return true;
}

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

#define RXpin 10
#define TXpin 11

ArduNoo noo (RXpin, TXpin);
String readString, chString;

configuração nula () {
Serial.begin (9600);
}

loop vazio () {
readString = "";
chString = "";
while (Serial.available ()) {
atraso (3); // demora para permitir que o buffer seja preenchido
if (Serial.available ()> 0) {
char c = Serial.read (); // obtém um byte do buffer serial
readString + = c; // torna a string readString
}
}
if (readString.length ()> 1 && readString.length () <4) {// esperamos 1 letra e 1 ou 2 dígitos (ch = 0-31)
for (int i = 1; i <readString.length (); i ++) {
if (isDigit (readString [i])) {
chString.concat (readString [i]);
}
}
//Serial.println(readString[0]);
int ch = chString.toInt ();
switch (readString [0]) {
case 'n': // em
no (ch);
quebrar;
case 'f': // desativado
noo.off (ch);
quebrar;
case 'x': // alterna
noo.onoff (ch);
quebrar;
case 'b': // bind
noo.bind (ch);
quebrar;
case 'u': // desvincular
noo.unbind (ch);
quebrar;
case 'y': // em todos os canais
for (int i = 0; i <32; i ++) {
no (i);
atraso (100);
}
quebrar;
case 'z': // fora de todos os canais
for (int i = 0; i <32; i ++) {
noo.off (i);
atraso (100);
}
quebrar;
}
}
}

Licença de biblioteca por Zhumatiy Sergey
A licença do MIT (MIT)

Direitos autorais © 2014 Zhumatiy Sergey

É concedida permissão, gratuitamente, a qualquer pessoa que obtenha uma cópia
deste software e arquivos de documentação associados (o "Software"), para lidar
no Software sem restrição, incluindo, sem limitação, os direitos
usar, copiar, modificar, mesclar, publicar, distribuir, sublicenciar e / ou vender
cópias do Software e permitir pessoas a quem o Software está
mobilado para fazê-lo, sujeito às seguintes condições:

O aviso de direitos autorais acima e este aviso de permissão devem ser incluídos em todos
cópias ou partes substanciais do Software.

O SOFTWARE É FORNECIDO "TAL COMO ESTÁ", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU
IMPLÍCITA, INCLUINDO MAS NÃO SE LIMITANDO A GARANTIAS DE COMERCIALIZAÇÃO,
APTIDÃO PARA UM OBJETIVO ESPECÍFICO E NÃO INFRACÇÃO. EM NENHUM CASO A
AUTORES OU TITULARES DE DIREITOS AUTORAIS SÃO RESPONSÁVEIS POR QUALQUER REIVINDICAÇÃO, DANOS OU OUTROS
RESPONSABILIDADE, SEJA EM AÇÃO DE CONTRATO, TORT OU DE OUTRA FORMA, DECORRENTE DE,
FORA OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTROS NEGÓCIOS NO
SOFTWARE.

Os comandos implementados são desligar, ligar, ligar, ligar tudo, desligar tudo.

A coisa é pequena, você precisa dar comandos para a porta de comunicação. Como isso é problemático do Domoticz no Windows, decidi escrever um aplicativo de console que traduzirá comandos do script lua. Os comandos são passados ​​para o aplicativo como parâmetros de inicialização.

noo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;

namespace noo
{
programa de aula
{
static void Main (string [] args)
{
if (args.Length == 2)
{
SerialPort COM = novo SerialPort (args [0]);
COM.Open ();
COM.WriteLine (args [1]);
COM.Close ();
}
}
}
}

Exemplo de comando:


noo.exe com5 n4 - acenda a luz no canal 4, ela é transmitida para a placa Arduino na porta COM5. Valores possíveis do segundo parâmetro de disparo:

  • nX - ativar canal X
  • fX - desativa o canal X
  • xX - alternar canal X
  • bX - ligue o bloco de energia ao canal X
  • uX - desatar o bloco de força do canal X
  • yX - ativar todos os canais, X qualquer valor
  • zX - desligue todos os canais, X qualquer valor

roteiro lua
local sensor1 = 'SWHallWay'
local sensor2 = 'SWHall'
local sensor3 = 'SWKitchen'
local sensor4 = 'SWBedroom'
local sensor5 = 'BTNLiteOff'
commandArray = {}
if (devicechanged [sensor1] == 'On') então
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 n3")
fim
if (devicechanged [sensor1] == 'Off') então
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 f3")
fim
if (devicechanged [sensor2] == 'On') então
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 n0")
fim
if (devicechanged [sensor2] == 'Off') então
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 f0")
fim
if (devicechanged [sensor3] == 'On') então
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 n1")
fim
if (devicechanged [sensor3] == 'Off') então
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 f1")
fim
if (devicechanged [sensor4] == 'On') então
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 n2")
fim
if (devicechanged [sensor4] == 'Off') então
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 f2")
fim
if (devicechanged [sensor5] == 'Off') então
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 z9")
fim
return commandArray

Planta térrea em Domoticz


Vídeo curto

Source: https://habr.com/ru/post/pt402799/


All Articles