houseTemperatureプロジェクトの大詰め

自分の家の天気(気温・湿度・気圧)をRaspberry Piから5分ごとにサーバに送り、それを使っていろいろ遊ぶプロジェクト(github)もそろそろ大詰めだ。使用技術はScala + Play Framework。開発環境にもデプロイにもDockerを利用している。サーバはこのブログと同じさくらのVPSで、nginx-proxyによってサブドメインgyokuroへのアクセスを振り分けている。

ドキュメント

ベースURLはhttps://gyokuro.chao.tokyoで、現状公開しているリソースは以下のとおりだ。

例:
{"status":"200","data":{"time":"00:25:00","temperature":27.7,"humidity":76.7,"pressure":1001.6}}
例:
{"status":"200","data":[{"time":"00:00:00","temperature":27.6,"humidity":76.8,"pressure":1001.7},{"time":"00:05:00","temperature":27.6,"humidity":77,"pressure":1002},{"time":"00:10:00","temperature":27.8,"humidity":76.3,"pressure":1001.9},{"time":"00:20:00","temperature":27.8,"humidity":76.5,"pressure":1001.7},{"time":"00:25:00","temperature":27.7,"humidity":76.7,"pressure":1001.6}]}

iframe化の苦労

WordPressは自由なhtmlをウィジェットに追加できるので、iframeを使って/temperature/nowを常に表示しようと思った。しかしPlay FrameworkはデフォルトでX-Frame-Options: denyが設定されているのでiframeに表示されない。これはクリックジャッキング防止のためだ。クリックジャッキングというのは僕のサイトを透明なiframeにして他のサイトの上に重ねて表示させることで、僕のサイトの任意の箇所を不正にクリックさせる手口だ。

MDNにしたがってX-Frame-Options: allow-from https://example.com/を登録しようと思ったのだが、なんとChromeは対応していない。ブチギレてる。対応してないということで無視されているのでとりあえず動いてはいる。ユーザーがクリックできる箇所はないのでたぶんオッケー(ホンマか?)。

iframeが表示されるようになったはいいが、黒背景に黒文字で表示されていて読めなかった。WordPress側からiframe内のstyleを操作するのは無理っぽかったので上記の通りクエリパラメータで白文字化できるようにして対応した。

頑張って作ったので適当にAPIで遊んでみてください。グラフ化するやつ作ってほしい。

ちなみに現在の状況は27.8 ℃、76.1 %、1001.4 hPa。肌がべたつきやや不快だ。今夜から明朝にかけてすごい降るらしい。通勤はできるかな?

ラーメンを食べられなかった

※この記事は『金麦』を飲んで書かれた。

今日は仕事がしんどかったので帰りに不健康なラーメン(僕の中ではこの言葉は家系ラーメンを指す。なぜなら二郎系は野菜たっぷりで健康的だから)を食べて帰ろうと思った。同僚が「この辺にぃに美味いラーメン屋、あるらしいっすよ」と言っていたのでそこに行った。しかし残念なことに夜はライスが有料だった。

僕は家系ラーメンではライスは2杯〜3杯食べる。にんにく系の味と豆板醤系の味をそれぞれ楽しみたいからだ。

結局ラーメンは食べずに帰宅して焼きそばを食べた。最近は粉ソースではなくさらなる高級感を求めて液体ソースを使っているが、これも特段美味いということはない。そもそも相当な量を入れないと味がしない。そしてコストパフォーマンスが低い。

温度記録サーバはとりあえず公開できた。僕の自宅の気温・湿度・気圧を記録し続けるだけのサービスだ。

https://gyokuro.chao.tokyo/temperature

ちなみに過去ログには以下のような形式でアクセスできる

https://gyokuro.chao.tokyo/temperature/1994/05/17

サーバはScala + Play FrameworkをDockerでデプロイ、センサはRaspberry Pi + BME280でPythonのRequestsライブラリを使ってサーバにログを送信している。計測環境は鉄筋コンクリートでエアコンや換気扇で温度管理していて、Homo sapiensが1匹住んでブログを書いたりしている。

Raspberry Pi Zero WHで温度センサPart.1―キーボード・ディスプレイなしでssh接続するまで

※この記事は『のどごしZERO』を飲んで書かれた

↑6本飲み終わったので次はどうしようか考えている。

Raspberry Piで温度を計測してひたすらネットのどこかに投げ続けるやつ作ってる。Raspberry Piにキーボードを繋げないとセットアップできないのかと思ったが、母艦PCでインストールメディアを作る段階で細工をしておけばいきなりssh接続できる。ssh接続できればなんでもできる。みんな黒い画面好きだよね?

調達

Raspberry Pi Zero WH(2000円@マルツ)はwifiがついていて何かと便利だ。ただし電源供給用のmicro USBケーブルとストレージ用のmicro SDカード(16GB480円@マルツ)、そして母艦となるPCは必要だ。micro USBケーブルの逆側はACアダプタでコンセントに繋いでもいいし(5V3A; 700円@秋月)、Type-AでPCから給電してもいい。micro SDカードに自分でOSのイメージを焼く必要があるのでmicro SDカードが挿さる母艦PCが必要だ。僕の場合はSDカードサイズのマウンタを使ってノートPCのSDカードリーダーに接続した。

母艦PCでインストール準備

Raspberry Pi向けのOSであるRaspbianのイメージをダウンロードし(NOOBSではない)、フリーソフトのEtcherでmicro SDカードに焼く。Raspbianはトラブル対処の自信がある人だけがLiteを選んで良い。Etcherはマルチプラットフォーム対応だがUbuntu16.04で使ったところmicro SDカードを認識しなかったのでWindows10で焼いた。どうしてもUbuntuでやりたい人はイメージファイルを焼く別のソフトを探す必要がある(いくらでもありそう)。焼き終わるとmicro SDカードが(論理的に)取り出されるので物理的に取り出して再挿入する。デバイス名がbootになっているはずだ。

ssh接続を有効にするためboot直下にsshという名の空のファイルを作る。Windowsのメモ帳で作ると勝手にssh.txtになってしかもエクスプローラ上ではsshと表示されるので注意。次に同じくboot直下にwpa_supplicant.confを作る。中身は参考リンクのものをコピペして編集する。これによって自動でwifiに接続するようになる。

Raspberry Piでの作業

micro SDカードを母艦PCから取り出しRaspberry Piに挿入する。その後電源をつなぐ。micro USBが刺さる端子は2つあるがPWRの方だ。緑色のランプが点灯し、Raspberry Piが起動する。

母艦PCからssh接続

母艦PCでターミナルを開きssh pi@raspberrypi.localと打つ。ここまでの手順に間違いがなければssh接続が成功し、パスワードを聞かれる。パスワードはraspberry

大抵なんか間違ってるよ

でも素人は大抵sshで名前解決ができないとか接続拒否とか出る。そのときはRaspberry Piの電源を抜き差ししたり待ったりする。それでもダメならsshファイルを作るあたりから見直す。