-->
-->
智能设备

制作一个用 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.作者投稿可能会经树莓派吧编辑修改或补充。

网友点评