冬休みの工作 google homeでホームオートメーション

冬休みの工作としてgoogle homeで家電を音声操作できるようにしてみた。

ok google! リビングの明かりをつけて 

っていえば電気がつく。

使っているのはこんな感じ

ファイルは下に置いておいた。

IFTTTで作ったrecipeはこんな感じ

f:id:gorakuru:20180107032640p:plain

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/パスワードを書き込み。家庭内でDDNSDHCPが動いていれば、ここで設定したホスト名が登録されるはず。

# 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で自由に表示してください!

f:id:gorakuru:20170107220641p:plain

参考にしたページ

iTunesで紙ジャケットを作る

iTunesのプレイリストを使ってCDを作ったときについでに↓こんな紙ジャケット(?)を作る方法。
画像
まずiTunesでCDを作るためのプレイリストを作ってCDを焼いてしまう。 そしたらまず用紙の準備。ペーパーケースさんとこでカラのジャケットを印刷させてもらいます。 http://papercase.amegan.com/index.php にいって、『音楽CD』を選択、次のページで何も入力しないでそのまま印刷しましょう。 これでまず台紙ができました。 次にいよいよiTunesでリストの印刷。印刷したいプレイリストを表示したら、とりあえず表示するカラムを『名前』と『アルバム』、『アーティスト』程度まで減らしましょ。 次に印刷の設定。 ファイル-印刷を選択。そしたら『曲のリスト』にチェックしてテーマをカスタムにしましょう。そしてそのままページ設定をクリック。 余白を左右1.8、上下3.4に設定。↓こんな感じ。
画像
これで設定は完了。あとは先程印刷した紙をもう一度プリンタにセット。そしたら印刷しましょう。 このとき印刷の上下を間違えないように注意。 あと用紙はどちらも同じ面への印刷でOKです。 あとは紙を折って出来上がり。 この余白はプリンタによっては調整する必要があるのかもしれないです。 それでは have fun! 最後に、ペーパーケースさん、こんないいサービスをありがとうございます!

SPF

SPFって曲者だな。

前の代から受け継いだ研究室のメールサーバでこいつを使ってるんだけど、学内の上位ドメインから転送されてくるメールが今まで全部はじかれてたんだって。

おぅまいがっ!!

たしかに、メールのヘッダを見る限り、上位ドメインが差出人のアドレスのまま送ってきたらSPFははじくよね。

ってかさ、だいたい先生はほぼ上位ドメインのアドレスでメールを受け取ってるみたいで、上位ドメインホワイトリストに登録したらSPFを使う意味がほぼなくなるわけじゃんね。

しかもSPFって別にスパマが勝手にレコード公開すれば見分けつかなくなるじゃん。

。。。いみねぇよ!

今までは害がなかったからほおっておいたけど、こんな害が出てくるんならはずしておけばいいと思ったけど。そう簡単には決まらないんだよね。。。

一番正確にスパムを抑えるなら、人を雇って、そいつが見分けるようにしておけばいんだよ!!

なんていったら自分がその役になるから怖くてなんもいえねぇ!

TeraStationのNFSが使い物にならない

困ったことにTeraStationNFSは現時点で、作成したファイルの所有者が99/99になるという致命的なバグがある。 そこでうまくサーバーの外部ストレージとして使う方法。 簡単に言えば、TeraStation上にループバックファイルを作ってそいつの中にファイルシステムを作ってそいつをマウントする方法。 つまり、Sambaで共有しながらNFSもつかうような方法ではないよ。 だからもしかしたらサーバーにGigabitEtherを一枚つけてTeraStationクロスケーブルで直結すればいいかもしれない。

ループバックデバイスを作る

まず最初にループバックファイルを作る。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を設定する方法

CentOS5でSELinuxの設定をいじくるためにはsetroubleshooterっていうgnomeアプリケーションを使うっぽいんだけど、xwindowのライブラリが入ってない場合はどうするのか。 簡単な方法はaudit2allowを使う方法。 SELinuxをenforcingなりpermissiveにしてエラーをはかせる。 そしたらそのログファイルを指定してaudit2allowに食わせる たとえば
# 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」の設定 - 有村日記