IoTで使うPython入門Step3-計測 (7) 温度計おんどとり

 おんどとりは、2個の温度センサを備え、USBとLAN(有線もしくはWi-Fi)のインターフェースをもった温度計です。PCにデータを保存したり、同社のクラウドに保存もできます。センサは、用途に合わせてステンレス保護管入りに交換もできます。

クライアント・ソフトを立ち上げてIPアドレスを設定

 Windows 10の環境で操作します。
 おんどとりTR-71nwのクライアント・ソフトをインストールしておき、PCとミニUSBケーブルをつなぐと、TR-wf/nf操作プログラムが立ち上がります。おんどとりとは有線LANをハブにつなぎます。電池は入れなくてもUSBから供給されます。

 右の操作画面の自動送信設定タブを開き、DHCPをOFFにして、任意の固定IPアドレスとサブネットマスクを入れます。外に出ないのでゲートウェイ・アドレスは入れません。

192.168.111.52
255.255.255.0

 設定送信を押します。ネットワークの設定に成功しましたとパネルが出ます。PCのコマンド・プロンプトから、pingで設定したIPアドレス192.168.111.52を確認します。
 応答があれば、設定完了です。

 通信仕様書は(株)ティアンドデイに問い合わせて入手しました。この設定したIPアドレスと、仕様書に書かれているポート番号 : 57172を使って通信をします。

プログラム

 通信仕様書に従ってデータをソケットのプログラムで読み出します。送っているコマンドと読み取ったデータ・フォーマットの詳細はこちらの記事を参照ください。

 動作確認のプログラムです。

import socket 

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.111.52", 57172))

print "send "
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')
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

 連続読み出しは、次のプログラムになります。Python 2.7用です。コマンド列を送るのは、3通りのどれでもかまいません。

import socket 
from time import sleep

ipAddr = "192.168.111.52"
ports = 57172

while 1:
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ipAddr, ports))
#s.send(bytearray([0xAB,0x01,0x16,0x52,0x0b,0x00,0x01,0x33,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x38,0x00]))
#s.send(bytearray(b'\xAB\x01\x16\x52\x0b\x00\x01\x33\x00\x04\x00\x00\x00\x00\x00\x38\x00'))
s.send(bytes(b'\xAB\x01\x16\x52\x0b\x00\x01\x33\x00\x04\x00\x00\x00\x00\x00\x38\x00'))
data = s.recv(100).encode('hex')

print "ch1: ", int((data[12:14]+data[10:12]),16) / 10.0 - 100
print "ch2: ", int((data[16:18]+data[14:16]),16) / 10.0 - 100
s.close()
sleep(1)

 次に、読み取った温度をMQTTでBrokerに送ります。Python 3.7用です。Windowsでの実行はpyを使います。最初、Whileの手前で、connect()を行い、コマンドの送信と読み取りをループの中で行うプログラムを作りました。しかし、通信が途中で切れるので、毎回、connect()、close()を行っています。
 第1回の34461Aのソケットを使ったプログラムのときは、1秒程度の間隔で読み取りを行っても一度connect()した通信は継続して行えました。
 ソケットの常識的な扱いを知らないので、このような場当たり的な対処になっています。

import socket 
from time import sleep
import paho.mqtt.publish as publish

ipAddr = "192.168.111.52"
ports = 57172
topicCh1 = "tr-71nw/temp/ch1"
topicCh2 = "tr-71nw/temp/ch2"
host = "raspberrypi.local"

while 1:
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ipAddr, ports))
#s.send(bytearray([0xAB,0x01,0x16,0x52,0x0b,0x00,0x01,0x33,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x38,0x00]))
#s.send(bytearray(b'\xAB\x01\x16\x52\x0b\x00\x01\x33\x00\x04\x00\x00\x00\x00\x00\x38\x00'))
s.send(bytes(b'\xAB\x01\x16\x52\x0b\x00\x01\x33\x00\x04\x00\x00\x00\x00\x00\x38\x00'))
data = s.recv(32).hex()
tempCh1 = round(( int((data[12:14]+data[10:12]),16) / 10.0 - 100),1)
tempCh2 = round(( int((data[16:18]+data[14:16]),16) / 10.0 - 100),1)
print ("ch1: ", tempCh1)
print ("ch2: ", tempCh2)
msg = [{'topic':topicCh1, 'payload':str(tempCh1)}, ( topicCh2, str(tempCh2), 0, False)]
publish.multiple(msg, hostname=host)
s.close()
sleep(1)