IoT入門(1)~温度センサーをkintoneに連携させてみよう!

フォローする

(著者:株式会社ジョイゾー 山下 竜

昨今、機械やセンサー等がネットワークに接続され、クラウドに連携する「Machine to machine(M2M、機器間通信)」、「Internet of things(IoT、モノのインターネット)」が注目を集めています。その考え方や一部分野での適用は以前からあったものですが、近年の「ネットワーク回線構築の低コスト化」や「ハードとソフトのボーダレス化」等も相まって、「ヘルスケア」、「交通」、「産業用機器・設備の保守業務の効率化」、「農業などにおける環境管理の自動化」等様々な分野での活用が進んでいます。更に、M2Mに「2H(to human)」を組み合わせることにより、M2Mで集まったデータをチームで共有し、ワークフロー化して業務プロセスの改善を目指す「Machine to machine to human(M2M2H)」の取り組みについても事例動画]が紹介され、kintoneの非オフィス業務での活用も広がりを見せています。

今回は、M2M2Hの入門として、電子工作でよく用いられているRaspberry Pi(コーディングはPython)を使ってセンサーの値読み出しから、REST APIによるkintoneへの連携を試みたいと思います。これは、私自身が「kintothon#1 in Okinawa(kintoneのHackathon)」で取り組んだ内容の一部書下ろしでもあります。

環境

  • Raspberry Pi Model B Revision 2以上(RASPBIANとネットワークの設定を終えた状態)
  • I2C温度センサー(ADT7410)

出来上がりイメージ

温度データですので、時系列グラフを設定すると次のような画面になります。

※何やらカメラらしきものも実装されていますが、これについては次回お届けしたいと思います

アプリの準備

次のフィールドを含むアプリをご準備ください

フィールド名(例) フィールドコード フィールドタイプ
温度[℃] tempC 数値

Raspberry Piの準備

ここではRaspberry Piのハード的な準備をご紹介します。各項目の括弧内にはコマンドを記載しています。

  • Raspberry Piとセンサーを結線します。Raspberry Pi側とセンサー側の対応を見ながらブレッドボードにジャンパー線を差し込んでいきましょう

図中線色 Raspberry Pi 端子 センサー端子 内容
3.3V VDD センサー電源線
GND GND センサー接地線
SDA SDA データ線
SCL SCL クロック線
  • 「/etc/modules」に「i2c-dev」を追記します($ sudo vi /etc/modules)

  • 「/etc/modprobe.d/raspi-blacklist.conf」で、「blacklist i2c-bcm2708」をコメントアウトします($ sudo vi /etc/modprobe.d/raspi-blacklist.conf)

  • ここで、設定有効化のため一度再起動します($ sudo reboot)
  • I2C動作確認ツールをインストールします($sudo apt-get install i2c-tools)

  • センサーの動作確認を行います。センサーを外した状態と付けた状態で比較すると、今回使っているセンサーの判別がしやすいです。チャンネルは、今回対象としているRev.2以上の場合には1、Rev.1の場合には0とします($ sudo i2cdetect -y {channel})

チャンネルを1としてコマンドを入力すると、アドレスは、「0x48」であることがわかります。

  • PythonのI2Cツールである「python-smbus」をインストールします($ sudo apt-get install python-smbus)

以上でRaspberry PiでI2Cセンサーを使うための準備は完了です。

kintone連携用Python2.7ソースコード

Pythonソースコードの説明

今回はRaspberry Piの「Pi」が「Python」に由来していることから、Pythonで連携スクリプトを記述しました。中身は次の4部構成になっています。

  • I2C(SMBUS)の設定
  • センサーの値読みだし
  • kintone REST API連携
  • ループによる定期実行

全項目、簡単にご説明します。

【I2C(SMBUS)の設定】

 I2CでセンサーをコントロールするためにはRaspberry Piのチャンネルとセンサーのアドレスを指定する必要がありますので、これらを引数としておきます。また、クラス名は今回のセンサーの型式「ADT7410」としておきます。

 Raspberry Pi Model B Revision 2以上(B+含む)はチャンネル1で、ADT7410のアドレスは先に確認した通り0x48ですので、初期化時にこれらの値を代入しておきます。

【センサーの値の読出し】

 計算式はデータシートを見ながら与えていくことになりますが、ADT7410の特徴を簡単に押さえておきましょう。

  • 標準分解能13bit(1bitは符号ビット、12bitが情報ビット)を利用
  • 13bit係数は0625(1/16)
  • 換算式は、データシートP12を参照

「read_i2c_block_data()」関数でレジスタの値を読み出します。self.addressはI2Cセンサーのアドレス(今回は0x48)、0x00は読み出す先頭レジスタのアドレス、2は読み出すビット数を表しています。

【kintone REST API連携】

kintone REST APIの単一レコードの登録(GET/record.json)を実行します。また、認証にはAPIトークンを利用しました。

PythonでHTTPリクエストするためには幾つかモジュールがありますが、今回は標準搭載されている「httplib」を使うことにします。kintoneはHTTPS通信ですので、「httplib.HTTPSConnection(subdomain + ":443")」といった具合に、「HTTPSConnection()」関数に443ポートを指定します。

【ループによる定期実行】

定期実行は今回のようにプログラム中に入れてしまう方法(一種の常駐アプリ)とcrontabを使った方法が考えられます。今回は組み込みらしくプログラム中に入れることにしました。こうした場合には、常駐アプリの死活監視をcrontabに任せたりしますが、ここでは割愛させて頂きます。

Pythonスクリプトの実行

先にご紹介したサンプルコードを例えば「sample.py」として保存したとすると、I2Cデバイスへのアクセスを要しますので「sudo」をつけて「sudo python sample.py」と実行する必要があります。

最後に

今回は、Raspberry Pi を使って、センサーの値の読出しとkintone REST APIによる取得値のデータ連携を行いました。多少の準備は必要ですが、M2M2Hも意外と手軽に出来ることがお分かり頂けたのではないでしょうか?

I2C対応のセンサーは種類豊富で比較的安価に入手できますし、複数実装することも可能です。電子工作とクラウドとの連携、M2M2Hに興味をお持ちの方は是非お試し頂ければと思います。

なお、本稿はRaspberry Piやセンサー、スクリプトの動作を保証するものではありません。

次回はRaspberry Piにカメラをアタッチしてkintoneに静止画をアップロードしてみたいと思います。

 

このTipsは、2014年12月版で確認したものになります。

記事に関するフィードバック

直接的に記事と関連がないご質問はcybozu developer コミュニティをご活用ください。

Avatar
千代田 賢史

時間がとても立ってしまいましたが、娘の自由研究でラズベリーパイを買ったので、温度計として利用してみようと思います。

 

ログインしてコメントを残してください。
Powered by Zendesk