はじめに
コンピュータシステムをこよなく愛し、システムに携わることが私のライフワークにもなっています。
今回、表題になっている企画するきっかけとなったのは、2018年年初に、当時の事業部長が
“IoTを用いてサービスを作り上げないか?機材購入を支援する”
と募集をかけたことです。
自分の業務のServiceNowと、IoTのRaspberry PIをつなげることを思いつき、IoT企画に参画しました。
この記事では、自分の取り組みを紹介します!
【IoT】MESH使ってIoTやってみまっし!
【IoT】MESH使ってIoTやってみまっし! ~番外編~
【IoT】MESH使ってIoTやってみまっし! ~その2~
【IoT】Sigfoxネットワークで「百葉箱クラウド」作ってみた
【IoT】Google Home+Raspberry Pi+学習リモコンで家電操作してみた
今回使う技術の紹介
ServiceNowとは?
ServiceNowの特徴は何といってもその柔軟性にあります。ServiceNow上で動く、多種多様なアプリを組み合わせることで、あらゆる業務に対応できます。
高度な技術と先進的な考えがServiceNowを支えています。
Raspberry Piとは?
- ・安価(2,000円程度)で購入できる
- ・簡単なプログラムで入出力端子を制御できるので、電子工作に向いている
- ・開発環境もそろっている
- ・Linuxがインストールできるので、サーバやデスクトップパソコンの代わりに使うことも可能
Raspberry Piにはいくつかシリーズがありますが、小さく安く通信ができる、Raspberry Pi Zero Wを今回は選びました。
どんなものを作ったのか?
完成品のRaspberry Pi部分は、こちらになります。
【流れ】
- ・物理スイッチ(ボタン)を押すと、Raspberry Piが「どのボタンが」「何回」「いつ」押されたのかをServiceNowに送ります。
- ・ServiceNowはRaspberry Piから送られてきた情報を、集計し記録します。
- ・ServiceNowが外部連携し、押されたボタンの情報をもとに、ランプを光らせます。
例ではボタンとランプが1対1になっています。ですが、ボタンの押した回数や押したボタンの種類に従って、光らせるランプの種類をServiceNowが制御することが可能です。
ボタンとランプに意味を持たせれば、「(メールが見れない相手に)用事があるよ」と連絡したりと、使い方は多様です。
誰が何回押したかの情報がServiceNowに覚えさせられるので、ボタン連打して、上司に(あいつ何も言わないけれどストレス感じてるのかな…?)とアピールすることもできます。
作り方
プログラムはPythonで記述しました。わずか数十行で動くので楽々でした。
ソースコードをみる
import RPi.GPIO as GPIO import time from datetime import datetime import mysql.connector conn = mysql.connector.connect(user="*******",password="*******",host="localhost", database="midserver") cur = conn.cursor() SWITCH_P = 18 LED_P = 21 led_value = GPIO.LOW GPIO.setmode(GPIO.BCM) GPIO.setup(SWITCH_P, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(LED_P, GPIO.OUT) def callback_change_switch(ch): global led_value print("callback", ch) if ch != SWITCH_P: return if led_value == GPIO.LOW: GPIO.output(LED_P, GPIO.HIGH) led_value = GPIO.HIGH print("HIGH") str = datetime.now().strftime('%Y-%m-%d %H:%M:%S') cur.execute("INSERT INTO timetable (time, no, name) VALUES ('"+str+"','1','midserver');") conn.commit() else: GPIO.output(LED_P, GPIO.LOW) led_value = GPIO.LOW print("LOW") str = datetime.now().strftime('%Y-%m-%d %H:%M:%S') cur.execute("INSERT INTO timetable (time, no, name) VALUES ('"+str+"','1','midserver');") conn.commit() GPIO.add_event_detect( SWITCH_P, GPIO.RISING, callback=callback_change_switch, bouncetime=200) GPIO.output(LED_P, GPIO.LOW) try: while True: time.sleep(0.1) except KeyboardInterrupt: GPIO.cleanup() cur.close conn.close
ボタンカウント情報はMaria DBに記録しました。
Raspberry PiとServiceNowの間にMaria DBを挟み、MariaDBからServiceNowへの連携をJava製アプリの「MID Server」を使って、ノンコーディングでRaspberry PiとServiceNowとを連携させようという試みです。
MID ServerはLinuxでも動くのでRaspberry Piで制御できること、またMID ServerはServiceNowの標準機能で簡単に設定できることが、選んだ理由でした。
ここまでノンプログラミングで簡単に進んでいましたが、この選択がドツボにはまりました。
Raspberry PiはARM CPUを搭載しているのですが、MID ServerはARM CPU向けの環境を想定して作られていなかったため、実行環境設定を細かく変更しなければならなかったのです。
(設定の詳細はここでは割愛します。)
ですが、そこからはスムーズにことが運びました。Raspberry Piから受け取った情報をServiceNowで受け取ってからは、ServiceNowのテーブルとして、画面にフォーム表示やリスト表示ができるので、初期設定のままでも十分使えました。
ここからServiceNowをカスタマイズしてグラフ化してレポート出力する等の加工も、ServiceNowならGUIで簡単に行えます。
ServiceNowからMID Server経由でRaspberry Piにコマンドを送るのも、ServiceNowのトリガーとなる動作の箇所にScriptを記述するだけで簡単に連携できます。
今回はやりませんでしたが、ServiceNowから遠隔操作でRaspberry Piを初期化したり、完全に破壊することも簡単です。
使ってみての感想
今回ハマった「MID ServerでARM CPU向けの環境設定する方法」は、ServiceNowの事例として、英語と日本語で世界に発信しました。
事業部内のIoT企画発表で盛り上がったのもよい思い出です。
こういう取り組みはぜひ続けていきたいです。
最後に
最近、ServiceNowではAIも扱えるようになりました。ServiceNowがシステム化できる範囲は、この記事を読んでいるあなたが想像しているよりも、ずっと広い。
ServiceNowが実現できる具体的なソリューションについては、またどこかで。
最後に、IoT企画を立案した、角田前事業部長に感謝の意を表して、この記事を終わりといたします。ありがとうございました。