Compare commits

...

2 Commits

Author SHA1 Message Date
05dd708d3b Plugin is working. Have now to make it working better 2021-05-07 12:49:27 +02:00
edfb665a35 Update README 2021-05-07 10:30:00 +02:00
2 changed files with 120 additions and 8 deletions

View File

@ -58,9 +58,6 @@ To add the inverter, go to `Setup` -> `Hardware` and add the counter:
- Select `DS238-2 D/ZN ModbusTCP` from the `type` dropdown list.
- Enter the IP address of the PW21 in the `Inverter IP Address` field.
- Enter the port number (default: 502) of the inverter in the `Inverter Port Number` field.
- Select `Yes` in the `Add missing devices` to create the devices when the counter is added. Select `No` after deleting unwanted devices. Leaving the option set to `Yes` will recreate the deleted devices once Domoticz is restarted.
- Select an `Interval` (default: 10 seconds); this defines how often the plugin will collect the data from the counter. Short intervals will result in more accurate values and graphs, but also result in more network traffic and a higher workload for both Domoticz and the counter.
- Optionally change the `Log level`; this defaults to `Normal`. When selecting `Extra`, the plugin will print all the information it received from the counter in the log.
- Optionally turn on `Debug`; be aware: this will generate a lot of entries in the Domoticz log!
- `Add` the counter.

125
plugin.py
View File

@ -7,7 +7,7 @@ Requirements:
2. pymodbus AND pymodbusTCP
"""
"""
<plugin key="DS238_ModbusTCP" name="DS238-2 D/ZN ModbusTCP" author="Xavier Beaudouin" version="0.0.1" 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.1" externallink="https://github.com/xbeaudouin/domoticz-ds238-modbus-tcp">
<params>
<param field="Address" label="IP Address" width="150px" required="true" />
<param field="Port" label="Port Number" width="100px" required="true" default="502" />
@ -72,12 +72,14 @@ class BasePlugin:
# Create the devices if they does not exists
if 1 not in Devices:
Domoticz.Device(Name="Total Energy", Unit=1, Type=0x71, Subtype=0x0, Used=0).Create()
# Voir 0x107 / 0x30 ?
#Domoticz.Device(Name="Total Energy", Unit=1, Type=0x71, Subtype=0x0, Used=0).Create()
Domoticz.Device(Name="Total Energy", Unit=1, Type=248, Subtype=33, Used=0).Create()
if 2 not in Devices:
Domoticz.Device(Name="Export Energy", Unit=2, Type=0x71, Subtype=0x0, Used=0).Create()
#Domoticz.Device(Name="Export Energy", Unit=2, Type=0x71, Subtype=0x0, Used=0).Create()
Domoticz.Device(Name="Export Energy", Unit=2, Type=248, Subtype=33, Used=0).Create()
if 3 not in Devices:
Domoticz.Device(Name="Import Energy", Unit=3, Type=0x71, Subtype=0x0, Used=0).Create()
#Domoticz.Device(Name="Import Energy", Unit=3, Type=0x71, Subtype=0x0, Used=0).Create()
Domoticz.Device(Name="Import Energy", Unit=3, Type=248, Subtype=33, Used=0).Create()
if 4 not in Devices:
Domoticz.Device(Name="Voltage", Unit=4, TypeName="Voltage", Used=0).Create()
if 5 not in Devices:
@ -95,12 +97,15 @@ class BasePlugin:
Options = { "Custom": "1;Hz" }
Domoticz.Device(Name="Frequency", Unit=9, TypeName="Custom", Used=0, Options=Options).Create()
return
def onStop(self):
Domoticz.Log("onStop called")
def onConnect(self, Connection, Status, Description):
Domoticz.Log("onConnect called")
return
def onMessage(self, Connection, Data):
Domoticz.Log("onMessage called")
@ -131,6 +136,116 @@ class BasePlugin:
Devices[8].Update(1, "0")
Devices[9].Update(1, "0")
# 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()
# Scale factor / 100
value = str ( round (value / 100, 3))
Domoticz.Debug("Value after conversion : "+str(value))
Devices[1].Update(1, value)
# Export Energy
data = client.read_holding_registers(0x8, 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()
# Scale factor / 100
value = str ( round (value / 100, 3))
Domoticz.Debug("Value after conversion : "+str(value))
Devices[2].Update(1, value)
# Import Energy
data = client.read_holding_registers(0xA, 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()
# Scale factor / 100
value = str ( round (value / 100, 3))
Domoticz.Debug("Value after conversion : "+str(value))
Devices[3].Update(1, value)
# Voltage
data = client.read_holding_registers(0xC, 1)
Domoticz.Debug("Data from register 0: "+str(data))
# Unsigned 16
decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.Big, wordorder=Endian.Big)
# Value
value = decoder.decode_16bit_int()
# Scale factor / 10
value = str ( round (value / 10, 3))
Domoticz.Debug("Value after conversion : "+str(value))
Devices[4].Update(1, value)
# Current
data = client.read_holding_registers(0xD, 1)
Domoticz.Debug("Data from register 0: "+str(data))
# Unsigned 16
decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.Big, wordorder=Endian.Big)
# Value
value = decoder.decode_16bit_int()
# Scale factor / 100
value = str ( round (value / 100, 3))
Domoticz.Debug("Value after conversion : "+str(value))
Devices[5].Update(1, value)
# Active Power
data = client.read_holding_registers(0xE, 1)
Domoticz.Debug("Data from register 0: "+str(data))
# Unsigned 16
decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.Big, wordorder=Endian.Big)
# Value
value = decoder.decode_16bit_int()
# Scale factor / 100
#value = str ( round (value / 100, 3))
Domoticz.Debug("Value after conversion : "+str(value))
Devices[6].Update(1, str(value))
# Reactive Power
data = client.read_holding_registers(0xF, 1)
Domoticz.Debug("Data from register 0: "+str(data))
# Unsigned 16
decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.Big, wordorder=Endian.Big)
# Value
value = decoder.decode_16bit_int()
# Scale factor / 100
#value = str ( round (value / 100, 3))
Domoticz.Debug("Value after conversion : "+str(value))
Devices[7].Update(1, str(value))
# Power Factor
data = client.read_holding_registers(0x10, 1)
Domoticz.Debug("Data from register 0: "+str(data))
# Unsigned 16
decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.Big, wordorder=Endian.Big)
# Value
value = decoder.decode_16bit_int()
# Scale factor / 1000
value = str ( round (value / 1000, 3))
Domoticz.Debug("Value after conversion : "+str(value))
Devices[8].Update(1, value)
# Frequency
data = client.read_holding_registers(0x11, 1)
Domoticz.Debug("Data from register 0: "+str(data))
# Unsigned 16
decoder = BinaryPayloadDecoder.fromRegisters(data, byteorder=Endian.Big, wordorder=Endian.Big)
# Value
value = decoder.decode_16bit_int()
# Scale factor / 100
value = str ( round (value / 100, 3))
Domoticz.Debug("Value after conversion : "+str(value))
Devices[9].Update(1, value)
global _plugin
_plugin = BasePlugin()