Skip to content

Instantly share code, notes, and snippets.

@tom-a
Last active December 30, 2019 16:51
Show Gist options
  • Save tom-a/e53e2aa2d042cd7283dff81ded5c65b6 to your computer and use it in GitHub Desktop.
Save tom-a/e53e2aa2d042cd7283dff81ded5c65b6 to your computer and use it in GitHub Desktop.
# Epsolar TechnologyのTRIRON2210N-DS1-UCSをモニタ。
# 専用ケーブルはRS-485とUSBを相互に変換する。
# プロトコルはmodbusで、ドキュメントは1733_modbus_protocol.pdf
# ドキュメントによると、input registerの0x3100あたりで太陽電池パネルや、
# バッテリーの電圧を読み出せる。
# ただし0x3105はバッテリー充電電流で、
# バッテリーから電流が流れ出していても充電ではないので0になる。
# トータルでバッテリーに流れる電流は、0x331bとox331cから読み出す。
# 2の補数表現なので、Pythonでスマートに解決する方法がわからなかった。
#
# 各レジスタはてっきり1バイトだと思っていたら、2バイトのようである。
# なお、input registerの値は総じて100倍した値が返ってくる。
#
# コントローラーもambientも時々アクセスしそこねるので、例外処理を入れた。
#
# ambidata.ioに投げる方法はhttps://ambidata.io/refs/python/を参照のこと。
# モジュールのインストールはドキュメント通りではうまくいかず、githubから
# ローカルにダウンロードして、pipコマンドの引数に該当ディレクトリを指定した。
# pymodbusとpyserialもインストールした。
import ambient
import datetime
import logging
from pymodbus.client.sync import ModbusSerialClient
import requests
import time
logging.basicConfig(filename='c:/Users/tom-a/log/solor.log', level=logging.INFO)
client = ModbusSerialClient(method = "rtu", port="COM3",stopbits = 1, bytesize = 8, parity = 'N', baudrate= 115200, timeout= 1.0)
while True:
connection = client.connect()
result1 = client.read_input_registers(address=0x3100,count=8,unit=1)
result2 = client.read_input_registers(address=0x331b,count=2,unit=1)
result3 = client.read_input_registers(address=0x311a,count=1,unit=1)
result4 = client.read_input_registers(address=0x3201,count=1,unit=1)
client.close()
print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
try:
print(result1.registers)
print(result2.registers)
print(result3.registers)
print(result4.registers)
except AttributeError as e:
print(e)
print(type(e))
else:
current=0x10000*result2.registers[1] + result2.registers[0]
if 0x80000000 < current:
current = -(0x100000000-current)
current = current/100
panelVoltage = result1.registers[0]/100
panelCurrent = result1.registers[1]/100
panelPower = result1.registers[2]/100
batteryVoltage = result1.registers[4]/100
batteryCurrent = current
batteryPower = batteryVoltage * current
batteryPercent = result3.registers[0]
chargeStatus = result4.registers[0]
print("太陽電池電圧 : ",panelVoltage)
print("太陽電池電流 : ",panelCurrent)
print("太陽電池電力 : ",panelPower)
print("バッテリー電圧 : ",batteryVoltage)
print("バッテリー電流 : ",batteryCurrent)
print("バッテリー電力 : ",batteryPower)
print("バッテリー充電率: ",batteryPercent)
print("充電状況 : ",chargeStatus)
logging.info(',%s,%5.2f,%4.2f,%5.2f,%5.2f,%4.2f,%5.2f,%2d,%04x', datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), panelVoltage, panelCurrent, panelPower, batteryVoltage, batteryCurrent, batteryPower, batteryPercent, chargeStatus)
am = ambient.Ambient('チャンネルID','ライトキー')
try:
r = am.send({'d1':panelVoltage, 'd2':panelCurrent, 'd3':panelPower, 'd4':batteryVoltage, 'd5':batteryCurrent, 'd6':batteryPower, 'd7':batteryPercent, 'd8':chargeStatus})
print(r.status_code)
except requests.exceptions.RequestException as e:
print('request failed: ', e)
print("")
time.sleep(60)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment