Dans cet article, je décris comment connecter le module Noolite MTRF-32 à mon système de contrôle domotique intelligent basé sur Domoticz.
Un peu sur la maison elle-même
Ma maison est privée. Il a déjà introduit quelques rudiments d'une maison intelligente basée sur Domoticz et des actionneurs sans fil sur MySensors.
À l'heure actuelle, des capteurs d'ouverture de porte, l'intégration de l'éclairage de la maison, des capteurs de température et d'humidité à la maison et dans la rue, des informations vocales sur les événements et les prévisions météorologiques sont mises en œuvre.
La maison est en bois, donc je ne voulais pas vraiment contrôler l'éclairage en fermant les bobines de Chine. Tirer les fils n'importe où n'est pas non plus une option. Après de nombreuses délibérations, le contrôle de la lumière a été effectué sur les unités de puissance et les consoles Noolite et il restait à se lier d'amitié avec Domoticz.
À ce moment,
un article sur le module MTRF-32 de Noolite a attiré mon attention. Domoticz prend en charge l'envoi de requêtes HTTP GET. La perspective d'utiliser des modules avec rétroaction a également fait signe, alors le module a été commandé.
À propos de ce que vous devez mesurer 7 fois avant de couper
Il s'est avéré que je n'ai pas acheté tout à fait ce dont vous avez besoin. Au moment de l'achat, un module MTRF-32 était disponible. Et en lisant l'article, je n'ai pas vu d'informations sur les variétés de ces modules. En général, j'avais besoin d'une version USB du MTRF-32-USB.
Devrait clarifier32 signifie la possibilité de contrôler plus de 32 canaux. A ce jour, un module de 64 canaux est disponible sur le site de noolite, avec les deux options avec ou sans USB. Question aux lecteurs de MTRF-32 peut en quelque sorte être mis à jour vers MTRF-64?
Ce qui est fait est fait. Le châle a été reporté jusqu'à ce que
quelqu'un ait aménagé
la bibliothèque terminée des temps meilleurs.
Pour une raison quelconque, les meilleurs moments ne sont pas venus. Même si je pensais que le système était populaire.
Première tentative
Après avoir visité le site, Noolite a trouvé le logiciel NooliteOne pour travailler avec le MTRF-64-USB. Il s'est avéré que cela fonctionne via un port com et j'ai réalisé que le MTRF-64 diffère du MTRF-64-USB avec un adaptateur USB-COM intégré. Le logiciel fourni comprenait des pilotes de la puce FTDI, et ma carte avait un pavé de contact approprié.
Je n'ai pas soudé la puce. Mais j'ai fabriqué un adaptateur USB-COM à partir de l'Arduino Nano chinois avec FTDI et je l'ai connecté à la carte.
Ça n'a pas décollé. Pour une raison quelconque, NooliteOne n'a pas pu trouver mon adaptateur. J'ai déjà commencé à regarder vers la compilation lorsque j'ai découvert la
bibliothèque du module MT1132.
Deuxième tentative
J'ai comparé la description des modules et j'ai réalisé qu'en termes de transfert de données, ils ne diffèrent presque pas. La fonctionnalité implémentée dans la bibliothèque pour MT1132 était suffisante pour moi (le feedback n'est pas encore nécessaire - il n'y a pas de blocs d'alimentation appropriés).
Après avoir corrigé le code dans la bibliothèque, j'ai commencé à recevoir des réponses de MTRF-32. Curieusement, tout a fonctionné la première fois. Et voici ce qui s'est finalement passé:
Ardunoo.H
#ifndef ARDUNOO_H
#define ARDUNOO_H
#si défini (ARDUINO) && ARDUINO> = 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include <SoftwareSerial.h>
classe ArduNoo {
byte chnl;
SoftwareSerial ns;
public:
ArduNoo (octet rx, octet tx, octet ch = 0);
vide sur (octet ch = -1);
void off (octet ch = -1);
void onoff (octet ch = -1);
void bind (octet ch = -1);
annuler la liaison (octet ch = -1);
commande bool (canal d'octets, commande d'octets);
};
#endif
Ardunoo.cpp#include <ardunoo.h>
ArduNoo :: ArduNoo (octet rx, octet tx, octet ch): ns (rx, tx) {
chnl = ch;
ns.begin (9600);
}
void ArduNoo :: off (octet ch) {
commande (ch, 0);
}
void ArduNoo :: on (octet ch) {
commande (ch, 2);
}
void ArduNoo :: onoff (octet ch) {
commande (ch, 4);
}
void ArduNoo :: unbind (octet ch) {
commande (ch, 9);
}
void ArduNoo :: bind (octet ch) {
commande (ch, 15);
}
bool ArduNoo :: command (octet chnl, octet commande) {
octet statique i, r, buf [17] = {171,0,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); / * corps du message clair * /
buf [4] = chnl;
buf [5] = commande;
pour (i = 0; i <15; ++ i) {// 10
somme + = buf [i];
}
buf [15] = lowByte (sum); // 10
buf [16] = 172; // 11
pour (i = 0; i <17; ++ i) {
ns.write (buf [i]);
}
// code de débogage
pour (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;
void setup () {
Serial.begin (9600);
}
boucle vide () {
readString = "";
chString = "";
while (Serial.available ()) {
retard (3); // délai pour permettre au tampon de se remplir
if (Serial.available ()> 0) {
char c = Serial.read (); // obtient un octet du tampon série
readString + = c; // rend la chaîne readString
}
}
if (readString.length ()> 1 && readString.length () <4) {// nous attendons 1 lettre et 1 ou 2 chiffres (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': // le
noo.on (ch);
casser;
cas 'f': // off
noo.off (ch);
casser;
cas 'x': // bascule
noo.onoff (ch);
casser;
cas 'b': // bind
noo.bind (ch);
casser;
cas 'u': // dissocier
noo.unbind (ch);
casser;
case 'y': // sur tous les canaux
pour (int i = 0; i <32; i ++) {
noo.on (i);
retard (100);
}
casser;
case 'z': // sur tous les canaux
pour (int i = 0; i <32; i ++) {
noo.off (i);
retard (100);
}
casser;
}
}
}
Licence de bibliothèque par Zhumatiy SergeyLa licence MIT (MIT)
Copyright © 2014 Zhumatiy Sergey
La permission est accordée, sans frais, à toute personne obtenant une copie
de ce logiciel et des fichiers de documentation associés (le "Logiciel"), pour traiter
dans le Logiciel sans restriction, y compris sans limitation les droits
utiliser, copier, modifier, fusionner, publier, distribuer, sous-licencier et / ou vendre
des copies du Logiciel et pour permettre aux personnes à qui le Logiciel est
fourni à cet effet, sous réserve des conditions suivantes:
L'avis de droit d'auteur ci-dessus et cet avis d'autorisation doivent être inclus dans tous les
copies ou parties substantielles du Logiciel.
LE LOGICIEL EST FOURNI «TEL QUEL», SANS GARANTIE D'AUCUNE SORTE, EXPRESSE OU
IMPLICITE, Y COMPRIS, MAIS SANS S'Y LIMITER, LES GARANTIES DE QUALITÉ MARCHANDE,
ADAPTATION À UN USAGE PARTICULIER ET NON-CONTREFAÇON. EN AUCUN CAS, LE
LES AUTEURS OU LES DÉTENTEURS DE DROITS D'AUTEUR SONT RESPONSABLES DE TOUTES RÉCLAMATIONS, DOMMAGES OU AUTRES
RESPONSABILITÉ, QUE CE SOIT DANS UNE ACTION DE CONTRAT, TORT OU AUTRE, DÉCOULANT DE,
HORS OU EN LIEN AVEC LE LOGICIEL OU L'UTILISATION OU AUTRES OPÉRATIONS DANS LE
LOGICIEL.
Les commandes implémentées sont désactiver, activer, basculer, tout activer, tout désactiver.
La chose est petite, vous devez donner des commandes au port com. Comme cela pose problème depuis Domoticz sous Windows, j'ai décidé d'écrire une application console qui traduira les commandes du script lua. Les commandes sont transmises à l'application en tant que paramètres de lancement.
noo.csen utilisant le système;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
espace de noms noo
{
programme de classe
{
statique void Main (chaîne [] args)
{
if (args.Length == 2)
{
SerialPort COM = nouveau SerialPort (args [0]);
COM.Open ();
COM.WriteLine (args [1]);
COM.Close ();
}
}
}
}
Exemple de commande:
noo.exe com5 n4 - allumez la lumière sur le canal 4, elle est transmise à la carte Arduino sur le port COM5. Valeurs possibles du deuxième paramètre de déclenchement:
- nX - active le canal X
- fX - désactiver le canal X
- xX - changer de canal X
- bX - lier le bloc d'alimentation au canal X
- uX - détache le bloc d'alimentation du canal X
- yX - active tous les canaux, X n'importe quelle valeur
- zX - désactiver tous les canaux, X n'importe quelle valeur
lua scriptcapteur local1 = 'SWHallWay'
capteur local2 = 'SWHall'
capteur local3 = 'SWKitchen'
capteur local4 = 'SWBedroom'
capteur local5 = 'BTNLiteOff'
commandArray = {}
if (devicechanged [sensor1] == 'On') alors
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 n3")
fin
if (devicechanged [sensor1] == 'Off') alors
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 f3")
fin
if (devicechanged [sensor2] == 'On') alors
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 n0")
fin
if (devicechanged [sensor2] == 'Off') alors
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 f0")
fin
if (devicechanged [sensor3] == 'On') alors
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 n1")
fin
if (devicechanged [sensor3] == 'Off') alors
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 f1")
fin
if (devicechanged [sensor4] == 'On') alors
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 n2")
fin
if (devicechanged [sensor4] == 'Off') alors
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 f2")
fin
if (devicechanged [sensor5] == 'Off') alors
os.execute ("c: \\ PROGRA ~ 1 \\ Domoticz \\ scripts \\ noo.exe com4 z9")
fin
return commandArray
Plan du rez-de-chaussée à Domoticz Courte
vidéo