我如何将Vizit对讲机连接到mqtt

祝大家有美好的一天。 1月1日无事可做,所以我决定在Giktayms上划线。与搬到另一间公寓有关,有门铃之类的选择。一切都会好起来的,但为来访者打开门却很烦人,而且由于电话,平板电脑,计算机始终在步行距离之内,只能伸出手,因此决定将此好处与已经投入运营的iobroker自动化系统联系起来。下面我将描述发生了什么。脚下的

东西被鞭打了,结果整个事情看起来像这样。

图片

由于我已经有了一个出色的iobroker自动化系统,因此决定连接到该系统,以便在单个界面中进行集中管理和行为更改配置。现在是时候选择熨斗和一般系统的通信方式了。作为从1wire仿真到获取请求的交换协议,这对我来说并没有发生,结果,mqtt协议在我看来是最方便的情况,因此在其中实现了铁件与iobroker之间的交换。

在平板电脑上,它看起来像一个选项卡,带有当前相机的显示和

图片

熨斗第一部分的控制。它由arduino uno,以太网屏蔽和带有对讲线路的小型匹配电路组成。该计划本身:

图片

这里的一切都很简单,来电由光耦合器监控,接收时只需按下arduino的零脚即可。在正常状态下,继电器是在常关状态下打开门的,当从iobroker收到命令时(他们按界面中的按钮,根据脚本中的条件自动按下,从电报中收到命令),它断开线路7.5秒,而vizit将其作为打开并启动来宾的命令。

此外,光耦合器vo2可以将电视自动切换到AV模式,以便从门电话摄像头显示。

第二部分是软件,基本上也分为两部分。第一个是在arduino中刷新的草图,并通过mqtt协议与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/#");

  }
}

第二个是用于实现用户交互的js脚本:

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

    }       
});

iobroker系统显示您可以与之交互的对象。

图片

在这一点上,叙述带来了懒惰,从而简化了其日常行动,从而得出了合理的结论。

Source: https://habr.com/ru/post/zh-CN400399/


All Articles