查看: 867|回復: 5
打印 上一主題 下一主題

[分享] 用blinker做橋,將第三方設備接入小愛

[復制鏈接]

該用戶從未簽到

跳轉到指定樓層
樓主
發表于 2020-2-11 22:28 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 kiddfu 于 2020-2-11 22:58 編輯

背景:

家中裝修時,考慮會用到智能家居,但又對市面上流行的無線設備不太滿意,所以最終敲定以有線智能為主、輔以少量無線設備。

布線時未采用傳統布線方案,而是采用了一種中央輻射式的點到點方案。


使用nodered做服務端數據處理平臺

  



前段時間入手了幾個小愛音響就想著把非米家設備接入小愛。此方案使用8266承載blinker做橋,通過互通數據達到語音控制的效果。

優點:不需要去破解、攔截小愛音響,只要刷入固件就無腦接入小愛。

缺點:需要添加額外的設備(8266)、接入數量有限(5個)

bug:8266發熱巨大、有明顯延遲

庫自帶例子做稍微修改,加入mqtt向服務器上報設備狀態。

kittenblock中小學創客名師推薦的圖形化編程軟件

#define BLINKER_WIFI
#define BLINKER_MIOT_OUTLET

#define MYAIO_SERVER      "192.168.0.200"
#define MYAIO_SERVERPORT  1883                   // use 8883 for SSL
#define MYAIO_USERNAME    ""
#define MYAIO_KEY         ""
#define MYAIO_BDNAME      "ESPAIKTZD"

#include <Blinker.h>
//#include "Adafruit_MQTT.h"
//#include "Adafruit_MQTT_Client.h"

char auth[] = "xxxxxxx";                                               //密鑰
char ssid[] = "xxxxxx";                                                     //wifiSSID
char pswd[] = "xxxxxxxx";                                               //wifi密碼

bool oState = false;                                                        //開關狀態

void miotPowerState(const String & state)                                   //反饋電源狀態
{
    BLINKER_LOG("need set power state: ", state);

    if (state == BLINKER_CMD_ON) {
        digitalWrite(13, HIGH);

        BlinkerMIOT.powerState("on");
        BlinkerMIOT.print();

        oState = true;
    }
    else if (state == BLINKER_CMD_OFF) {
        digitalWrite(13, LOW);

        BlinkerMIOT.powerState("off");
        BlinkerMIOT.print();

        oState = false;
    }
}


void miotQuery(int32_t queryCode)                                           //設備查詢接口
{
    BLINKER_LOG("MIOT Query codes: ", queryCode);

    switch (queryCode)
    {
        case BLINKER_CMD_QUERY_ALL_NUMBER :
            BLINKER_LOG("MIOT Query All");
            BlinkerMIOT.powerState(oState ? "on" : "off");
            BlinkerMIOT.print();
            break;
        case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
            BLINKER_LOG("MIOT Query Power State");
            BlinkerMIOT.powerState(oState ? "on" : "off");
            BlinkerMIOT.print();
            break;
        default :
            BlinkerMIOT.powerState(oState ? "on" : "off");
            BlinkerMIOT.print();
            break;
    }
}

void dataRead(const String & data)
{
    BLINKER_LOG("Blinker readString: ", data);

    Blinker.vibrate();
    
    uint32_t BlinkerTime = millis();
    
    Blinker.print("millis", BlinkerTime);
}



WiFiClient MyMqttClient;
Adafruit_MQTT_Client MyMqtt(&MyMqttClient, MYAIO_SERVER, MYAIO_SERVERPORT, MYAIO_USERNAME, MYAIO_KEY);
Adafruit_MQTT_Publish potValue = Adafruit_MQTT_Publish(&MyMqtt, MYAIO_BDNAME "/feeds/potValue");
Adafruit_MQTT_Subscribe ledBrightness = Adafruit_MQTT_Subscribe(&MyMqtt, MYAIO_BDNAME "/feeds/ledBrightness");


//uint32_t x=0;
void MQTT_connect() 
{
  int8_t ret;

  if (MyMqtt.connected()) return;

  Serial.print("Connecting to MQTT... ");

  uint8_t retries = 3;

  while ((ret = MyMqtt.connect()) != 0) 
  { 
       Serial.println(MyMqtt.connectErrorString(ret));
       Serial.println("Retrying MQTT connection in 5 seconds...");
       MyMqtt.disconnect();
       delay(5000);  // wait 5 seconds
       retries--;
       if (retries == 0)  while (1);
  }
  Serial.println("MQTT Connected!");
}

uint8_t ledPin = 13;
uint16_t potAdcValue = 0;
uint16_t ledBrightValue = 0;

void setup() 
{
  Serial.begin(115200);
  BLINKER_DEBUG.stream(Serial);
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
  Blinker.begin(auth, ssid, pswd);
  Blinker.attachData(dataRead);
  BlinkerMIOT.attachPowerState(miotPowerState);
  BlinkerMIOT.attachQuery(miotQuery);

  MyMqtt.subscribe(&ledBrightness);
}

void loop() 
{
  
  Blinker.run();
  MQTT_connect();

  Adafruit_MQTT_Subscribe *subscription;
  while ((subscription = MyMqtt.readSubscription(5000))) 
  {
    if (subscription == &ledBrightness) 
    {
      Serial.print(F("Got LED Brightness : "));
      ledBrightValue = atoi((char *)ledBrightness.lastread);
      Serial.println(ledBrightValue);
      //analogWrite(ledPin, ledBrightValue);
      if(ledBrightValue == 0) {digitalWrite(13, LOW);oState = false;}
      else                    {digitalWrite(13, HIGH);oState = true;}
    }
  }


  if(oState == false)
  {
    potAdcValue = 0;
  }
  else potAdcValue = 1;
  if (! potValue.publish(potAdcValue)) {
      Serial.println(F("Failed"));
    } else {
      Serial.println(F("OK!"));
    }

}

在米家app里面第三方賬號里綁定賬號同步設備,然后在nodered里面用訂閱消息就ok了
視頻還在審核就不展示了

2020-02-09.png (429.67 KB, 下載次數: 1)

2020-02-09.png

微信圖片_20200211222334.jpg (201.91 KB, 下載次數: 1)

微信圖片_20200211222334.jpg

微信圖片_20200211222324.jpg (181.93 KB, 下載次數: 1)

微信圖片_20200211222324.jpg

微信圖片_20200211222334.jpg (201.91 KB, 下載次數: 1)

微信圖片_20200211222334.jpg

演示文稿1_01.png (207.95 KB, 下載次數: 1)

演示文稿1_01.png

演示文稿1_01.png (207.95 KB, 下載次數: 0)

演示文稿1_01.png

微信圖片_20200211225602.png (211.4 KB, 下載次數: 2)

微信圖片_20200211225602.png
  • TA的每日心情
    難過
    2020-3-9 21:01
  • 簽到天數: 5 天

    [LV.2]偶爾看看I

    沙發
    發表于 2020-2-12 16:29 | 只看該作者
    強大,贊一個
  • TA的每日心情
    無聊
    2020-3-18 20:10
  • 簽到天數: 58 天

    [LV.5]常住居民I

    板凳
    發表于 2020-2-14 09:52 | 只看該作者
    5個繼電器連在一起的,用一塊esp8266就夠了,為什么用5塊

    該用戶從未簽到

    地板
    發表于 2020-2-15 10:28 | 只看該作者
    sting2k1 發表于 2020-2-14 09:52
    5個繼電器連在一起的,用一塊esp8266就夠了,為什么用5塊

    因為是5個無線設備呀
  • TA的每日心情
    開心
    2020-3-19 18:33
  • 簽到天數: 31 天

    [LV.5]常住居民I

    5#
    發表于 2020-2-15 11:35 | 只看該作者
    則卷弗蘭奇 發表于 2020-2-15 10:28
    因為是5個無線設備呀

    可以用ESP8266_01S

    該用戶從未簽到

    6#
    發表于 2020-2-18 23:32 來自手機 | 只看該作者
    請問樓主是同時連了自己的mqtt服務器么?
    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規則

    熱門推薦

    5分鐘帶你快速了解新一代開發板:M5STACK
    5分鐘帶你快速了解新一代
    一、什么是M5Stack M5Stack是一種模塊化、可堆疊擴展的開發板,每個模塊
    《Color Unit免費申請試用》
    《Color Unit免費申請試用
    COLOR 是一款顏色識別 Unit,其內部集成TCS3472彩色光數字轉換器,能夠將其檢測到顏色
    【Arduino】168種傳感器系列實驗(137)---TTS文字轉語音合成
    【Arduino】168種傳感器系
    37款傳感器與模塊的提法,在網絡上廣泛流傳,其實Arduino能夠兼容的傳感器模塊肯定是
    【Arduino】u8g2中文字庫制作教程 小白請進
    【Arduino】u8g2中文字庫
    我知道對于這個話題許多大佬們都會,發這個貼子也算是炒冷飯了,所以一開始我也十分糾
    【干貨分享】mega2560原理圖PCB圖紙altium designer18
    【干貨分享】mega2560原理
    分享一下mega2560的板子 AD版本 **** 本內容被作者隱藏 **** ergo
    Copyright   ©2015-2016  Arduino中文社區  Powered by©Discuz!   
    快速回復 返回頂部 返回列表
    3d每天组六27个号必中