# -*- coding: UTF-8 -*- #!/usr/bin/env python # # 太陽電池の発電量と電圧をzivelyにアップロード # 2014/6/21 ラジオペンチ # http://radiopench.blog96.fc2.com/ # xi27.py import xively import subprocess import time import datetime import requests import serial # set feed_id and api_key FEED_ID = "************" API_KEY = "***********************" DEBUG = "DEBUG" # api client 初期化 api = xively.XivelyAPIClient(API_KEY) feed = api.feeds.get(FEED_ID) # 電力 power def get_datastream_watt(feed): try: datastream_watt = feed.datastreams.get("power") if DEBUG: print "Found power" return datastream_watt except: if DEBUG: print "Creating new datastream" datastream = feed.datastreams.create("power", tags="max30W") return datastream # パネル電圧 voltage def get_datastream_volt(feed): try: datastream_volt = feed.datastreams.get("voltage") if DEBUG: print "Found voltage" return datastream_volt except: if DEBUG: print "Creating new datastream" datastream = feed.datastreams.create("voltage") return datastream # 本日の累積発電量 wh_today def get_datastream_wh_today(feed): try: datastream_wh_today = feed.datastreams.get("wh_today") if DEBUG: print "Found wh_today" return datastream_wh_today except: if DEBUG: print "Creating new datastream" datastream = feed.datastreams.create("wh_today") return datastream # # メインルーチン # def run(): print "Start GTI data transfer to xively" con=serial.Serial('/dev/ttyUSB0', 9600) # USBシリアルポートを接続 print con.portstr # ポートの情報を出力 str=con.readline() # ゴミが入っているのを捨てる feed = api.feeds.get(FEED_ID) datastream_watt = get_datastream_watt(feed) datastream_volt = get_datastream_volt(feed) datastream_wh_today = get_datastream_wh_today(feed) counter = 0 while True: # 無限ループで str = con.readline() # USBから一行読んで n = str.count(",") # デリミッタの数が if n== 5: # 5個なら該当データーとみなし counter += 1 if counter == 5: # 5回目なら xx = str.split(',', 6)[2] # 電圧取り出し volt = int(xx)/10.0 # 電圧 datastream_volt.current_value = volt # 電圧を記録 datastream_volt.at = datetime.datetime.utcnow() try: datastream_volt.update() except requests.HTTPError as e: print "HTTPError({0}): {1}".format(e.errno, e.strerror) elif counter == 10: xx = int(str.split(',', 6)[4]) # 発電量のデータを取り出し xx = (xx + 50) / 100 # 有効桁数を調整 watt = xx/100.0 # スケーリング datastream_watt.current_value = watt # 電力を記録 datastream_watt.at = datetime.datetime.utcnow() try: datastream_watt.update() except requests.HTTPError as e: print "HTTPError({0}): {1}".format(e.errno, e.strerror) elif counter == 15: xx = str.split(',', 6)[5] # 本日の発電量のデータを取り出し wh_today = int(xx)/100.0 # スケーリング datastream_wh_today.current_value = wh_today # 本日累積電力を記録 datastream_wh_today.at = datetime.datetime.utcnow() try: datastream_wh_today.update() except requests.HTTPError as e: print "HTTPError({0}): {1}".format(e.errno, e.strerror) counter = 0 print volt, watt, wh_today, datetime.datetime.utcnow() run()