foresta profonda

眠くない日はない。

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に繋がらなくなった。。。