冬休みの工作 google homeでホームオートメーション
冬休みの工作としてgoogle homeで家電を音声操作できるようにしてみた。
ok google! リビングの明かりをつけて
っていえば電気がつく。
使っているのはこんな感じ
- google home mini
- raspberry pi
- ESPr IR赤外線リモコン
- Beebotte
- IFTTT
ファイルは下に置いておいた。
- gorakuru/tamation : https://github.com/gorakuru/tamation
IFTTTで作ったrecipeはこんな感じ
ESPr IR赤外線リモコンっていうので初めてArduinoの互換ボード? を使ってみたけど、ほぼC言語だね。
リモコンコードとかべた書きだからいちいち書き込まないといけないんだよね。あとでからきちんと書き直そう。mallocとかも使えるのかな。
あとはESPrを各部屋に置きたいからrpiとESPr間を1:多の形に変更すれば完成かな。
IFTTTで音声コマンドを組み立てていくと自由度が低いから、時間があればActions on Googleで作ってみようかなと。
raspberry piでfluentd + elasticsearch + kibana
raspberry pi上でdockerを動かして、fluentdとelasticsearchとkibanaを動かす方法
raspberry pi上でdockerをうごかす
hyperiotを使ってpi上でdockerコンテナを動かせるようにする。コンテナイメージはdocker hubでいっぱい公開されてるけど、pi上で動くものはそんなに多くない。rpiとかhypriotとかで探すといい具合。
hypriotイメージの書き込み
下記からイメージをダウンロードして、SDカードに書き込み。windowsならDDwinかなにかで書き込みを。
Downloads · Docker Pirates ARMed with explosive stuff
初期設定
SDカードに書き込んだら、そのままSDカードのルートディレクトリにあるdevice-init.yamlファイルを編集する。
ホスト名と、wifiを使う場合はSSID/パスワードを書き込み。家庭内でDDNSなDHCPが動いていれば、ここで設定したホスト名が登録されるはず。
# hostname for your HypriotOS device
hostname: ホスト名
# optional wireless network settings
wifi:
interfaces:
wlan0:
ssid: "SSID"
password: "パスワード"
起動
作ったSDカードをraspberry piにセットして起動。hypriotのデフォルトのユーザー名とパスワードはpirate/hypriot。ホスト名でSSHするかHDMIをつなげて起動してIPアドレスを調べてもいい。
これでdockerが動く環境ができたので適当にdocker runしてみて動けばOK。
Elasticsearchを動かす
pi2上で動かす場合はメモリサイズをちょっと制限しておいたほうがいい感じ。
## 事前準備
dataディレクトリを作成する。
sudo mkdir /elasticsearch
sudo chown pirate /elasticsearch
esのコンテナを一度実行。これで/elasticsearch内に必要なファイルができる。
docker run -d -e ES_HEAP_SIZE=128m -p 9200:9200 -p 9300:9300 -v /elasticsearch:/data docker pull rpidockers/elasticsearch:1.7.1
docker ps
docker stop <<上記で確認したコンテナのID>>
設定ファイルの修正
/elasticsearch/config/elasticsearch.ymlをよしなに設定。
例えば
#bootstrap.mlockall: true
を有効化
bootstrap.mlockall: true
esの起動
ES_HEAP_SIZEを小さめにするために環境変数として指定。
docker run -d -e ES_HEAP_SIZE=128m -p 9200:9200 -p 9300:9300 -v /elasticsearch:/data rpidockers/elasticsearch:1.7.1
esの起動
dockerのお作法に基づき、環境変数を渡す形で
docker run -d -e ES_NETWORK_PUBLISH_HOST=192.168.11.202 -e ES_CLUSTER_NAME=tamurake -e ES_HEAP_SIZE=128m -p 9200:9200 -p 9300:9300 -v /elasticsearch:/data rpidockers/elasticsearch:1.7.1
ちなみに2台目以降はunicastでクラスタに入るために、ES_UNICAST_HOSTSを追加してあげる
docker run -d -e ES_NETWORK_PUBLISH_HOST=192.168.11.214 -e ES_CLUSTER_NAME=tamurake -e ES_UNICAST_HOSTS=[\"192.168.11.202\"] -e ES_HEAP_SIZE=128m -p 9200:9200 -p 9300:9300 -v /elasticsearch:/data rpidockers/elasticsearch:1.7.1
kibanaを動かす
上で起動したESを指定してkibanaを起動する
docker run -d -p 5601:5601 -e ELASTICSEARCH=<<接続するESのIPアドレス>>:9200 rpidockers/kibana
fluentdを起動する
elasticsearchとmqtt、SNMPとdriveを入れたfluentdのコンテナを作ったので、それを使う。
事前準備
configファイルを作成する。/fluentd/fluent.conf こんな感じ?
<source>
type mqtt
host <<mqttサーバ>>
port <<mqttサーバのポート>>
topic '/sensor/+'
username <<mqttサーバのユーザー名>>
password <<mqttサーバのパスワード>>
format json
</source>
<match .sensor.sensor>
type elasticsearch
host <<esサーバ>>
port 9200
logstash_format true
logstash_prefix sensor
</match>
<source>
type snmp
tag snmp.apart.nas.eth0.in
nodes name, value
host <<エージェント>>
community <<community名>>
mib ifHCInOctets.2
method_type get
polling_time 10
polling_type async_run
</source>
<filter snmp.**>
type record_transformer
<record>
obj ${tag}
</record>
</filter>
<match snmp.**>
type derive
add_tag_prefix derive
key1 value *8
min 0
</match>
<match derive.snmp.**>
type elasticsearch
host <<esサーバ>>
port 9200
logstash_format true
logstash_prefix snmp
</match>
fluentdの起動
docker run -d -v /fluentd:/fluentd/etc gorakuru/rpi-fluentd-mqtt-elasticsearch
kibanaで可視化
あとはesにたまったデータをkibanaで自由に表示してください!
参考にしたページ
てすととうこう
- test
iTunesで紙ジャケットを作る
SPF
SPFって曲者だな。
前の代から受け継いだ研究室のメールサーバでこいつを使ってるんだけど、学内の上位ドメインから転送されてくるメールが今まで全部はじかれてたんだって。
おぅまいがっ!!
たしかに、メールのヘッダを見る限り、上位ドメインが差出人のアドレスのまま送ってきたらSPFははじくよね。
ってかさ、だいたい先生はほぼ上位ドメインのアドレスでメールを受け取ってるみたいで、上位ドメインをホワイトリストに登録したらSPFを使う意味がほぼなくなるわけじゃんね。
しかもSPFって別にスパマが勝手にレコード公開すれば見分けつかなくなるじゃん。
。。。いみねぇよ!
今までは害がなかったからほおっておいたけど、こんな害が出てくるんならはずしておけばいいと思ったけど。そう簡単には決まらないんだよね。。。
一番正確にスパムを抑えるなら、人を雇って、そいつが見分けるようにしておけばいんだよ!!
なんていったら自分がその役になるから怖くてなんもいえねぇ!
TeraStationのNFSが使い物にならない
ループバックデバイスを作る
まず最初にループバックファイルを作る。NFSでマウントしたらそいつの上で# dd if=/dev/zero of=disk0 bs=1M count=500としてファイルを作る。次に
# losetup /dev/loop0 disk0としてデバイスに関連つける。
ファイルシステムを作る
あとは普通のファイルシステムを作るように# /sbin/mke2fs /dev/loop0としたら最後にマウントしてみる。
# mount /dev/loop0 /mnt/loopこれで完成。 大体NFS上にループバックファイル作るときで10.8MB/s、ループバックマウントした上にddで300M位のファイルを作るときで13.1MB/s くらい。 大いにキャッシュ効いてるみたいだ。 syncモードで実験してみないと。 ちなみに100BASE-TXで512MメモリでPentium4、2GHzなくらいのマシンでの話し。
参考
CentOS 5.2 でSELinuxを設定する方法
# audit2allow -i /var/log/messages -m myそうすると必要そうなポリシーが表示されるのでそれでよさそうならコンパイル済みのポリシーファイルを作る。
# audit2allow -i /var/log/messages -M my ←mが大文字そうするとコンパイル済みポリシーがカレントディレクトリにできるのでそいつをselinuxに組み込む。
# semodule -i my.ppこれで動くようになると思う。 ちなみに間違ったモジュールを読み込ませて削除する場合は
# semodule -r myで削除。 参考:SELinuxをEnforcingにした「Clam AntiVirus」の設定 - 有村日記