Skip to content

Commit

Permalink
Add read_input and write_output methods
Browse files Browse the repository at this point in the history
  • Loading branch information
kasbert committed Jul 12, 2015
1 parent 66adeb1 commit 1f1fdf2
Show file tree
Hide file tree
Showing 5 changed files with 248 additions and 121 deletions.
15 changes: 13 additions & 2 deletions README.md
@@ -1,8 +1,19 @@
# epsolar-tracer
Tools for EPsolar Tracer solar charge controller
================================================
[Product link](http://www.epsolarpv.com/en/index.php/Product/pro_content/id/573/am_id/136)

Linux driver for Exar USB UART
xr_usb_serial_common-1a
https://www.exar.com/common/content/default.aspx?id=10296
------------------------------
xr_usb_serial_common-1a
[Original source](https://www.exar.com/common/content/default.aspx?id=10296)

apt-get install dkms

Protocol
--------
[Protocol](http://www.solar-elektro.cz/data/dokumenty/1733_modbus_protocol.pdf)

Python module
-------------
Uses modbus library (https://github.com/bashwork/pymodbus)
29 changes: 27 additions & 2 deletions info.py
@@ -1,15 +1,40 @@

from pyepsolartracer.tracer import EPsolarTracerClient

from pyepsolartracer.client import EPsolarTracerClient
from pyepsolartracer.registers import registers,coils
from test.testdata import ModbusMockClient as ModbusClient

# configure the client logging
import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.INFO)

serialclient = ModbusClient()
#serialclient = None

client = EPsolarTracerClient(serialclient = serialclient)
client.connect()

response = client.read_device_info()
print "Manufacturer:", repr(response.information[0])
print "Model:", repr(response.information[1])
print "Version:", repr(response.information[2])

response = client.read_input("Charging equipment rated input voltage")
print str(response)

for reg in registers:
#print
#print reg
value = client.read_input(reg[0])
print value
#print client.write_output(reg[0],value.value)

for reg in coils:
#print
#print reg
value = client.read_input(reg[0])
print value
#print client.write_output(reg[0],value.value)

client.close()
33 changes: 31 additions & 2 deletions pyepsolartracer/client.py
Expand Up @@ -3,7 +3,7 @@
# import the server implementation
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
from pymodbus.mei_message import *
from pyepsolartracer.registers import registers,coils
from pyepsolartracer.registers import registerByName

#---------------------------------------------------------------------------#
# Logging
Expand All @@ -28,7 +28,6 @@ def __init__(self, unit = 1, serialclient = None, **kwargs):

def connect(self):
''' Connect to the serial
:returns: True if connection succeeded, False otherwise
'''
return self.client.connect()
Expand All @@ -43,6 +42,36 @@ def read_device_info(self):
response = self.client.execute(request)
return response

def read_input(self, name):
register = registerByName(name)
if register.is_coil():
response = self.client.read_coils(register.address, register.size, unit = self.unit)
elif register.is_discrete_input():
response = self.client.read_discrete_inputs(register.address, register.size, unit = self.unit)
elif register.is_input_register():
response = self.client.read_input_registers(register.address, register.size, unit = self.unit)
else:
response = self.client.read_holding_registers(register.address, register.size, unit = self.unit)
return register.decode(response)

def write_output(self, name, value):
register = registerByName(name)
values = register.encode(value)
response = False
if register.is_coil():
self.client.write_coil(register.address, values, unit = self.unit)
response = True
elif register.is_discrete_input():
_logger.error("Cannot write discrete input " + repr(name))
pass
elif register.is_input_register():
_logger.error("Cannot write input register " + repr(name))
pass
else:
self.client.write_registers(register.address, values, unit = self.unit)
response = True
return response

__all__ = [
"EPsolarTracerClient",
]
Expand Down

0 comments on commit 1f1fdf2

Please sign in to comment.