Como eu conectei o intercomunicador Vizit ao mqtt

Bom dia a todos. Em primeiro de janeiro, não há nada a fazer, então decidi dar uma olhada no artigo sobre os Giktayms. Em conexão com a mudança para outro apartamento, havia uma opção como um interfone. Tudo ficaria bem, mas correr e abrir a porta para todos que vieram era muito irritante e, como telefones, tablets, computadores estão sempre a curta distância, apenas alcançam, foi decidido conectar esse benefício ao sistema de automação iobroker, que já está funcionando. Abaixo, descreverei o que aconteceu com isso.

Foi chicoteado pelo que estava debaixo dos meus pés e estava disponível, como resultado, tudo isso é assim.

imagem

Como eu já tenho um maravilhoso sistema de automação iobroker, decidiu-se conectar a ele para a possibilidade de gerenciamento centralizado e configuração de mudanças de comportamento em uma única interface. É hora de escolher como o ferro e o sistema geral se comunicam. Isso simplesmente não me ocorreu como um protocolo de troca da emulação de 1wire para obter solicitações; como resultado, o protocolo mqtt venceu como o mais conveniente em minha visão da situação, e a troca entre o pedaço de ferro e o iobroker foi implementada nele.

No tablet, parece uma guia com a tela da câmera atual e o controle da

imagem

primeira parte do ferro. Consiste em arduino uno, blindagens ethernet e um pequeno circuito correspondente com uma linha de intercomunicação. O próprio esquema:

imagem

Tudo é simples aqui, a chamada recebida é monitorada pelo acoplador óptico e, após o recebimento, simplesmente pressiona o pé zero do arduino. A abertura da porta é implementada no relé no estado normal, sempre está fechada, quando um comando é recebido do iobroker (eles pressionaram um botão na interface, automaticamente de acordo com a condição do script, um comando de um telegrama foi recebido) ele interrompe a linha por 7,5 segundos, enquanto o vizit o toma como um comando para abrir e iniciar o convidado .

Além disso, o acoplador óptico vo2 implementa a comutação automática da TV para o modo AV para exibição na câmera do interfone.

A segunda parte é o software, que também é essencialmente dividido em dois. O primeiro é um esboço que é atualizado no arduino e implementa a troca por meio do protocolo mqtt com o 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/#");

  }
}

E o segundo é um script js para implementar a interação do usuário:

//************       ********************
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);    

    }       
});

O sistema iobroker exibe como os objetos com os quais você pode interagir.

imagem

Nesse ponto, a narrativa traz a preguiça de simplificar suas ações rotineiras para uma conclusão lógica.

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


All Articles