Noolite MTRF-32 + Arduino + Domoticz

En este artículo, describo cómo conectar el módulo Noolite MTRF-32 a mi sistema de control doméstico inteligente basado en Domoticz.

Un poco sobre la casa misma


Mi casa es privada Ya ha introducido algunos rudimentos de una casa inteligente basada en Domoticz y actuadores inalámbricos en MySensors.

Por el momento, se implementan sensores de apertura de puertas, la inclusión de sensores de iluminación de la casa, temperatura y humedad en el hogar y en la calle, información de voz sobre eventos y pronósticos del tiempo.

La casa es de madera, así que realmente no quería controlar la iluminación cerrando los carretes de China. Tirar de cables a cualquier lugar tampoco es una opción. Después de mucha deliberación, el control de la luz se realizó en unidades de potencia y consolas de noolita, y de alguna manera se hizo amigo de Domoticz.

En este momento, un artículo sobre el módulo MTRF-32 de Noolite me llamó la atención. Domoticz admite el envío de solicitudes HTTP GET. La posibilidad de usar módulos con retroalimentación también hizo señas, por lo que se ordenó el módulo.

Sobre lo que necesita medir 7 veces antes de cortar


Resultó que no compré exactamente lo que necesitas. En el momento de la compra, un módulo MTRF-32 estaba disponible. Y mientras leía el artículo, no vi información sobre las variedades de estos módulos. En general, necesitaba una versión USB del MTRF-32-USB.

Debe aclarar
32 significa la capacidad de controlar más de 32 canales. Hasta la fecha, un módulo con 64 canales está disponible en el sitio web de noolite, con ambas opciones con o sin USB. Pregunta a los lectores de MTRF-32 de alguna manera se puede actualizar a MTRF-64?

Lo hecho, hecho está. El chal fue pospuesto hasta que alguien presentara la biblioteca terminada de tiempos mejores.

Por alguna razón, los mejores tiempos no han llegado. Aunque pensé que el sistema era popular.

Primer intento


Después de visitar el sitio, Noolite encontró el software NooliteOne para trabajar con el MTRF-64-USB. Resultó que funciona a través de un puerto com y me di cuenta de que MTRF-64 difiere de MTRF-64-USB con un adaptador USB-COM incorporado. El software incluido incluía controladores del chip FTDI, y mi placa tenía una almohadilla de contacto adecuada.

No solde el chip. Pero hice un adaptador USB-COM del chino Arduino Nano con FTDI y lo conecté a la placa.

No despegó. Por alguna razón, NooliteOne no pudo encontrar mi adaptador. Ya comencé a buscar la compilación cuando descubrí la biblioteca para el módulo MT1132.

Segundo intento


Comparé la descripción de los módulos y me di cuenta de que, en términos de transferencia de datos, casi no difieren. La funcionalidad implementada en la biblioteca para MT1132 fue suficiente para mí (todavía no se necesita retroalimentación, no hay unidades de potencia adecuadas).

Después de corregir el código en la biblioteca, comencé a recibir respuestas de MTRF-32. Por extraño que parezca, todo funcionó la primera vez. Y esto es lo que sucedió al final:

Ardunoo.H
  

#ifndef ARDUNOO_H
#define ARDUNOO_H

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

#include <SoftwareSerial.h>

clase ArduNoo {

byte chnl;
Software Serial ns;

público:
ArduNoo (byte rx, byte tx, byte ch = 0);
vacío en (byte ch = -1);
vacío (byte ch = -1);
apagado onoff (byte ch = -1);
enlace vacío (byte ch = -1);
anular desvinculación (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);
}

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

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

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

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

bool ArduNoo :: command (byte chnl, byte command) {
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 suma = 0;

memset (buf + 2,0,14); / * borrar cuerpo del mensaje * /
buf [4] = chnl;
buf [5] = comando;

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

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

volver verdadero;
}

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

#define RXpin 10
#define TXpin 11

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

configuración nula () {
Serial.begin (9600);
}

bucle vacío () {
readString = "";
chString = "";
while (Serial.available ()) {
retraso (3); // retraso para permitir que el búfer se llene
if (Serial.available ()> 0) {
char c = Serial.read (); // obtiene un byte del búfer en serie
readString + = c; // hace que la cadena sea readString
}
}
if (readString.length ()> 1 && readString.length () <4) {// esperamos 1 letra y 1 o 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': // on
noo.on (ch);
romper
case 'f': // off
noo.off (ch);
romper
case 'x': // alternar
noo.onoff (ch);
romper
caso 'b': // enlace
noo.bind (ch);
romper
case 'u': // desvincular
noo.unbind (ch);
romper
case 'y': // en todos los canales
para (int i = 0; i <32; i ++) {
noo.on (i);
retraso (100);
}
romper
case 'z': // off todos los canales
para (int i = 0; i <32; i ++) {
noo.off (i);
retraso (100);
}
romper
}
}
}

Licencia de biblioteca por Zhumatiy Sergey
La licencia MIT (MIT)

Copyright © 2014 Zhumatiy Sergey

Por la presente se otorga permiso, sin cargo, a cualquier persona que obtenga una copia
de este software y los archivos de documentación asociados (el "Software"), para tratar
en el Software sin restricción, incluidos, entre otros, los derechos
para usar, copiar, modificar, fusionar, publicar, distribuir, sublicenciar y / o vender
copias del Software y para permitir a las personas a quienes pertenece el Software
amueblado para hacerlo, sujeto a las siguientes condiciones:

El aviso de copyright anterior y este aviso de permiso se incluirán en todos
copias o porciones sustanciales del Software.

EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O
IMPLÍCITO, INCLUYENDO PERO NO LIMITADO A LAS GARANTÍAS DE COMERCIABILIDAD,
APTITUD PARA UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO EL
LOS AUTORES O LOS TITULARES DE LOS DERECHOS DE AUTOR SERÁN RESPONSABLES POR CUALQUIER RECLAMACIÓN, DAÑO U OTRO
RESPONSABILIDAD, EN CASO DE ACCIÓN DE CONTRATO, TORTURA O DE OTRA MANERA, DERIVADA DE,
FUERA DE O EN CONEXIÓN CON EL SOFTWARE O EL USO U OTRAS OFERTAS EN EL
SOFTWARE

Los comandos implementados son apagar, encender, cambiar, encender todo, apagar todo.

La cosa es pequeña, debe dar comandos al puerto com. Como esto es problemático desde Domoticz en Windows, decidí escribir una aplicación de consola que traduzca los comandos del script lua. Los comandos se pasan a la aplicación como parámetros de inicio.

noo.cs
utilizando el sistema;
usando System.Collections.Generic;
usando System.Linq;
usando System.Text;
utilizando System.IO.Ports;

espacio de nombres noo
{
programa de clase
{
vacío estático Main (string [] args)
{
if (args.Length == 2)
{
SerialPort COM = nuevo SerialPort (args [0]);
COM.Open ();
COM.WriteLine (args [1]);
COM.Close ();
}
}
}
}

Ejemplo de comando:


noo.exe com5 n4: enciende la luz en el canal 4, transmitida a la placa Arduino en el puerto COM5. Posibles valores del segundo parámetro de activación:

  • nX: habilita el canal X
  • fX - apaga el canal X
  • xX - cambiar de canal X
  • bX: une el bloque de alimentación al canal X
  • uX: desata el bloque de alimentación del canal X
  • yX: habilita todos los canales, X cualquier valor
  • zX: apaga todos los canales, X cualquier valor

lua script
sensor local1 = 'SWHallWay'
sensor2 local = 'SWHall'
sensor local3 = 'SWKitchen'
sensor local4 = 'SWBedroom'
sensor local5 = 'BTNLiteOff'
commandArray = {}
if (devicechanged [sensor1] == 'On') entonces
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 n3")
fin
if (devicechanged [sensor1] == 'Off') entonces
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 f3")
fin
if (devicechanged [sensor2] == 'On') entonces
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 n0")
fin
if (devicechanged [sensor2] == 'Off') entonces
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 f0")
fin
if (devicechanged [sensor3] == 'On') entonces
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 n1")
fin
if (devicechanged [sensor3] == 'Off') entonces
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 f1")
fin
if (devicechanged [sensor4] == 'On') entonces
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 n2")
fin
if (devicechanged [sensor4] == 'Off') entonces
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 f2")
fin
if (devicechanged [sensor5] == 'Off') entonces
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 z9")
fin
comando de retorno

Planta baja en Domoticz


Video corto

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


All Articles