Google Homeでトイレセンサーを作ってみました。
トイレが空いたらGoogle Homeが自発的に教えてくれます。
#はじめに
会社には男性トイレの個室が1つしかありません。
急激にお腹痛くなってトイレに行ったけれど、既に誰か入っていて我慢する苦行を強いられていました。
そこで、トイレが空いたことを教えてくれればわざわざトイレまで見に行かずに済むのではないかと考えました。
#デモ動画
トイレが空いたことをGoogle Homeが教えてくれます。#GoogleHome #Firebase #RaspberryPi #IoT pic.twitter.com/fsUE5l8Oe3
— がおまる@HoloLens研究者 (@gaomar) 2017年12月20日
#環境
- Google Home
- Raspberry Pi Zero W
- ESPr Door Sensor
- firebase-arduino
#ドアの開閉状況を知る
ドアの開閉状況はESPr Door Sensorを使います。
下記のように磁石に反応して開閉状況を知ることが出来ます。
Wi-Fiが内蔵されているので、単体でネット環境に繋がります。
###Firebase設定
Firebaseの設定はコチラを確認してください。
###ESPr Door SensorからFirebaseへ開閉状態を知らせる
ArduinoからFirebaseを更新するためのライブラリをダウンロードします。
firebase-arduino
#include <ESP8266WiFi.h>
#include <FirebaseArduino.h>
extern "C" {
#include "user_interface.h"
}
#define CLOSE 0
const char* ssid = "接続するWi-FiのSSIDを指定してください";
const char* password = "xxxxxxxxxxx";
#define FIREBASE_HOST "xxxxxxxxxxx.firebaseio.com"
#define FIREBASE_AUTH "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
WiFiClient client;
boolean flag = false;
int reed_sw = 5;
void setup() {
Serial.begin(115200);
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
WiFi.mode(WIFI_STA); // omajinai
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(250);
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
pinMode(reed_sw,INPUT);
// Firebase初期化.
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
}
int value = 0;
void loop() {
int door_state;
door_state = digitalRead(reed_sw);
Serial.print("Door State:");
// ドアの状態(0: Close、1:Open)
if(door_state == CLOSE){
Serial.println("Close");
// FirebaseにCloseを書き込みます
Firebase.setString("toilet/word", "Close");
if (Firebase.failed()) {
Serial.print("setting /number failed:");
Serial.println(Firebase.error());
return;
}
}
else{
Serial.println("Open");
// FirebaseにOpenを書き込みます
Firebase.setString("toilet/word", "Open");
if (Firebase.failed()) {
Serial.print("setting /number failed:");
Serial.println(Firebase.error());
return;
}
}
if(door_state == CLOSE){
ESP.deepSleep(0, WAKE_RF_DEFAULT); //ドアが閉じている間はドアが開くまで待機
}
else{
ESP.deepSleep(0, WAKE_RF_DEFAULT); //ドアが開いている間はドアが閉じるまで待機
}
delay(1000);
}
###FirebaseのFIREBASE_AUTHを確認する
上記のスケッチの途中にあるFIREBASE_AUTH
はコチラから確認出来ます。
###動作確認する
これでマイコンボードに書き込んで動作を確認してみましょう。
うまく動作していればOpen/CloseがFirebaseに書き込まれます。
#Google Homeに開閉状態をしゃべらせる
ここからGoogle Homeの設定を行います。
google-home-notifierをラズパイに適用しておきましょう。
インストール方法は下記を参照してください。
https://qiita.com/SatoTakumi/items/c9de7ff27e5b70508066
###Firebaseが更新されたらしゃべらせる
ラズパイにFirebaseをインストールしておきましょう。
これでOpen/Close状態を取得してGoogle Homeがしゃべってくれます。
// モジュール読み込み
var firebase = require("firebase");
var googlehome = require('./google-home-notifier');
var deviceName = 'お好きな名前';
var ip = '192.168.xx.xx'; //ここにIPを記載
var language = 'ja';
// Google Home設定
googlehome.ip(ip, language);
googlehome.device(deviceName,language);
// firebase設定
var config = {
apiKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
authDomain: "xxxxxxxxxxxxx.firebaseapp.com",
databaseURL: "https://xxxxxxxxxxxx.firebaseio.com",
projectId: "xxxxxxxxxxxxxx",
storageBucket: "xxxxxxxxxxxx.appspot.com",
messagingSenderId: "xxxxxxxxxxxxx"
};
firebase.initializeApp(config);
try {
//database更新時
var db = firebase.database();
db.ref("/toilet").on("value", function(changedSnapshot) {
//値取得
var value = changedSnapshot.child("word").val();
if (value == "Open") {
googlehome.notify("トイレが空きました", function(notifyRes) {
});
} else if (value == "Close") {
googlehome.notify("トイレが空いてません", function(notifyRes) {
});
}
});
} catch (err) {
console.log(err);
}
#まとめ
サクッと作ることが出来ました。Firebaseはとても便利ですよね^^
ドアの開閉状況が分かるので、トイレだけでなく違う用途にも使うことが出来ると思います。
違うセンサーと組み合わせて状況に応じてGoogle Homeがしゃべるって事も可能ですね。