Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
Your Name committed Dec 9, 2022
2 parents 072e01d + e5e4dc7 commit afa562b
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 22 deletions.
11 changes: 6 additions & 5 deletions conf/interfacer_examples/samsung-ashp/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,15 @@ Read data from a Samsung Heat Pump or HVAC unit using the [MIM-B19N Modbus modul
datatype = int
[[[runtimesettings]]]
pubchannels = ToEmonCMS,
read_interval = 10
read_interval = 20
nodename = samsung-ashp
# prefix = sdm_
[[[[meters]]]]
[[[[[ashp]]]]]
device_type = samsung
address = 1
registers = 75,74,72,65,66,68,52,59,58,2,79
names = dhw_temp,dhw_target,dhw_status,return_temp,flow_temp,flow_target,heating_status,indoor_temp,indoor_target, defrost_status, away_status
scales = 0.1,0.1,1,0.1,0.1,0.1,1,0.1,0.1,1,1
precision = 2,2,1,2,2,2,1,2,2,1,1
registers = 75,74,72,65,66,68,52,59,58,2,79,87,5,89
names = dhw_temp,dhw_target,dhw_status,return_temp,flow_temp,flow_target,heating_status,indoor_temp,indoor_target, defrost_status,away_status,flow_rate,outdoor_temp,3_way_valve
scales = 0.1,0.1,1,0.1,0.1,0.1,1,0.1,0.1,1,1,0.1,0.1,1
precision = 2,2,1,2,2,2,1,2,2,1,1,2,2,1
```
11 changes: 6 additions & 5 deletions conf/interfacer_examples/samsung-ashp/samsung-ashp.emonhub.conf
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@
datatype = int
[[[runtimesettings]]]
pubchannels = ToEmonCMS,
read_interval = 10
read_interval = 20
nodename = samsung-ashp
# prefix = sdm_
[[[[meters]]]]
[[[[[ashp]]]]]
device_type = samsung
address = 1
registers = 75,74,72,65,66,68,52,59,58,2,79
names = dhw_temp,dhw_target,dhw_status,return_temp,flow_temp,flow_target,heating_status,indoor_temp,indoor_target, defrost_status, away_status
scales = 0.1,0.1,1,0.1,0.1,0.1,1,0.1,0.1,1,1
precision = 2,2,1,2,2,2,1,2,2,1,1
registers = 75,74,72,65,66,68,52,59,58,2,79,87,5,89
names = dhw_temp,dhw_target,dhw_status,return_temp,flow_temp,flow_target,heating_status,indoor_temp,indoor_target, defrost_status,away_status,flow_rate,outdoor_temp,3_way_valve
scales = 0.1,0.1,1,0.1,0.1,0.1,1,0.1,0.1,1,1,0.1,0.1,1
precision = 2,2,1,2,2,2,1,2,2,1,1,2,2,1
14 changes: 9 additions & 5 deletions docs/emonhub-interfacers.md
Original file line number Diff line number Diff line change
Expand Up @@ -387,22 +387,26 @@ EmonHub (V2.3.4) can read data directly from a Samsung Air Souce Heat Pump (ASHP
Example emonhub config:

```
[[SAMSUNGASHP]]
[[SAMSUNG-ASHP-MIB19N]]
Type = EmonHubMinimalModbusInterfacer
[[[init_settings]]]
device = /dev/ttyUSB0
baud = 9600
parity = even
datatype = int
[[[runtimesettings]]]
pubchannels = ToEmonCMS,
read_interval = 10
read_interval = 20
nodename = samsung-ashp
# prefix = sdm_
[[[[meters]]]]
[[[[[ashp]]]]]
device_type = samsung
address = 1
registers = 75,74,72,65,66,68,52,59,58,2,79
names = dhw_temp,dhw_target,dhw_status,return_temp,flow_temp,flow_target,heating_status,indoor_temp,indoor_target, defrost_status, away_status
scales = 0.1,0.1,1,0.1,0.1,0.1,1,0.1,0,1,1
registers = 75,74,72,65,66,68,52,59,58,2,79,87,5,89
names = dhw_temp,dhw_target,dhw_status,return_temp,flow_temp,flow_target,heating_status,indoor_temp,indoor_target, defrost_status,away_status,flow_rate,outdoor_temp,3_way_valve
scales = 0.1,0.1,1,0.1,0.1,0.1,1,0.1,0.1,1,1,0.1,0.1,1
precision = 2,2,1,2,2,2,1,2,2,1,1,2,2,1
```

Example Samsung ASHP data in Emoncms:
Expand Down
33 changes: 26 additions & 7 deletions src/interfacers/EmonHubMinimalModbusInterfacer.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import glob
from emonhub_interfacer import EmonHubInterfacer


"""
[[SDM120]]
Type = EmonHubMinimalModbusInterfacer
Expand Down Expand Up @@ -39,16 +40,17 @@
datatype = int
[[[runtimesettings]]]
pubchannels = ToEmonCMS,
read_interval = 10
read_interval = 20
nodename = samsung-ashp
# prefix = sdm_
[[[[meters]]]]
[[[[[ashp]]]]]
device_type = samsung
address = 1
registers = 75,74,72,65,66,68,52,59,58,2,79
names = dhw_temp,dhw_target,dhw_status,return_temp,flow_temp,flow_target,heating_status,indoor_temp,indoor_target, defrost_status, away_status
scales = 0.1,0.1,1,0.1,0.1,0.1,1,0.1,0.1,1,1
precision = 2,2,1,2,2,2,1,2,2,1,1
registers = 75,74,72,65,66,68,52,59,58,2,79,87,5,89
names = dhw_temp,dhw_target,dhw_status,return_temp,flow_temp,flow_target,heating_status,indoor_temp,indoor_target, defrost_status,away_status,flow_rate,outdoor_temp,3_way_valve
scales = 0.1,0.1,1,0.1,0.1,0.1,1,0.1,0.1,1,1,0.1,0.1,1
precision = 2,2,1,2,2,2,1,2,2,1,1,2,2,1
[[SDM630]]
Type = EmonHubMinimalModbusInterfacer
Expand Down Expand Up @@ -107,7 +109,7 @@ def __init__(self, name, device="/dev/modbus", baud=2400, parity="none", datatyp
self.baud = baud
self.parity = parity
self.datatype = datatype
self.rs485_connect()
self.rs485_connect()

def rs485_connect(self):
try:
Expand Down Expand Up @@ -140,7 +142,7 @@ def read(self):
Return data as a list: [NodeID, val1, val2]
"""

if int(time.time())%self._settings['read_interval']==0:
if self.next_interval:
self.next_interval = False
Expand All @@ -156,14 +158,25 @@ def read(self):

# Support for multiple MBUS meters on a single bus
for meter in self._settings['meters']:

self._rs485.address = self._settings['meters'][meter]['address']

if self._settings['meters'][meter]['device_type'] == 'samsung':
self._log.debug("Samsung device active")
self._rs485.write_register(6001,0x8204) # Outdoor temp
time.sleep(0.5)
self._rs485.write_register(7005,0x42E9) # Flow rate
time.sleep(0.5)
self._rs485.write_register(7007,0x4067) # 3-way valve position

for i in range(0,len(self._settings['meters'][meter]['registers'])):
register_count += 1
valid = True
try:
if self.datatype == 'int':
time.sleep(0.1)
value = self._rs485.read_register(int(self._settings['meters'][meter]['registers'][i]), functioncode=3)

elif self.datatype == 'float':
value = self._rs485.read_float(int(self._settings['meters'][meter]['registers'][i]), functioncode=4, number_of_registers=2)
else:
Expand Down Expand Up @@ -236,12 +249,17 @@ def set(self, **kwargs):
self._settings['meters'] = {}
for meter in setting:
# default
device_type = []
address = 1
registers = []
names = []
precision = []
scales = []
# address
if 'device_type' in setting[meter]:
device_type = setting[meter]['device_type']
self._log.info("Setting %s meters %s device_type %s", self.name, meter, device_type)

if 'address' in setting[meter]:
address = int(setting[meter]['address'])
self._log.info("Setting %s meters %s address %s", self.name, meter, address)
Expand All @@ -268,6 +286,7 @@ def set(self, **kwargs):

#assign
self._settings['meters'][meter] = {
'device_type':device_type,
'address':address,
'registers':registers,
'names':names,
Expand Down

0 comments on commit afa562b

Please sign in to comment.