空間放射線量データを公開しているSafecast。REST API経由で定点観測データを自動送信するには?

[markdown]
[とらんじしょん昭島(地域活動)](http://nrda83.wix.com/ttakishima#!blank-3/g3o7j)の一環で、空間線量定点観測所があるといいよねって話になって、システム構成検討中。そのメモ記事です。
## 全体の構成
絵にしたいとこですが、今の所はざっくり箇条書きで。
1. 空間放射線量計測センサー
2. 計測データ集計・送信用マイコン
3. データベースサーバ(Safecastさんのデータベースに蓄積したい)
4. 計測データ閲覧用フロントエンド(WebブラウザだったりiPhoneアプリだったり)
以下に詳細を書き留めます。
### 空間放射線量計測センサー
以下の3候補のうちの何れか。
電子工作ではおなじみ?のSparkFunが出しているGeiger Counter。個人輸入すれば$149程度です。コンパクトなガイガーミュラー菅は、LND712だそうです。
[![](http://www.marutsu.co.jp/contents/shop/marutsu/img/goods/020/580417/580417_2.jpg)](http://www.marutsu.co.jp/pc/i/580417/)
探してみると、意外とありますね。こちらはAdafruit製。$100切ってます。安い。ガイガー菅はSbM20っぽい。
[![](https://cdn-shop.adafruit.com/970x728/483-00.jpg)](https://www.adafruit.com/product/483)
そしてGM-10。3つの中では一番高くて、$199。SparkFunのと同LND712を使っているようです。
[![](http://www.blackcatsystems.com/pics/GM/GM10usb.jpg)](http://www.blackcatsystems.com/GM/products/GM10GeigerCounter.html)
これらは全て、USBシリアル経由でASCII文字コードを出力するので、それらを1分間数えてあげればcpm(count per minute)単位でデータが取得できます。これをμSv/hに変換してやればいいわけですが、**[簡易なカウント数からシーベルトへの換算](http://www.utsunomia.com/y.utsunomia/Kansan.html)**で書かれているLND712の係数を参考にすれば良さそう。
### 計測データ集計・送信用マイコン
SparkFunのGeiger CounterにはArduinoが載っているので、Ethernetボード+無線コンバータかませばいいかな? と思ったんですが、コストかかりすぎるので、$5マイコンボード Raspberry Pi Zeroを採用したい。

コストが安いのもいいのだけど、この安さと小ささでLinuxが動くもんだから、何でもできてしまうのが良い。これに格安の無線LAN USBドングル付ければ、データ送信部の出来上がり。
難点は、入手が困難ということか…。今のところ、一人当たり1ボードのみ購入できます、という状態。品薄状態が早く解消されないかなぁ。
### データベースサーバ
空間放射線量計測用キットを自前で設計、開発したり、そのキット制作ワークショップを開催したり、データを蓄積するデータベースをオープンにしていたりと、何かと先進的な取り組みをされているSafecastさんという団体を見つけまして。

こちらに全てのデータを提供しつつ、データベース等のインフラを間借りさせていただけないかなぁ… と目論見中。そのうちコンタクトとってみようと思ってます。
ただ、[Safecast API](https://api.safecast.org/en-US/measurements)でアカウント作成してAPI仕様を見ても、計測データをcurlとかでPOSTするのに必要なクエリが分からなかったので、Google Chromeのデベロッパツールや**[Safecastさん提供のgithubコード](https://github.com/Safecast/measurement_count/blob/master/safecast_measurement_count.js)**を参考に、コマンドベースでデータ送信できることを確認しました。
Safecastさん提供のWebアプリ経由で観測データをアップロードするまでの操作をGoogle Chromeデベロッパツールでトレースしてみると、以下のようなデータをPOSTしていることが分かります。
```
[General]
Request URL:https://api.safecast.org/en-US/measurements
Request Method:POST
Status Code:302 Found
Remote Address:162.243.100.197:443
[Response Headers]
Access-Control-Allow-Methods:GET, OPTION
Access-Control-Allow-Origin:*
Cache-Control:no-cache
Connection:keep-alive
Content-Type:text/html; charset=utf-8
Date:Fri, 19 Aug 2016 04:43:08 GMT
Location:https://api.safecast.org/en-US/measurements/70276074
...
[Form Data]
utf8:✓
authenticity_token:xxxx
measurement[value]:0.28
measurement[unit]:usv
measurement[captured_at]:25 December 2014, 14:00:00
measurement[location_name]:栃木県那須塩原市二区町周辺
measurement[latitude]:36.867139847134666
measurement[longitude]:139.95172936359324
measurement[device_id]:155
measurement[height]:1m
measurement[surface]:Soil
measurement[radiation]:Air
```
これと、先ほどの[Safecastさん提供githubコード](https://github.com/Safecast/measurement_count/blob/master/safecast_measurement_count.js)に実装されているapi_keyクエリを追加したPythonコードが以下になります。
```python
data = {
"utf8": "✓",
"measurement[value]": 0.11,
"measurement[unit]": "usv",
"measurement[captured_at]": "25 December 2014, 14:00:00",
"measurement[location_name]": "埼玉県羽生市大字弥勒周辺",
"measurement[latitude]": 36.180948,
"measurement[longitude]": 139.585453,
"measurement[device_id]": 155,
"measurement[height]": "1m",
"measurement[surface]": "Soil",
"measurement[radiation]": "Air",
}
requests.post("https://api.safecast.org/en-US/measurements?api_key=xxxx", data=data)
```
[この通り](https://api.safecast.org/en-US/measurements/70288333)、しっかり反映されました。
![](https://farm9.staticflickr.com/8869/28805268700_e0cc160158_z_d.jpg)
### 計測データ閲覧用フロントエンド(WebブラウザだったりiPhoneアプリだったり)
Safecastさんとコラボさせてもらえれば、こんなカッコイイ線量マップが参照できてしまいます。すごい…。

## まとめ
早いとこ全体構成図を描いて、Safecastさんにコンタクト取りたいと思います。
[/markdown]

Close Bitnami banner
Bitnami