Last active
December 30, 2019 16:51
-
-
Save tom-a/e53e2aa2d042cd7283dff81ded5c65b6 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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