おんどとりでIoT その2 Pythonで温度を取得

pythonではsocketライブラリを使う

 インターネットで通信をするUNIXのソケット・プログラムをpythonで利用するには、socketライブラリをimportします。

 3行目は定型の記述で、4行目はこれからつなごうとしているおんどとりのIPアドレス、ポートは通信仕様書に書かれた数字です。

#!usr/bin/env python
import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.111.52", 57172))
print "send "

 s.sendでおんどとりへ、温度情報を送ってもらうコマンドを送信します。100バイトを受信したのち通信を終了し、受信したデータを16進に変換します。

s.send(bytearray([0xAB,0x01,0x16,0x52,0x0b,0x00,0x01,0x33,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x38,0x00]))
data = s.recv(100)
s.close()
d = data.encode('hex')

 通信仕様書には、5バイト目からch1の温度データ、6バイト目からch2の温度データが入っていると書かれているので、バイト・スワップして、10進数に直します。1000のオフセットがついているので引き、10倍されている整数値なので、10.0で除して温度を得ます。

print (int(str(d[12:14]+d[10:12]),16) -1000)/10.0
print (int(str(d[16:18]+d[14:16]),16) -1000)/10.0

温度を得るコマンドの詳細

 コマンドのフレーム構造を次に示します。今使っているモデルには「521601AB」とシリアル番号が書かれているので、データは、16進で「0xAB,0x01,0x16,0x52」です。次に示す温度を得るコマンドは11バイトなので、「0x0b,0x00」。

 温度を得るコマンド本体は次の構成です。データ長は4バイトなので0x04,0x00。SUMは0x38,0x00。したがって、16進で「0x01,0x33,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x38,0x00」です。

 受け取ったデータの構成です。

 0E05と0705が受け取った16進数の温度データです。順序が逆になっているので050Eと0507と逆にし、10進に直します。仕様書には、この生データを10で割って100を引くと温度が得られると書かれています。

 プログラムはファイル名ondotori-1a.pyで保存しました。ラズパイなら実行権を付けます。Windowsならば、そのまま実行すると温度データが表示されます。

コラム WindowsにPython2.xをインストールする

 ラズパイの環境でpythonを利用しましたが、とくにプラットホームは選びません。

 Windowsのpythonはダウンロードしてインストールします。C:\Python27にインストールされたので、pathを通します。

>set PATH=C:\python27;%PATH%

(2017/01/27)set PATH=C:\python27:%PATH% ->set PATH=C:\python27;%PATH%に修正。