Raspberry Piで取得した温度をXivelyにアップロードする
ありきたりですがやってみました。
使ったのは気圧も計測できるMM_TXS03というモジュール。
センサ自体はLPS331APというやつみたいです。
I2C経由で取得した温度データと気圧データを流行りのXivelyに
アップロードしてグラフ化します。
I2Cでセンサにアクセスするまでの手順は下記サイトのとおりにすればOK。yamaryu0508.hatenablog.com
Xivelyの登録も下記を参照。
Raspberry PiとBME280でXivelyにデータを送信するガジェットをつくる - ペンギン養殖中
ほとんど上記サイトのパクったコードですが、
MM_TXS03にカスタマイズしたコードをさらしておきます。
#!/usr/bin/python import sys,time import smbus import urllib2, json, requests INTERVAL = 60*0.5 # second API_KEY = "YOUR_API_KEY" FEED_ID = "YOUR_FEED_ID" # register addr LPS331_WHO_AM_I = 0x0F LPS331_PRESS_OUT_XL = 0x28 LPS331_PRESS_OUT_L = 0x29 LPS331_PRESS_OUT_H = 0x2A LPS331_TEMP_OUT_L = 0x2B LPS331_TEMP_OUT_H = 0x2C LPS331_CTRL_REG1 = 0x20 LPS331_CTRL_REG2 = 0x21 LPS331_CTRL_REG3 = 0x22 class Xively: def __init__(self,feedId,apiKey): self.feedId = feedId self.apiKey = apiKey def registToXively(self,channel,dataPoints): request = { 'datastreams' : [ {'id' : channel, 'current_value' : dataPoints}]} requestJson = json.dumps(request) url = "https://api.xively.com/v2/feeds/" + self.feedId + ".json" headers = {"X-ApiKey": self.apiKey} res = requests.put(url, headers=headers, data=requestJson) return res xivelyDevice = Xively(FEED_ID,API_KEY) class MM_TXS03: DEVICE_ADDRESS = 0x5d BUS_CHANNEL = 1 def __init__(self,address = DEVICE_ADDRESS,channel = BUS_CHANNEL): self.address = address self.channel = channel self.bus = smbus.SMBus(self.channel) self.t_fine = 0 data = self.bus.read_byte_data(self.address,LPS331_WHO_AM_I) # print 'ID:0x%x' % data self.bus.write_byte_data(self.address,LPS331_CTRL_REG1,0xE0) def getTemperature(self): temp_lsb = self.bus.read_byte_data(self.address,LPS331_TEMP_OUT_L) # print '0x%x' % temp_lsb temp_msb = self.bus.read_byte_data(self.address,LPS331_TEMP_OUT_H) # print '0x%x' % temp_msb temp_raw = (temp_msb << 8) | (temp_lsb << 0) if temp_raw & (1<<15): temp_data = 42.5 - ((temp_raw^0xffff) + 1)/480. else: temp_data = 42.5 + temp_raw/480. return temp_data def getPressure(self): press_xl = self.bus.read_byte_data(self.address,LPS331_PRESS_OUT_XL) # print '0x%x' % press_xl press_lsb = self.bus.read_byte_data(self.address,LPS331_PRESS_OUT_L) # print '0x%x' % press_lsb press_msb = self.bus.read_byte_data(self.address,LPS331_PRESS_OUT_H) # print '0x%x' % press_msb press_raw = (press_msb << 16) | (press_lsb << 8 | press_xl) if press_raw & (1<<23): press_data = -((press_raw^0xffffff) + 1)/4096. else: press_data = press_raw /4096. return press_data mm_txs03 = MM_TXS03() while True: temp = round(mm_txs03.getTemperature(),1) press = round(mm_txs03.getPressure(),1) xivelyDevice.registToXively('Temperature',temp) xivelyDevice.registToXively('Pressure',press) time.sleep(INTERVAL)
スクリプトを起動すればXivelyにデータが1秒ごとにアップロードされます。
# python ~/work/rasp/raspi_xively.py
ただ、長時間動かしているとスクリプトが異常終了するみたいなので、
cronで定期的に再起動させるようにしてます。
ってか、最近メンテナンスとかでXivelyに繋がらなくなった。。。