開発ネタ。たぶん使えない。

雑談というか…

昔話

ここまでRaspberryPiを触ってきて、昔持ちかけられたネタが、今の環境で実現できないかと思い、作ってみることにしました。

ネタとしては、遠隔地(山の中や諸島部という環境)に通信中継設備が設置されていて、設備などのトラブル状態を放置すると、その後の動作に大ダメージを受けるという問題点があるというものでした。そのため温度なども含めてある程度の管理を行う必要がありました。(温度が上がると管路の抵抗値が上がり、素材である銅板が溶けるなどという事象があった会社もあったそうです。)

最近、IoTのブームがあるので比較的少額でセンサー情報をネットに送信することができる様になってきていますが、当該の設備設置場所は電波環境が悪くインターネット回線(携帯回線)を準備することが困難という状況。また、安価なフリーSIMがでてきていますが、契約が法人となるとちょっと手軽には使用できないといったところもちょっとアレ。唯一ある通信手段はアナログ電話ぐらいというところも結構多いと聞いている。(もっとひどいときは無線を使う。)

アナログ電話があれば、PPPを使用したダイヤアップサービスの使用を考えられますが、最近のキャリアでもインターネット接続サービスが減っていて、あってもキャリア固有のものになった。キャリア固有となると発信側の回線契約やプロバイダー契約がないと使用できないなどの制限があってそれも困る要因。

www.softbank.jp

www.plala.or.jp

プロバイダならBIGLOBE : ダイヤルアップ接続

普通に考えれば通信キャリア固有のダイアルアップサービスであっても「問題あるの?」という話になりますが、契約処理・請求書処理が面倒なので、他のキャリア使用不可という闇の要望があったりする。

10年ほど前は、かなりコスト的に八方ふさがりだったので少しコストの制約を緩めてもらい、中古のPCなどを使ってダイアルアップして実現していました。

【旧システムの構成】

→ フリーのダイアルアップサービス + 中古PC(PPP処理&メール送信) + モデム + PIC + センサー

要望まとめ

  • 遠隔地のセンサー情報を取得する
  • 通信はアナログ電話のみ
  • センサーは閾値を超えたらアラームを出す(メールがいいらしい)
  • できれば、センサーの動作確認はしたい
  • キャリアなどとの契約はしたくない
  • プロバイダーはもってのほか
  • 安いこと超重要(10000円程度)

いまではRaspberryPiが普通に手に入るので昔あったBBSみたいなシステムを作るか…と思ったりもしたのですが、違う可能性を考えてみました。

お手軽にやる!

これまでのエントリを組み合わせればできそうな気がしていた。

RaspberryPiでアナログモデムを使った発呼をすることはできました。センサーの値ではなく閾値を超えたことを通知できればいいので、この状態になったときにある電話番号に電話をかけることはできます。

uepon.hatenadiary.com

IFTTTサービスを使えばAndroid端末に電話があったにも関わらず、通話ができなかったことをトリガーとして、Gmailにメールを送信することができます。

uepon.hatenadiary.com

この二つを組み合わせて、できないかと考えました。

  1. RaspberryPiでセンサー情報を定期的に取得する
  2. センサー状態が閾値を超えたことを検知する
  3. Android端末に向けて電話をかける
  4. 電話をかける時間は数秒。(基本ワン切り
  5. 電話のIFTTT着信トリガーをもとにGmailでメールの送信する

RaspberryPiとモデム、センサーまで合わせても1万円程度で収まると思います。 そして通信費は電話を取らない限りは無料。

思うところはありますが、なんとかなっているかなと思います。

センサーからの情報取得に関してはこれから調べていくことにしますが、そのほかの部分をつらつらと書いていくと

RaspberryPiで電話かける

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import serial
import time

ser = serial.Serial('/dev/ttyUSB0', baudrate=115200, timeout=3)
ser.write("atz\r\n")
print(ser.read(16))
ser.write("atdt1860ABCDEFGHIJ\r\n")
print(ser.read(32))
print('---wait---')
time.sleep(10)
ser.write("\r\n")
print(ser.read(32))
ser.close()

以前のエントリの中身を少し見直すことでpythonから電話をかけることができます。

電話をかけているのは次の部分ですが、0ABCDEFGHIJがかけ先の番号です。

ser.write("atdt1860ABCDEFGHIJ\r\n")

186とつけているのはIFTTTで不在着信元の電話番号がわかっていないといけないので186(強制発信番号通知)をつけてます。あと ATコマンドは改行コードが必要なので\r\nもつけています。

IFTTT側の設定

特定の電話番号からの不在着信をうけて、Gmailでメールを送信するものを作成します。

IFTTTのWebサイトからレシピの作成を選択

f:id:ueponx:20160514154448j:plain

レシピのトリガの設定

f:id:ueponx:20160514154920j:plain

トリガーチャンネルの選択画面から

f:id:ueponx:20160514155001j:plain

Android Phone Call】を選択

使用する前には事前認証が必要なので別途行ってください。

f:id:ueponx:20160514155044j:plain

トリガーの詳細画面に遷移します。

f:id:ueponx:20160514155217j:plain

いくつかある中から「Phone call missed from a specific number」(特定番号からの不在着信)を選択

f:id:ueponx:20160514155423j:plain

不在着信を検知したい番号を入力します。

f:id:ueponx:20160514155453j:plain

ここではサンプルのため00000000000を指定しています。ここでは186などを記載する必要はありません。数字以外ではエラーがでます。

f:id:ueponx:20160514155625j:plain

次はアクションを設定します。

f:id:ueponx:20160514155638j:plain

アクションチャンネルの一覧から

f:id:ueponx:20160514155753j:plain

gmailを選択します。 gmailの利用に関しても事前に設定が必要なので適宜おこなってください。

f:id:ueponx:20160514155937j:plain

gmailには「Send an email」しかないので選択します。

f:id:ueponx:20160514160017j:plain

詳細の設定を行います。

f:id:ueponx:20160514160115j:plain

宛先アドレスとタイトル、本文、URL添付を設定できます。 入力BOXにカーソルを合わせると使用できるタグのサポートがありますので それを見ながら決定を行います。

  • ContactName 名前
  • FromNumber 発信番号
  • OccurredAt 時刻

などを入れることができるようです。

f:id:ueponx:20160514160125j:plain

この画面で【Create Recipe】ボタンを押せば完了です。

先ほど設定した番号から先のpythonプログラムで発呼を行えば、Gmailに通知が行われます。

無事かつ、お手軽にできた!

モデムから発呼を行う処理はコーディングしましたが、後ほかは設定だけでできてしまいました。IFTTT様々です。

【新システムの構成】

→ Android(受信側) + RaspberryPi + IFTTT + Gmail + センサー

温度などのアナログの値をセンサー情報を値として通知することはできませんが、閾値などに変えればほとんど通信費などをかけずに通知が行えるので古いAndroid端末の再利用もできるのかもしれません。

おわりに

こんな闇の深い制約条件の開発を業務の合間(開発が本業でもない人)にできないか聞いてくるような会社は注意しましょう。