Compare commits
3 Commits
fb5d47f25c
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 30c785221e | |||
| e0393a6353 | |||
| ef88dd5f8c |
120
plugin.py
120
plugin.py
@ -7,7 +7,7 @@ Requirements:
|
|||||||
2. pymodbus AND pymodbusTCP
|
2. pymodbus AND pymodbusTCP
|
||||||
"""
|
"""
|
||||||
"""
|
"""
|
||||||
<plugin key="DS238_ModbusTCP" name="DS238-2 ZN/S ModbusTCP" author="Xavier Beaudouin" version="0.0.2" externallink="https://github.com/xbeaudouin/domoticz-ds238-modbus-tcp">
|
<plugin key="DS238_ModbusTCP" name="DS238-2 ZN/S ModbusTCP" author="Xavier Beaudouin" version="0.0.3" externallink="https://github.com/xbeaudouin/domoticz-ds238-modbus-tcp">
|
||||||
<params>
|
<params>
|
||||||
<param field="Address" label="IP Address" width="150px" required="true" />
|
<param field="Address" label="IP Address" width="150px" required="true" />
|
||||||
<param field="Port" label="Port Number" width="100px" required="true" default="502" />
|
<param field="Port" label="Port Number" width="100px" required="true" default="502" />
|
||||||
@ -211,7 +211,6 @@ class BasePlugin:
|
|||||||
Devices[9].Update(1, "0")
|
Devices[9].Update(1, "0")
|
||||||
Devices[10].Update(1, "0")
|
Devices[10].Update(1, "0")
|
||||||
|
|
||||||
# TODO: catch errors
|
|
||||||
# 3 counters
|
# 3 counters
|
||||||
total_e = "0"
|
total_e = "0"
|
||||||
export_e = "0"
|
export_e = "0"
|
||||||
@ -221,80 +220,30 @@ class BasePlugin:
|
|||||||
power = "0"
|
power = "0"
|
||||||
|
|
||||||
# Total Energy
|
# Total Energy
|
||||||
#data = client.read_holding_registers(0, 2)
|
|
||||||
#Domoticz.Debug("Data from register 0: "+str(data))
|
|
||||||
## Unsigned 32
|
|
||||||
#decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.Big, wordorder=Endian.Big)
|
|
||||||
## Value
|
|
||||||
#value = decoder.decode_32bit_int()
|
|
||||||
#total_e = str(value)
|
|
||||||
total_e = str(getmodbus32(0, client))
|
total_e = str(getmodbus32(0, client))
|
||||||
|
|
||||||
# Export Energy
|
# Export Energy
|
||||||
#data = client.read_holding_registers(0x8, 2)
|
|
||||||
#Domoticz.Debug("Data from register 0x8: "+str(data))
|
|
||||||
# Unsigned 32
|
|
||||||
#decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.Big, wordorder=Endian.Big)
|
|
||||||
# Value
|
|
||||||
#value = decoder.decode_32bit_int()
|
|
||||||
#export_e = str(value)
|
|
||||||
export_e = str(getmodbus32(0x8, client))
|
export_e = str(getmodbus32(0x8, client))
|
||||||
|
|
||||||
# Import Energy
|
# Import Energy
|
||||||
#data = client.read_holding_registers(0xA, 2)
|
|
||||||
#Domoticz.Debug("Data from register 0xA: "+str(data))
|
|
||||||
## Unsigned 32
|
|
||||||
#decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.Big, wordorder=Endian.Big)
|
|
||||||
## Value
|
|
||||||
#value = decoder.decode_32bit_int()
|
|
||||||
#import_e = str(value)
|
|
||||||
import_e = str(getmodbus32(0xA, client))
|
import_e = str(getmodbus32(0xA, client))
|
||||||
|
|
||||||
# Voltage
|
# Voltage
|
||||||
#data = client.read_holding_registers(0xC, 1)
|
|
||||||
#Domoticz.Debug("Data from register 0xC: "+str(data))
|
|
||||||
# Unsigned 16
|
|
||||||
#decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.Big, wordorder=Endian.Big)
|
|
||||||
# Value
|
|
||||||
#value = decoder.decode_16bit_int()
|
|
||||||
# Scale factor / 10
|
|
||||||
value = round (getmodbus16(0xC,client) / 10, 3)
|
value = round (getmodbus16(0xC,client) / 10, 3)
|
||||||
Domoticz.Debug("Value after conversion : "+str(value))
|
|
||||||
Domoticz.Debug("-> Calculating average")
|
|
||||||
self.voltage.update(value)
|
self.voltage.update(value)
|
||||||
value = self.voltage.get()
|
value = self.voltage.get()
|
||||||
Domoticz.Debug(" = {}".format(value))
|
|
||||||
Devices[4].Update(1, str(value))
|
Devices[4].Update(1, str(value))
|
||||||
|
|
||||||
# Current
|
# Current
|
||||||
#data = client.read_holding_registers(0xD, 1)
|
|
||||||
#Domoticz.Debug("Data from register 0xD: "+str(data))
|
|
||||||
# Unsigned 16
|
|
||||||
#decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.Big, wordorder=Endian.Big)
|
|
||||||
# Value
|
|
||||||
#value = decoder.decode_16bit_int()
|
|
||||||
# Scale factor / 100
|
|
||||||
value = round (getmodbus16(0xD,client) / 100, 3)
|
value = round (getmodbus16(0xD,client) / 100, 3)
|
||||||
Domoticz.Debug("Value after conversion : "+str(value))
|
|
||||||
Domoticz.Debug("-> Calculating average")
|
|
||||||
self.current.update(value)
|
self.current.update(value)
|
||||||
value = self.current.get()
|
value = self.current.get()
|
||||||
Domoticz.Debug(" = {}".format(value))
|
|
||||||
Devices[5].Update(1, str(value))
|
Devices[5].Update(1, str(value))
|
||||||
|
|
||||||
# Active Power
|
# Active Power
|
||||||
#data = client.read_holding_registers(0xE, 1)
|
|
||||||
#Domoticz.Debug("Data from register 0xE: "+str(data))
|
|
||||||
# Unsigned 16
|
|
||||||
#decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.Big, wordorder=Endian.Big)
|
|
||||||
# Value
|
|
||||||
#value = decoder.decode_16bit_int()
|
|
||||||
#Domoticz.Debug("Value after conversion : "+str(value))
|
|
||||||
#Domoticz.Debug("-> Calculating average")
|
|
||||||
value = getmodbus16(0xE, client)
|
value = getmodbus16(0xE, client)
|
||||||
self.active_power.update(value)
|
self.active_power.update(value)
|
||||||
value = self.active_power.get()
|
value = self.active_power.get()
|
||||||
Domoticz.Debug(" = {}".format(value))
|
|
||||||
Devices[6].Update(1, str(value))
|
Devices[6].Update(1, str(value))
|
||||||
if value > 0.0:
|
if value > 0.0:
|
||||||
import_w = value
|
import_w = value
|
||||||
@ -303,53 +252,23 @@ class BasePlugin:
|
|||||||
power = str(abs(value))
|
power = str(abs(value))
|
||||||
|
|
||||||
# Reactive Power
|
# Reactive Power
|
||||||
#data = client.read_holding_registers(0xF, 1)
|
|
||||||
#Domoticz.Debug("Data from register 0xF: "+str(data))
|
|
||||||
# Unsigned 16
|
|
||||||
#decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.Big, wordorder=Endian.Big)
|
|
||||||
## Value
|
|
||||||
#value = decoder.decode_16bit_int()
|
|
||||||
#Domoticz.Debug("Value after conversion : "+str(value))
|
|
||||||
#Domoticz.Debug("-> Calculating average")
|
|
||||||
value = getmodbus16(0xF, client)
|
value = getmodbus16(0xF, client)
|
||||||
self.reactive_power.update(value)
|
self.reactive_power.update(value)
|
||||||
value = self.reactive_power.get()
|
value = self.reactive_power.get()
|
||||||
Domoticz.Debug(" = {}".format(value))
|
|
||||||
Devices[7].Update(1, str(value))
|
Devices[7].Update(1, str(value))
|
||||||
|
|
||||||
# Power Factor
|
# Power Factor
|
||||||
#data = client.read_holding_registers(0x10, 1)
|
|
||||||
#Domoticz.Debug("Data from register 0x10: "+str(data))
|
|
||||||
# Unsigned 16
|
|
||||||
#decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.Big, wordorder=Endian.Big)
|
|
||||||
# Value
|
|
||||||
#value = decoder.decode_16bit_int()
|
|
||||||
# Scale factor / 1000
|
|
||||||
value = round (getmodbus16(0x10,client) / 1000, 3)
|
value = round (getmodbus16(0x10,client) / 1000, 3)
|
||||||
Domoticz.Debug("Value after conversion : "+str(value))
|
|
||||||
Domoticz.Debug("-> Calculating average")
|
|
||||||
self.power_factor.update(value)
|
self.power_factor.update(value)
|
||||||
value = self.power_factor.get()
|
value = self.power_factor.get()
|
||||||
Domoticz.Debug(" = {}".format(value))
|
|
||||||
Devices[8].Update(1, str(value))
|
Devices[8].Update(1, str(value))
|
||||||
|
|
||||||
# Frequency
|
# Frequency
|
||||||
#data = client.read_holding_registers(0x11, 1)
|
|
||||||
#Domoticz.Debug("Data from register 0x11: "+str(data))
|
|
||||||
# Unsigned 16
|
|
||||||
#decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.Big, wordorder=Endian.Big)
|
|
||||||
## Value
|
|
||||||
#value = decoder.decode_16bit_int()
|
|
||||||
# Scale factor / 100
|
|
||||||
value = round (getmodbus16(0x11, client) / 100, 3)
|
value = round (getmodbus16(0x11, client) / 100, 3)
|
||||||
Domoticz.Debug("Value after conversion : "+str(value))
|
|
||||||
Domoticz.Debug("-> Calculating average")
|
|
||||||
self.frequency.update(value)
|
self.frequency.update(value)
|
||||||
value = self.frequency.get()
|
value = self.frequency.get()
|
||||||
Domoticz.Debug(" = {}".format(value))
|
|
||||||
Devices[9].Update(1, str(value))
|
Devices[9].Update(1, str(value))
|
||||||
|
|
||||||
|
|
||||||
# Do insert data on counters
|
# Do insert data on counters
|
||||||
Devices[1].Update(1, sValue=total_e+"0;0;0;0;"+power+";0")
|
Devices[1].Update(1, sValue=total_e+"0;0;0;0;"+power+";0")
|
||||||
Devices[2].Update(1, sValue=export_e+"0;0;0;0;"+str(abs(export_w))+";0")
|
Devices[2].Update(1, sValue=export_e+"0;0;0;0;"+str(abs(export_w))+";0")
|
||||||
@ -409,28 +328,45 @@ def DumpConfigToLog():
|
|||||||
|
|
||||||
# get Modbus 32 bits values
|
# get Modbus 32 bits values
|
||||||
def getmodbus32(register, client):
|
def getmodbus32(register, client):
|
||||||
|
value = 0
|
||||||
try:
|
try:
|
||||||
data = client.read_holding_registers(register, 2)
|
data = client.read_holding_registers(register, 2)
|
||||||
Domoticz.Debug("Data from register "+str(register)+": "+str(data))
|
Domoticz.Debug("Data from register "+str(register)+": "+str(data))
|
||||||
decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.Big, wordorder=Endian.Big)
|
#decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.Big, wordorder=Endian.Big)
|
||||||
|
decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.BIG, wordorder=Endian.BIG)
|
||||||
value = decoder.decode_32bit_int()
|
value = decoder.decode_32bit_int()
|
||||||
return value
|
|
||||||
except:
|
except:
|
||||||
Domoticz.Error("Error getting data from "+str(register))
|
Domoticz.Error("Error getting data from "+str(register) + ", try 1")
|
||||||
return 0
|
try:
|
||||||
|
data = client.read_holding_registers(register, 2)
|
||||||
|
Domoticz.Debug("Data from register "+str(register)+": "+str(data))
|
||||||
|
#decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.Big, wordorder=Endian.Big)
|
||||||
|
decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.BIG, wordorder=Endian.BIG)
|
||||||
|
value = decoder.decode_32bit_int()
|
||||||
|
except:
|
||||||
|
Domoticz.Error("Error getting data from "+str(register) + ", try 2")
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
# get Modbug 16 bits values
|
# get Modbug 16 bits values
|
||||||
def getmodbus16(register, client):
|
def getmodbus16(register, client):
|
||||||
|
value = 0
|
||||||
try:
|
try:
|
||||||
data = client.read_holding_registers(register, 1)
|
data = client.read_holding_registers(register, 1)
|
||||||
Domoticz.Debug("Data from register "+str(register)+": "+str(data))
|
Domoticz.Debug("Data from register "+str(register)+": "+str(data))
|
||||||
decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.Big, wordorder=Endian.Big)
|
#decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.Big, wordorder=Endian.Big)
|
||||||
|
decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.BIG, wordorder=Endian.BIG)
|
||||||
value = decoder.decode_16bit_int()
|
value = decoder.decode_16bit_int()
|
||||||
return value
|
|
||||||
except:
|
except:
|
||||||
Domoticz.Error("Error getting data from "+str(register))
|
Domoticz.Error("Error getting data from "+str(register) + ", try 1")
|
||||||
return 0
|
try:
|
||||||
|
data = client.read_holding_registers(register, 1)
|
||||||
|
Domoticz.Debug("Data from register "+str(register)+": "+str(data))
|
||||||
|
#decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.Big, wordorder=Endian.Big)
|
||||||
|
decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.BIG, wordorder=Endian.BIG)
|
||||||
|
value = decoder.decode_16bit_int()
|
||||||
|
except:
|
||||||
|
Domoticz.Error("Error getting data from "+str(register) + ", try 2")
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user