¿Cómo conecté el intercomunicador Vizit a mqtt?

Buen dia a todos. El primero de enero, no hay nada que hacer, así que decidí lanzar el artículo sobre los Giktayms. En relación con el traslado a otro apartamento, existía una opción como un portero automático. Todo estaría bien, pero correr y abrir la puerta a todos los que vinieron fue muy molesto, y dado que los teléfonos, tabletas y computadoras siempre están a poca distancia, solo se acercan, se decidió conectar este beneficio al sistema de automatización iobroker que ya está en funcionamiento. A continuación describiré lo que sucedió con esto. Me

dieron una paliza por lo que estaba debajo de mis pies . Como resultado, todo esto se ve así.

imagen

Como ya tengo un maravilloso sistema de automatización de iobroker, se decidió conectarlo para la posibilidad de una gestión centralizada y la configuración de los cambios de comportamiento en una sola interfaz. Es hora de elegir cómo se comunican el hierro y el sistema general. Eso simplemente no se me ocurrió como un protocolo de intercambio desde la emulación de 1wire para obtener solicitudes, como resultado, el protocolo mqtt ganó como el más conveniente en mi visión de la situación, y el intercambio entre la pieza de hierro y el iobroker se implementó en él.

En la tableta, parece una pestaña con la pantalla de la cámara actual y el control de la

imagen

primera parte de la plancha. Se compone de arduino uno, escudos de ethernet y un pequeño circuito coincidente con una línea de intercomunicación. El esquema en sí:

imagen

Aquí todo es simple, la llamada entrante es monitoreada por el optoacoplador y al recibirla simplemente presiona el pie cero del arduino. La apertura de la puerta se implementa en el relé en el estado normal, siempre está cerrada, cuando se recibe un comando de iobroker (presionaron un botón en la interfaz, automáticamente de acuerdo con la condición en el script, se recibió un comando de un telegrama), rompe la línea durante 7.5 segundos, mientras que vizit lo toma como un comando para abrir e inicia el invitado .

Además, el optoacoplador vo2 implementa el cambio automático del televisor al modo AV para visualizarlo desde la cámara del interfono.

La segunda parte es el software, que también se divide esencialmente en dos. El primero es un boceto que se muestra en arduino e implementa el intercambio a través del protocolo mqtt con el sistema iobroker.

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>

int flag = 0;

#define ring1_pin 0  //   1
#define open1_pin 2  //  1
#define open2_pin 3  //  2
#define mon1_pin 5  //   

#define ID_CONNECT "DoorbellControll"

byte mac[]    = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
byte server[] = { 192, 168, 55, 170 };
byte ip[]     = { 192, 168, 55, 40 };

EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);

void callback(char* topic, byte* payload, unsigned int length) {
  payload[length] = '\0';
  String strTopic = String(topic);
  String strPayload = String((char*)payload);

  if (strTopic == "myhome/DoorbellControll/open1") {
    if (strPayload == "false") {
      digitalWrite(2, HIGH);
    }
    else if (strPayload == "true") {
      digitalWrite(2, LOW);
    }
  }
  else if (strTopic == "myhome/DoorbellControll/open2") {
    if (strPayload == "false") digitalWrite(3, LOW);
    else if (strPayload == "true") digitalWrite(3, HIGH);
  }
  else if (strTopic == "myhome/DoorbellControll/mon1") {
    if (strPayload == "false") digitalWrite(5, LOW);
    else if (strPayload == "true") digitalWrite(5, HIGH);
  }
}


void reconnect() {
  while (!client.connected()) {
    if (client.connect(ID_CONNECT)) {
      client.subscribe("myhome/DoorbellControll/#");
    } else {
      delay(5000);
    }
  }
}

void setup() {

  pinMode(ring1_pin, INPUT);

  pinMode(open1_pin, OUTPUT);
  digitalWrite(open1_pin, HIGH);

  pinMode(open2_pin, OUTPUT);
  digitalWrite(open2_pin, LOW);

  pinMode(mon1_pin, OUTPUT);
  digitalWrite(mon1_pin, LOW);


  Ethernet.begin(mac, ip);
  if (client.connect("DoorbellControll")) {
    client.publish("myhome/DoorbellControll/open1", "false");
    client.publish("myhome/DoorbellControll/open2", "false");
    client.publish("myhome/DoorbellControll/mon1", "false");
    client.publish("myhome/DoorbellControll/ring1", "false");
    client.subscribe("myhome/DoorbellControll/#");
  }
}
void loop() {
  client.loop();
  //   
  if (digitalRead(ring1_pin) == LOW && flag == 0) {
    client.publish("myhome/DoorbellControll/ring1", "true");
    flag = 1;//   flag  
  }
  else if (digitalRead(ring1_pin) == HIGH && flag == 1) {
    client.publish("myhome/DoorbellControll/ring1", "false");
    flag = 0; //  flag
  }
  if (!client.connected()) {
    reconnect();
    client.subscribe("myhome/DoorbellControll/#");

  }
}

Y el segundo es un script js para implementar la interacción del usuario:

//************       ********************
createState('doorbellcontroll.rings', 'false');
createState('doorbellcontroll.visopen', 'false');    //   vis


on("mqtt.0.myhome.DoorbellControll.ring1", function (obj){
    if  (obj.newState.val == "true" || obj.newState.val === true) {
        setState('javascript.0.doorbellcontroll.rings', true);
    setTimeout(function() {
    }, 60000);
    }
});

//********      ,        ****************
on("javascript.0.doorbellcontroll.rings", function (obj){
    if  (obj.newState.val == "true" || obj.newState.val === true) {
        setState('sayit.0.tts.text', '  ');       //    
        sendTo('telegram.0', '  ');               //   
        setState('mqtt.0.myhome.DoorbellControll.mon1', true);  //    
        setState("vis.0.control.command", '{"instance": "FFFFFFFF", "command": "changeView", "data": "Camers"}');   //    ""
//***********  30      ********************
    setTimeout(function () {
        setState('mqtt.0.myhome.DoorbellControll.mon1', false); //               
        setState("vis.0.control.command", '{"instance": "FFFFFFFF", "command": "changeView", "data": "StartView"}');    //    "Home"
        setState('javascript.0.doorbellcontroll.rings', false);
    }, 30000);
    }
});

//*******************   ""  Vis**************
on("javascript.0.doorbellcontroll.visopen", function (obj){
    if  (obj.newState.val == "true" || obj.newState.val === true) {
        setState('mqtt.0.myhome.DoorbellControll.open1', true);     //    
        toLog('   . ', true, 'orange');     	//  
    
    setTimeout(function () {
        setState('mqtt.0.myhome.DoorbellControll.open1', false);    
        setState('javascript.0.doorbellcontroll.visopen', false);    //   
    }, 7500);    

    }       
});

El sistema iobroker muestra cómo puede interactuar con los objetos.

imagen

En este punto, la narrativa trae pereza para simplificar sus acciones rutinarias a una conclusión lógica.

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


All Articles