-->
-->
智能設備

制作一個用 Siri 控制的 WiFi 燈

字號+作者: 來源: 2016-03-20 21:26 我要評論() 收藏成功收藏本文

偶然間在 make use of 發現一篇文章 How to Make a DIY Siri-Controlled Wi-Fi Light,使用 Siri 控制一個可以連接 WiFi 的燈,哦。。。。不對,等會,,,什么東...

偶然間在 make use of 發現一篇文章 How to Make a DIY Siri-Controlled Wi-Fi Light,使用 Siri 控制一個可以連接 WiFi 的燈,哦。。。。不對,等會,,,什么東西控制??

Siri?

仔細看看,果然是 Siri,費勁閱讀下來,果然是篇好文章,充分吊起了我 DIY 的念頭,正好手里有一部分需要的東西,然后去某寶湊齊其他的東西,開始自己做一個。

這個使用 Siri 控制的燈除了一個能運行 Siri 的設備外,還需要一些其他的東西:

一個可以運行 Linux 的服務器,這里選擇使用過完年剛入手的 NanoPi2,正好空閑。NanoPi自帶 WiFi,用著更方便,我的樹莓派被用在制作魔鏡上面了,用樹莓派也是一樣的,樹莓派推薦 Raspberry Pi 2 model B 樹莓派使用網線連接也可以(最新出的 RPi3 有 WiFi 哦)。

一個 ESP8266 的 NodeMCU 模塊,有 WiFi,還有個小型的處理器可以直接運行代碼,WiFi 燈就用這個控制。

一個 WS2812 的 LED 燈帶,這個燈帶的光源采用 SMD 5050 LED,自帶控制芯片,具有以下好處,做個環境燈還是不錯的:

每個像素點的三基色顏色可實現256級亮度顯示,完成16777216種顏色的全真色彩顯示。

--- 串行級聯接口,能通過一根信號線完成數據的接收與解碼。

--- 任意兩點傳傳輸距離在不超過5米時無需增加任何電路。

--- 我這里只是使用了一個 16 燈的燈環來做實驗,跟燈帶是一樣的,只是個數不同。

我這里只是使用了一個 16 燈的燈環來做實驗,跟燈帶是一樣的,只是個數不同。

搭建一個給 Siri 提供服務的服務器

用 Siri 控制電燈可不是你跟她說兩句話就可以的,至少目前不行,她不知道你到底要干什么;但是有了服務器后你只需跟她動動嘴她就知道要干什么了。

搭建 mqtt 服務器

MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發的一個即時通訊協議,有可能成為物聯網的重要組成部分。該協議支持所有平臺,幾乎可以把所有聯網物品和外部連接起來,被用來當做傳感器和致動器(比如通過Twitter讓房屋聯網)的通信協議。

我們需要他作為消息的傳輸。

安裝 git

有些系統內沒有帶 git,需要自己安裝:

sudo apt-get install git

安裝 libwebsockets

這里需要這個庫做 web sockets 的支持:

sudo apt-get install cmake libssl-dev
cd    # i.e. your source code home
sudo wget http://git.warmcat.com/cgi-bin/cgit/libwebsockets/snapshot/libwebsockets-1.6.0-chrome48-firefox42.tar.gz
sudo tar -xzvf libwebsockets-1.6.0-chrome48-firefox42.tar.gz
cd libwebsockets-1.6.0-chrome48-firefox42/
mkdir build
cd build
cmake .. -DOPENSSL_ROOT_DIR=/usr/bin/openssl
make
sudo make install

安裝 Mosquitto

Mosquitto 是一款實現了消息推送協議 MQTT v3.1 的開源消息代理軟件,提供輕量級的,支持可發布/可訂閱的的消息推送模式,使設備對設備之間的短消息通信變得簡單,比如現在應用廣泛的低功耗傳感器,手機、嵌入式計算機、微型控制器等移動設備。一個典型的應用案例就是 Andy Stanford-Clark Mosquitto(MQTT協議創始人之一)在家中實現的遠程監控和自動化。

這個安裝比較復雜,但是只要有點耐心,還是很容易的。

cd    # i.e. your source code home #你放源代碼的地方
sudo wget http://mosquitto.org/files/source/mosquitto-1.4.8.tar.gz
sudo tar xvf mosquitto-1.4.8.tar.gz
cd mosquitto-1.4.8/

首先需要編輯 config.mk 打開 websocketsyes

sudo vim config.mk

找到 WITH_WEBSOCKETS,修改為:

WITH_WEBSOCKETS:=yes

然后安裝 pre-reqs:- (支持文件?)

sudo apt-get install uuid-dev xsltproc docbook-xsl

最后:

make
make test
sudo make install

如果你遇到關于缺失 ares.h 的錯誤:

cd    # i.e. your source code home
wget http://c-ares.haxx.se/download/c-ares-1.10.0.tar.gz
tar xvf c-ares-1.10.0.tar.gz
cd c-ares-1.10.0
./configure
make

如果你 make test 遇到了錯誤,估計是 websockets 在共享庫的目錄中沒有放庫文件,試試這么做:

cd /org.eclipse.mosquitto/test/broker

../../src/mosquitto -p 1888

如果是共享庫的問題,你可以馬上看到他,像這樣做一些事兒:

find /usr -name libwebsockets.so.6

我的是:

/usr/local/lib/libwebsockets.so.6

然后:

sudo vi /etc/ld.so.conf.d/libc.conf

在最后添加:

#lib64c default configuration

/usr/local/lib64

然后:

sudo ldconfig

重試 make test

make test 沒問題后:

sudo make install

復制配置文件和建立一個 Service User ID

sudo cp mosquitto.conf /etc/mosquitto
sudo useradd -r -m -d /var/lib/mosquitto -s /usr/sbin/nologin -g nogroup mosquitto

啟動服務:

sudo /usr/local/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

開機自啟動

如果你重啟一下會發現 mosquitto 服務沒有開機運行,每次手動運行會很麻煩,所以我們創建一個啟動服務讓他開機運行。

新建一個啟動服務文件:

sudo vim  /etc/init.d/mosquitto

輸入一下內容:

#!/bin/bash
# /etc/init.d/mosquitto

### BEGIN INIT INFO
# Provides:          mosquitto
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start mosquitto at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO


case "$1" in 
    start)
        echo "Starting Mosquitto Server"
        /usr/local/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf < /dev/null &
        ;;
    stop)
        echo "Stopping Mosquitto Server"
        killall mosquitto
        ;;
    *)
        echo "Usage: /etc/init.d/mosquitto start|stop"
        exit 1
        ;;
esac

exit 0

然后進行以下操作讓服務開機運行:

sudo chown root:root /etc/init.d/mosquitto
sudo chmod +x /etc/init.d/mosquitto
sudo update-rc.d mosquitto defaults
sudo update-rc.d mosquitto enable

重啟試試看,可以使用 MQTT.fx 這個軟件進行測試。

安裝 Homekit 服務器

HomeKit,是蘋果2014年發布的智能家居平臺。這才是我們使用 Siri 控制電燈的關鍵。

安裝 Node.js

我們一會要安裝 HAP-NodeJS 這個開源的 HomeKit 服務器,但是他需要 Node.js 的支持:

sudo wget https://nodejs.org/dist/v5.8.0/node-v5.8.0-linux-armv7l.tar.xz
sudo tar xvf node-v5.8.0-linux-armv7l.tar.xz

解壓后,在 bin 文件夾中已經存在 node 以及 npm,如果你進入到對應文件的中執行命令行一點問題都沒有,不過不是全局的,所以將這個設置為全局就好了:

sudo ln -s /source-code-home/node-v5.8.0-linux-armv7l/bin/node /usr/local/bin/node
udo ln -s /source-code-home/node-v5.8.0-linux-armv7l/bin/npm /usr/local/bin/npm

這里 /source-code-home/ 就是你放 Node.js 的地方,改成自己的就好。

接下來,我們安裝一些 Node 的模塊:

sudo npm install -g npm
sudo npm install -g node-gyp

實際上,第一條代碼是使用 Node Package Manager (npm) 安裝一個最新的版本。這一步我卡了一晚上也沒有過去,直接略過。

第二條命令如果有錯誤請試試:

sudo npm cache clean

HAP-NodeJS:

HAP-NodeJS 是使用 Node.js 實現的 HomeKit 服務器,這是 HomeKit 請求和 WiFi 設備之間的橋梁。

安裝 HAP 很簡單:

git clone https://github.com/KhaosT/HAP-NodeJS.git
cd HAP-NodeJS
npm rebuild
sudo npm install node-persist
sudo npm install srp

在安裝 srp 時如果出現 #error This version of node/NAN/v8 requires a C++11 compiler

sudo apt-get install gcc-4.8 g++-4.8
sudo update-alternatives --install/usr/bin/gccgcc/usr/bin/gcc-4.6 20
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 20
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50

然后繼續:

sudo npm install srp
sudo npm install mdns --unsafe-perm

安裝 mdns 時如果出現 error: dns_sd.h: No such file or directory

sudo apt-get install libavahi-compat-libdnssd-dev

繼續:

sudo npm install mdns --unsafe-perm
sudo npm install debug
sudo npm install ed25519 --unsafe-perm
sudo npm install curve25519 --unsafe-perm

這樣 HAP 就全部弄好了,你可以通過以下命令去運行:

sudo node Core.js

你立刻就能看到已經創建了 6 個虛擬的設備。我們使用這些作為我們 WiFi 燈的開始,但是我們要先使用這些開始測試一下。

現在你需要一個可以使用 Siri 的 Apple 設備;蘋果并沒有提供一個關于 Homekit 的 App,所以我們可以下載一個免費的軟件:Elgato Eve app,一個一個可以讓你添加自己的設備(即使不是 Elgato 的設備)到 Homekit 網絡并管理的 App。

第一次打開軟件他會讓你命名你的家,填好后進行下一步,這里我們選擇添加附件,然后選擇一個設備,比如 light

然后他會公訴你需要唯一的設置代碼才能安全的添加到家庭,不管他,選擇添加到「你家的名字」。

然后他會告訴你此配件沒有認證,仍然添加,然后他會與此配件配對。

選手動輸入代碼,然后輸入以下的數字:

031-45-154

這個代碼可以在 Light_accessory.js 文件中找到并修改。

添加這個配件到你的默認房間,給他起個名字,然后選擇一個圖標。

然后你回到你運行 HAP-NodeJS 的命令行那里,你會發現會有消息“Are we on?”出現,這是軟件在查看此配件的信息。然后打開 Siri 告訴她:“把(你給燈起的名字)打開”,然后在關閉它。然后你會在命令行內發現如下信息:

Are we on? No.
Turning the light on!
Turning the light off!

非常棒,到這里我們就完成了服務的搭建,你也可以使用 Siri 控制一個虛擬的燈,接下來我們就實際制作一個真的 WiFi 燈。

制作一個真的 WiFi 燈

在這里這個硬件我們使用 NodeMCU 開發板去控制 WS2812 的燈帶,你會發現驚人的簡單,我們能直接使用 NodeMCU 開發板驅動燈帶然后使用 USB 去鏈接(當然如果燈帶過長還是建議你用的單獨的電源去驅動燈帶然后使用 NodeMCU 開發板來控制它)。如果你沒有這個燈帶的話,你也可以使用一個繼電器去控制電燈的電源,或者你能使用的方式去控制它,不過,注意安全。

把燈帶的電源線連在開發板的 VIN Pin,地線連在 GND Pin,把信號線接在 NodeMCU 上標有 D2 字樣的針腳上(或者你自己喜歡的那個,當然程序中也要對應修改)。

如果你還沒有搭建使用 Arduino 編譯 NodeMCU 的環境,你可以先去 ESP8266: Arduino Killer 這篇文章搭建好環境并能工作后再回來繼續我們的制作。你需要安裝一下這些庫:

Adafruit’s NeoPixels

Arduino-MQTT

然后你可以把下面的代碼 Update 到你的 NodeMCU 中:

#include #include #include #define PIN 4

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(16, PIN, NEO_GRB + NEO_KHZ800);

const char* ssid = "your wifi ssid";
const char* password = "your wifi password";
const char* host = "homekit/officelight"; // the name of your fixture, and the base channel to listen to
const char* server = "192.168.31.206"; // your MQTT server host
String clientName = "officelight";


/**************************************************************/
/* NO NEED TO CHANGE BENEATH THIS LINE */

int hue = 0;
float brightness = 0.0;
float saturation = 0.0;

#define BUFFER_SIZE 100

WiFiClient wifiClient;
MQTTClient client;

void setup() {
  Serial.begin(115200);
  client.begin(server,wifiClient);
  Serial.println("Booting");

//  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");

  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  strip.begin();
  strip.show(); // Initialize all pixels to 'off'

}

void loop() {
  if (WiFi.status() == WL_CONNECTED) {
    if (!client.connected()) {
      if (client.connect((char*) clientName.c_str())) {
        client.publish("outTopic",(String)"hello world, I'm "+host);
        client.subscribe(host+(String)"/#");
      }
    }

    if (client.connected())
      client.loop();
  }
}

// Convert Hue/Saturation/Brightness values to a packed 32-bit RBG color.
// hue must be a float value between 0 and 360
// saturation must be a float value between 0 and 1
// brightness must be a float value between 0 and 1
uint32_t HSVColor(float h, float s, float v) {

  h = constrain(h, 0, 360);
  s = constrain(s, 0, 1);
  v = constrain(v, 0, 1);

  int i, b, p, q, t;
  float f;

  h /= 60.0;  // sector 0 to 5
  i = floor( h );
  f = h - i;  // factorial part of h

  b = v * 255;
  p = v * ( 1 - s ) * 255;
  q = v * ( 1 - s * f ) * 255;
  t = v * ( 1 - s * ( 1 - f ) ) * 255;

  switch( i ) {
    case 0:
      return strip.Color(b, t, p);
    case 1:
      return strip.Color(q, b, p);
    case 2:
      return strip.Color(p, b, t);
    case 3:
      return strip.Color(p, q, b);
    case 4:
      return strip.Color(t, p, b);
    default:
      return strip.Color(b, p, q);
  }
}

void currentValues(){
  Serial.println("");
  Serial.println("Current State");
  Serial.print("Hue (0-360):");
  Serial.println(hue);
  Serial.print("Saturation (0-100 in, 0-1):");
  Serial.println(saturation*100);
  Serial.print("Brightness (0-100):");
  Serial.println(brightness*100);
  Serial.println("");
}

void messageReceived(String topic, String payload, char * bytes, unsigned int length) {
  uint16_t i, j;

  currentValues();
  String myMessage = String(payload);
  // handle message arrived
  Serial.print(topic);
  Serial.print(" => ");
  String myTopic = String(topic);

  if (topic == host) {
    Serial.println(payload);

    if(payload== "on"){
      brightness = 1.0;

      for (i = 0; i < strip.numPixels(); i ++) {
        strip.setPixelColor(i, HSVColor(hue,saturation,brightness));
      }
      strip.show();
    } else {
      brightness = 0.0;

      for(i = 0; i < strip.numPixels(); i ++) {
        strip.setPixelColor(i, HSVColor(hue,saturation,brightness));
      }
      strip.show();
    }

  } else if (topic == host + (String)"/brightness") { 
    // Brightness up to 100
    Serial.println(payload);
    brightness = (payload.toFloat()) / 100;
    for (i = 0; i < strip.numPixels(); i ++) {
      strip.setPixelColor(i, HSVColor(hue,saturation,brightness));
    }
    strip.show();

  } else if (topic == host + (String)"/hue") { 
    // Hue value 0-360
    Serial.println(payload);
    hue = payload.toInt();
    for (i = 0; i < strip.numPixels(); i ++) {
      strip.setPixelColor(i, HSVColor(hue,saturation,brightness));
    }
    strip.show();

  } else if (topic == host + (String)"/saturation") { 
    // Saturation value at 0-100
    Serial.println(payload);
    saturation = (payload.toFloat()) / 100;
    for (i = 0; i < strip.numPixels(); i ++) {
      strip.setPixelColor(i, HSVColor(hue,saturation,brightness));
    }
    strip.show();

  }
  currentValues();
}

你需要把這些改成你自己的網絡設置:

const char* ssid = "your wifi ssid";
const char* password = "your wifi password";
const char* host = "homekit/officelight";
const char* server = "192.168.31.206";

這里只使用了16顆 LED 的小燈組,你可以添加更多的燈并控制它。上傳完成后你就可以打開你最喜歡的 MQTT 客戶端測試一下了:

你可以發送 on homekit/officelight 打開燈帶,發送 off 關閉它。

你能發送數字 0 - 360 到 homekit/officelight/hue 來改變顏色。這里使用的是 HSV color space,所以 0 和 360 是紅,120 是綠,240 是藍。

你能發送 0 - 100 到 homekit/officelight/brightness 來改變燈的亮度,也就是 0% - 100% 的亮度值。

同理可以發送到 homekit/officelight/saturation 改變飽和度,最大是 100。

測試完成后你就可以把燈帶固定到你想要放的地方了。然后回來我們繼續,讓 Siri 能夠控制他。

設定一個 HomeKit 的附件

回到我們的 HAP-NodeJS 服務器的目錄下,定位到 /accessories 文件夾下面,你可以直接使用以下命令下載一個已經配置好的附件文件到你的目錄中:

wget https://gist.githubusercontent.com/jamesabruce/a6607fa9d93e41042fee/raw/12e4fd1d1c2624e7540ba5e17c3e79bc6bdec5fd/Officelight_accessory.js

或者復制下面的代碼新建一個名稱格式為 [you accessories name]_accessory.js 的文件:

//MQTT Setup
var mqtt = require('mqtt');
console.log("Connecting to MQTT broker...");
var mqtt = require('mqtt');
var options = {
  port: 1883,
  host: 'localhost',
  clientId: 'HelloWk Wifi Light'
};
var client = mqtt.connect(options);
console.log("Wifi Light Connected to MQTT broker");


var Accessory = require('../').Accessory;
var Service = require('../').Service;
var Characteristic = require('../').Characteristic;
var uuid = require('../').uuid;

//here's a fake hardware device that we'll expose to HomeKit
var OFFICELIGHT = {
  powerOn: false,
  brightness: 100, // percentage
  hue: 0,
  saturation: 0,

  setPowerOn: function(on) { 
    console.log("Turning Office Light %s!", on ? "on" : "off");

    if (on) {
      client.publish('homekit/officelight', 'on');
      OFFICELIGHT.powerOn = on;
    } 
    else {
      client.publish('homekit/officelight','off');
      OFFICELIGHT.powerOn = false;   
   };

  },
  setBrightness: function(brightness) {
    console.log("Setting light brightness to %s", brightness);
    client.publish('homekit/officelight/brightness',String(brightness));
    OFFICELIGHT.brightness = brightness;
  },
  setHue: function(hue){
    console.log("Setting light Hue to %s", hue);
    client.publish('homekit/officelight/hue',String(hue));
    OFFICELIGHT.hue = hue;
  },
  setSaturation: function(saturation){
    console.log("Setting light Saturation to %s", saturation);
    client.publish('homekit/officelight/saturation',String(saturation));
    OFFICELIGHT.saturation = saturation;
  },
  identify: function() {
    console.log("Identify the light!");
  }
}

// Generate a consistent UUID for our light Accessory that will remain the same even when
// restarting our server. We use the `uuid.generate` helper function to create a deterministic
// UUID based on an arbitrary "namespace" and the word "OFFICELIGHT".
var lightUUID = uuid.generate('hap-nodejs:accessories:OFFICELIGHT');

// This is the Accessory that we'll return to HAP-NodeJS that represents our fake light.
var light = exports.accessory = new Accessory('Office Light', lightUUID);

// Add properties for publishing (in case we're using Core.js and not BridgedCore.js)
light.username = "FF:FF:FF:FF:CC:1A";
light.pincode = "031-45-154";

// set some basic properties (these values are arbitrary and setting them is optional)
light
  .getService(Service.AccessoryInformation)
  .setCharacteristic(Characteristic.Manufacturer, "MakeUseOf")
  .setCharacteristic(Characteristic.Model, "Rev-1")
  .setCharacteristic(Characteristic.SerialNumber, "LOLWUT");

// listen for the "identify" event for this Accessory
light.on('identify', function(paired, callback) {
  OFFICELIGHT.identify();
  callback(); // success
});

// Add the actual Lightbulb Service and listen for change events from iOS.
// We can see the complete list of Services and Characteristics in `lib/gen/HomeKitTypes.js`
light
  .addService(Service.Lightbulb, "Office Light") // services exposed to the user should have "names" like "Fake Light" for us
  .getCharacteristic(Characteristic.On)
  .on('set', function(value, callback) {
    OFFICELIGHT.setPowerOn(value);
    callback(); // Our fake Light is synchronous - this value has been successfully set
  });

// We want to intercept requests for our current power state so we can query the hardware itself instead of
// allowing HAP-NodeJS to return the cached Characteristic.value.
light
  .getService(Service.Lightbulb)
  .getCharacteristic(Characteristic.On)
  .on('get', function(callback) {

    // this event is emitted when you ask Siri directly whether your light is on or not. you might query
    // the light hardware itself to find this out, then call the callback. But if you take longer than a
    // few seconds to respond, Siri will give up.

    var err = null; // in case there were any problems

    if (OFFICELIGHT.powerOn) {
      console.log("Are we on? Yes.");
      callback(err, true);
    }
    else {
      console.log("Are we on? No.");
      callback(err, false);
    }
  });

// also add an "optional" Characteristic for Brightness
light
  .getService(Service.Lightbulb)
  .addCharacteristic(Characteristic.Brightness)
  .on('get', function(callback) {
    callback(null, OFFICELIGHT.brightness);
  })
  .on('set', function(value, callback) {
    OFFICELIGHT.setBrightness(value);
    callback();
  })

light
  .getService(Service.Lightbulb)
  .addCharacteristic(Characteristic.Hue)
  .on('get',function(callback){
   callback(null,OFFICELIGHT.hue);
   })
   .on('set',function(value,callback){
   OFFICELIGHT.setHue(value);
   callback();   
   })

light
  .getService(Service.Lightbulb)
  .addCharacteristic(Characteristic.Saturation)
  .on('get',function(callback){
   callback(null,OFFICELIGHT.saturation);
   })
   .on('set',function(value,callback){
   OFFICELIGHT.setSaturation(value);
   callback();   
   })

實際上,不管你是直接下載文件也好還是新建也好,本質都是復制默認的 light accessory,然后改成你自己的需要的名字,以下是你自己創建一個 accessory 時需要注意的地方:

所有的 accessory 都要命名為 *_accessory.js

添加你自己的 MQTT 服務在文件的最上方。

如果你想設置一個自己的設備名,搜索/替換 所有的 officelight 為你自己的唯一不變的設備名。

為你的設備分配一個唯一的 16 進制的標識(light.username = “1B:2B:3C:5D:6E:FF”;)。

不要更改 PIN 碼,他有一個固定的格式,如果你隨便改的話將不能成功配對。

現在你把你的新設備加入 Elgato Eve app 來試試看吧。如果出現提示缺少 mqtt 時運行一下命令:

sudo npm install mqttsudo npm install mqtt

然后再試一遍。

最后,我們把 HAP-NodeJS 加入開機自動運行,編輯 etc/rc.local 這個文件,把下面這行加在 exit 0 之前:

sudo node /home/pi/HAP-NodeJS/Core.js < /dev/null &

最后一個步驟:去定位到 /accessories 文件夾下,刪除其他的虛擬設備,好了,你可以盡情體驗 Siri 控制燈帶了。

還有什么是 Siri 能夠控制的?

現在你已經會了最基本的控制,但是這里你能控制的東西沒有極限——如果你能使用 Javascript 進行編程的話,你可以創建你自己的設備文件。這個項目有很多的潛力,只要你能想得到,相信你會玩的很愉快。

以上文章轉載自 HelloWk 的制作一個用 Siri 控制的 WiFi 燈

1.樹莓派吧遵循行業規范,任何轉載的稿件都會明確標注作者和來源,如有版權問題,請聯系QQ613789238刪除。; 2.樹莓派吧的原創文章,請轉載時務必注明文章作者和"來源:樹莓派吧",不尊重原創的行為樹莓派吧或將追究責任; 3.作者投稿可能會經樹莓派吧編輯修改或補充。

網友點評
黑龙江福彩p62开奖时间