2018.01.09

Google Home からしゃべらせる

Google Homeから、Raspberry Pi からしゃべらせてみる。

参考にしたのはこちら


curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -
sudo apt-get install nodejs
sudo apt-get install git-core libnss-mdns libavahi-compat-libdnssd-dev
git clone https://github.com/noelportugal/google-home-notifier
cd google-home-notifier
npm install

google-home-notifier 内にあるexample.js内のファイルを修正する。

修正するのは、ipアドレスのところ(var ip = 'xxx.xxx.xxx.xxx")と、言語のところ(var language = 'xx')。

ipアドレスは、google homeのipアドレスにする。
Google Homeのipアドレスは、Google Home設定時にインストールしたアプリGoogle Homeのデバイスの設定から確認できる。もしくは、eRemote miniをRaspberry piで操作する準備の時に入れたFingから、調べてみる。google homeっぽい表記にはなってないけど、消去法でだいたいわかる。

languageは、日本語である"ja"にする。
languageは、24行目あたりと、65行目あたりの2箇所あるので注意。
また、googlehome.ip(ip, language);の下に以下を追加して、日本語設定を反映。これも2箇所ある。
googlehome.device(deviceName,language)

node example.js

とする。

発話させるには、例えば、

curl -X POST -d "text=これはテストです" http://(RaspberryPiのIP):8091/google-home-notifier

としてみる。

なお、ブラウザから発話させる場合は、

http://192.168.11.15:8091/google-home-notifier?text=これはテストです

でできる。

rc.localのファイルから、自動で登録する場合は、絶対パスにすることを忘れない。
2行目の以下のところと、rc.localで登録するリンク先。
var googlehome = require('./google-home-notifier');

| トラックバック (0)

2017.12.25

Raspberry Pi から eRemoteを操作する(4)

前回の続き。

Raspberry Piにもどって、FirebaseとSuperAgentのNode.jsモジュールをインストールする。
メールでやったのを、Raspberry Piから、firebase経由で動かしてみる。

■firebaseのインストール
以下の要領で、firebaseのフォルダを作り、インストールする。

$ mkdir firebase
$ cd firebase
$ npm install firebase

■firebaseを操作するjsを作成
前回の操作で取得した、firebaseで取得したconfig以降の情報を貼り付けて、以下のindex.jsを作成する。

var firebase = require("firebase");

//firebase config
var config = {
apiKey: "ZZZZZZZZZZZZZZZZZZZZZZZ",
authDomain: "xxxxx-yyyyy.firebaseapp.com",
databaseURL: "https://xxxxx-yyyyy.firebaseio.com",
projectId: "xxxxx-yyyyy",
storageBucket: "xxxxx-yyyyy.appspot.com",
messagingSenderId: "wwwwwwwwwwww"
};
firebase.initializeApp(config);

//RM-mini3
const broadlink = require("./getDevice")
const rmlist = require("./rmlist")

//RM mini3 Device Set
const rmMac = "xx:xx:xx:xx:xx:xx"

let rm = {}
const timer = setInterval(function() {
rm = broadlink({host: rmMac})
if (rm) {clearInterval(timer)}
}, 100)

//RM mini3 ir send
const rmSend = (command) => {
const hexDataBuffer = new Buffer(rmlist[command], "hex")
console.log(command);
rm.sendData(hexDataBuffer)
}

//database更新時
const path = "/googlehome";
const key = "word";
const db = firebase.database();
db.ref(path).on("value", function(changedSnapshot) {

//値取得
const value = changedSnapshot.child(key).val();
if (value) {
console.log("解析開始");
console.log(value);

let commandlist = [
[ "冷房", "cool" ],
[ "暖房", "heat" ],
[ "除湿", "dehumidify" ],
[ "つけて", "aircon" ],
[ "エアコン", "aircon" ],
[ "消し" , "acoff" ],
[ "けし" , "acoff" ],
[ "止め" , "acoff" ],
[ "とめ" , "acoff" ],
[ "停止" , "acoff" ],
[ "default" , "" ]
];
let n = -1;
for( i = 0 ; i if( commandlist[i].indexOf( value.split(" ")[1] ) >-1 ){
n=i;
}
}
console.log( n );

//コマンド実行
if( n>=0 ){
const command = commandlist[n][1];
rmSend(command)
//firebase clear
db.ref(path).set({[key]: ""});
}
}
});

前回作ったファイル「rmlist.js」とコピーした「getDevide.js」も、firebaseにコピーするのを忘れない。

node index.js
とすると、この状態で、タイトルが「暖房」のメールを送ると、暖房がつくはず。

■IFTTTの設定
では、最後にGoogle Homeの音声からエアコンを制御してみる。
やり方は、前回のThisの部分をGoogle Assistantにするだけ。

IFTTTのMy Appletsから、NewAppletを選択。
Thisでは、[Google Assistant]から、「Say a phrase with a text ingredient」を選択
Thatでは、[Webhooks]から、 「Make a web request」を選択

Thisには
What do you want to say? : エアコン $
What do you want the Assistant to say in response? : エアコンを制御します
Language : Japanese

Thatは以下のように入力。
URL:https://xxxxx-yyyyy.firebaseio.com/googlehome/word.json
Method:PUT
Content Type:application/json
Body:"aircon {{TextField}}"
Bodyへの入力には、「"」を忘れないこと。


以上で、「エアコン 暖房」と言うと、エアコンがつくはず。

■自動起動
最後に、Raspberry Pi を起動した時に自動でコマンドが走るよう
/etc/rc.local
のファイルにnode index.jsを入れておく。

後でプロセスを消したい場合は、
ps aux | grep node
で、nodeのプロセスを探し、killする。

| トラックバック (0)

2017.12.24

Raspberry Pi から eRemoteを操作する(3)

前回のnode index.jsが動作したところから。
引き続き参考にしたのは、こちら

Google Homeで動かす前にまずはメールでFirebaseを動かすところまでを準備。

■Firebaseの設定
Firebaseのサイトに行きます。
なお、複数のアカウントを持っている人は気をつける。
下の方にある、フリートライアルで使ってみる。
設定は、以下の感じ。

プロジェクト名:XXXXX
国/地域:日本

XXXXは適当に好きなプロジェクト名を入れる。
その後、「ウェブアプリに Firebase を追加」をクリックすると、以下の情報が出るのでチェック。

<script src="https://www.gstatic.com/firebasejs/4.8.1/firebase.js"></script>
<script>
// Initialize Firebase
var config = {
apiKey: "ZZZZZZZZZZZZZZZZZZZZZZZ",
authDomain: "xxxxx-yyyyy.firebaseapp.com",
databaseURL: "https://xxxxx-yyyyy.firebaseio.com",
projectId: "xxxxx-yyyyy",
storageBucket: "xxxxx-yyyyy.appspot.com",
messagingSenderId: "wwwwwwwwwwww"
};
firebase.initializeApp(config);
</script>

xxxx-yyyyはプロジェクトIDで、前半はプロジェクト名に基づいた文字列。
この辺はセキュリティ上重要なので、チェックしつつ他に知られないよう注意。
下部の「Database」をクリックし、「スタートガイド」をクリック。

続いて、上部の「ルール」タブをクリックし、データベースのルールや構造を以下のように定義し、公開をクリック。

{
"rules": {
".read": true,
".write": true
}
}

次に、「データ」タブで、以下のように初期データを入力する。
xxxxx-yyyyy
 googlehome
  word "最初のメッセージ"


■IFTTTからFirebaseを変更
IFTTTのMy Appletsから、NewAppletを選択。
Thisでは、[Gmail]から、「Any new email in inbox」を選択
Thatでは、[Webhooks]から、 「Make a web request」を選択

webリクエストを求められるのでそれぞれ以下のように入力。
URL:https://xxxxx-yyyyy.firebaseio.com/googlehome/word.json
Method:PUT
Content Type:application/json
Body:"aircon {{Subject}}"

Bodyへの入力には、「"」を忘れないこと。
Create action、finishで完了。

この状態で、メールを受信すると、Databaseのgooglehome->wordに「aircon [メールのタイトル]」が記載されることを確認する。


| トラックバック (0)

2017.12.23

Raspberry Pi から eRemoteを操作する(2)

「broadlinkjs-rm」のインストールが完了したところから。

まずは、作業用フォルダを作成し、そこに移動する。

mkdir eremote
cd eremote

つづいて、「rmlist.js」というファイルを作成。
こちらには、エアコン用のonとoffを実施する信号リストのファイルを作成する。
ちなみに、エアコンは電源のオン、オフで信号が異なり、電源オンでも暖房と冷房で違う。RM Bridgeで確認しておく。
ファイルの中は、以下のような感じ。

module.exports = {
"heat": "xxxxxxxx",
"off": "yyyyyyyy"
}

xxxxxxxには、RM Bridgeで取得した、エアコンオンの信号を、yyyyyyyyには、エアコンオフの信号をそれぞれ入れる。それぞれ長い16進数が入る。

操作用のファイル「index.js」を作成する。
ファイルの中身は以下のような感じ。

const broadlink = require("./getDevice")
const rmlist = require("./rmlist")

//RM mini3 ir send
const command = "heat"
const rmMac = "xx:xx:xx:xx:xx:xx"
let rm = false
const timer = setInterval(function() {
rm = broadlink({host: rmMac})
if (rm) {
const hexDataBuffer = new Buffer(rmlist[command], "hex")
rm.sendData(hexDataBuffer)
clearInterval(timer)
}
}, 100)

xx:xx:xx:xx:xx:xxには、eRemoteのmacアドレスを入れる。この時、小文字にすることに注意。

そして、eRemote接続用に以下のjsもコピって同ディレクトリに置いておく。
homebridge-broadlink-rm/helpers/getDevice.js

node index.js
とすれば、エアコンがつくはず。
heatの部分をoffにして、同じコマンドを実施するとエアコンが消える。

| トラックバック (0)

2017.12.22

Raspberry Pi から eRemoteを操作する

node.js, npm のバージョンが

$node -v
v7.10.1
$npm -v
4.2.0

の状態から開始。

$npm i broadlinkjs-rm

を実施してみたら、以下のようなエラーが出た。

pi@raspberrypi:~ $ npm i broadlinkjs-rm
npm ERR! Linux 4.9.59-v7+
npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "i" "broadlinkjs-rm"
npm ERR! node v7.10.1
npm ERR! npm v4.2.0
npm ERR! code MODULE_NOT_FOUND

npm ERR! Cannot find module 'internal/fs'
npm ERR!
npm ERR! If you need help, you may report this error at:
npm ERR!

npm ERR! Please include the following file with any support request:
npm ERR! /home/pi/.npm/_logs/2017-12-23T06_06_35_214Z-debug.log

調べてみたら、似たようなエラーが出てる人がいた。
気が進まないけど、nodeを一旦削除。
$sudo rm -rf /usr/local/lib/node_modules/npm

もう一度、以下で、nodeをコピーし直す。
$ cd node-v7.10.1-linux-armv7l
$ sudo cp -R * /usr/local/


もういちど、「broadlinkjs-rm」をインストールしてみる。

pi@raspberrypi:~ $ npm i broadlinkjs-rm
/home/pi
└─┬ broadlinkjs-rm@0.2.0
└── @types/node@7.0.51

npm WARN enoent ENOENT: no such file or directory, open '/home/pi/package.json'
npm WARN pi No description
npm WARN pi No repository field.
npm WARN pi No README data
npm WARN pi No license field.

ワーニングは出たが今度は入った。


| トラックバック (0)

2017.12.20

eRemote miniをRaspberry piで操作する準備

Google Homeから、エアコンのスイッチのON/OFFするための準備をする。

準備した学習リモコンは、LinkJapan eRemote mini IoTリモコン

参考にしたのは、こちらだが、ものが違うので少し苦労した。ちなみに、こちらで紹介しているRM mini3は、日本では規制されているらしい。いずれ使えなくなってしまうかもしれないし、そもそもすぐに手に入らなかったので日本版の方を購入した。

■e-Controlのインストール
まずは、eRemote miniをwifiにつなぐために、公式アプリe-Controlを使う。なお、この時に利用するスマホはAndroid。

インストール後、ログインはスキップして進める。
「メニュ-」→「デバイス+」と進んで、wifiを設定する。
RM mini3だと、エラーが出るらしいが、日本版なので問題なく進みます。
青点滅しなくなったら成功。
確認のためにも、リモコンを学習させて、スマホから操作してみる。
これだけでもかなり未来感があります。

■RM Bridgeをインストール
つづいて、RM Bridgeを同じAndroidにインストールします。
このアプリは赤外線信号取得する時に使います。
真ん中の○ボタンをタップすると、IPアドレスとポート番号(多分7474)が表示されるのでチェック。
192.168...から始まるプライベートIPです。

■Fingをインストール
参考サイトには載っていないけど、このあと、Fingを同じくAndroidにインストールします。
こちらは、eRemote miniのmacアドレスを取得するのに使う。
起動すると、同じlan内につながっている機器のリストが表示されます。
提供元に「HangZhou Gubei Electronic...」と表示されたら、それがeRemote mini。
下にmacアドレス(2桁の16進数が6つ表示)が表示されるのでこちらを記録。

■RM Bridge - Code Learningを使って信号を学習
RM Bridge - Code Learningにアクセスする。

「http:// 」の箇所には、RM BridgeでチェックしたIPアドレスとポート番号を入力。
その下のName:のところは空欄。MAC:のところにはFingでチェックしたmacアドレスを入力。
なお、macアドレスは大文字でないとうまく行かない。
Type:は「RM2」と入力。
[Load Devices]をクリックすると、下のStep2 : のところのDevideに「Generic」と表示されます。
ここで、アカウントをきかれたら、RM Bridgeのアプリでのアカウントを入れます。
 User Name : admin
 Password : bridge
と入力。RM Bridgeの右上Settingでも確認できます。

[Learn Code]を選択すると、eRemote miniのLEDが白く光る。これでリモコン学習モードになっているので、試しに何かリモコンを向けて電源を入れると、学習される。

Step4のところで、Plain CommandやCommand URLに長い文字が表示されたら成功。
Command URLにあるリンクにアクセスしてみると、eRemote miniからリモコンが操作される。

これで、eRemoteの準備は完了。

| トラックバック (0)

2017.12.19

Raspberry Pi にhomebridgeをいれる(2)

node.jsではまって進まなかったけど、いろいろい調べたら、HomeAssistantが以外に簡単に入るみたい。

こちらを参考にやってみる。

sudo pip3 install homeassistant

で成功。

hass

として、結構時間がかかったが、.homeassistantのディレクトリは無事作成されていた。

cd .homeassistant/

で移動し、configuration.yamlを編集。

ifconfigで、ipアドレスを確認し、
http://(ipアドレス):8123

で、Welcome Home!と、webページが表示されたら完了。
Home Assistantの制御ページになっている。

| トラックバック (0)

2017.12.18

Raspberry Pi にhomebridgeをいれる

Raspberry Piへのhomebridge導入でかなりハマった。
最新のnode.jsがそもそも入らない。

こちらを参考に

sudo apt-get install -y nodejs npm

として、いろいろ試みるが入らない。


一旦あきらめて、
こちらを参考にまずはラズパイを最新版にあげる。

$ sudo apt-get update
$ sudo apt-get upgrade

このサイトにあわせて、古めのバージョンを入れる。
ただし、入れるバージョンのノードは7.10.1

$ wget https://nodejs.org/dist/v7.10.1/node-v7.10.1-linux-armv6l.tar.gz
$ tar -xvf node-v7.10.1-linux-armv6l.tar.gz
$ cd node-v7.10.1-linux-armv7l
$ sudo cp -R * /usr/local/
$ cd ..

で、入ったのが
$node -v
v7.10.1
$npm -v
4.2.0

となった。

エラーとなったため一旦中断

| トラックバック (0)

2017.12.16

google home でtwitterに投稿

Google Homeが楽天で半額で売ってたのでつい買ってしまった。
一通りGoogle Home基本機能を楽しんだ後、twitter, fbへの投稿をとらいしてみた。
IFTTTを使うと、思いのほか簡単にできたけど、メモに残す。
とはいえ、google のアカウントを複数持っていて、ハマってしまった。

①Googoe Homeの設定
まずは、スマホにGoogle Homeをインストールする。アカウントに注意。
一通り表示に従って登録

②IFTTTのアカウントを作成
つづいて、IFTTTのアカウントを作る。
デザイン性が高くて、パッと見てsign in と sign upが並列に描かれてて、一瞬わかりずらい。
ちなみに新規登録はsign upの方。

③THISを設定
[My Applets]からNew Appletをクリック。
if +this then that
と表示されている。ここで、[+this]をクリックする。
IFTTTはUIがデザインが先行しすぎててわかりやすそうでわかりにくい。
下の方にGoogle Assistantがあるのでそれを選ぶ。
4つほどパネルが表示されるが、そのなかで「Say a phrase with a text ingredient」を選ぶ。

What do you want to say?

の項目に、「ツイッターで $ とつぶやく」と入れる。
$は変数であり、投稿される内容になる。前後に半角スペースを入れる事。
完了したら、Create tritterを選択。

④THATを設定
if ■ then +that
と表示されている。ここで[+that]をクリック。
[TextField]と書かれている所に、$の部分が入る。
投稿手段がわかるように「Google Homeから投稿」と後に入れる。

最後、finishをタップすると完了。

| トラックバック (0)

2017.08.21

PorterDuff.Modeクラスについて

viewに描画する時に、PorterDuff.Modeクラスがある。

2つの画像を16種類の合成方法で、重ね合わせるもので、それぞれに名前がある。

参考になるのが以下のリンク。
Androidアプリ開発

| トラックバック (0)

«Handlerでハマったこと