Skip to content

Commit b2bcab9

Browse files
committed
fix lost code on emonHubMBusInterfacer
1 parent 1094d41 commit b2bcab9

1 file changed

Lines changed: 61 additions & 28 deletions

File tree

src/interfacers/EmonHubMBUSInterfacer.py

Lines changed: 61 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,11 @@ def __init__(self, name, device="/dev/ttyUSB0", device_vid=False, device_pid=Fal
9090
else:
9191
print("no reply")
9292

93+
self._log.info("set")
94+
self._log.info(self.ser)
95+
9396
except ModuleNotFoundError as err:
97+
self._log.error("================================");
9498
self._log.error(err)
9599
self.ser = False
96100

@@ -133,6 +137,7 @@ def connect(self):
133137

134138
# if device is still False, log error and return False
135139
if not device:
140+
self._log.error("================================");
136141
self._log.error("Could not find MBUS device")
137142
self.ser = False
138143
return False
@@ -141,6 +146,7 @@ def connect(self):
141146
self._log.debug("Connecting to MBUS serial: " + device + " " + str(self.baud))
142147
self.ser = serial.Serial(device, self.baud, 8, 'E', 1, 0.5)
143148
except Exception:
149+
self._log.error("================================");
144150
self._log.error("Could not connect to MBUS serial")
145151
self.ser = False
146152

@@ -163,6 +169,7 @@ def mbus_serial_write(self,data):
163169
try:
164170
self.ser.write(data)
165171
except Exception:
172+
self._log.error("================================");
166173
self.ser = False
167174
self._log.error("Could not write to MBUS serial port")
168175

@@ -230,6 +237,7 @@ def set_page(self, address, page):
230237
else:
231238
time.sleep(0.2)
232239
except Exception:
240+
self._log.error("================================");
233241
self.ser = False
234242
self._log.error("set_page could not read from serial port")
235243

@@ -259,7 +267,7 @@ def decodeInt(self,bytes):
259267
return struct.unpack("i", bytearray(bytes))[0]
260268
return False
261269

262-
def parse_frame(self,data,records):
270+
def parse_frame(self,meter, data,records):
263271
data_types = ['null','int','int','int','int','float','int','int','null','bcd','bcd','bcd','bcd','var','bcd','null']
264272
data_lengths = [0,1,2,3,4,4,6,8,0,1,2,3,4,6,6,0]
265273
vif = {
@@ -473,7 +481,8 @@ def parse_frame(self,data,records):
473481

474482
return result
475483

476-
def parse_frame_meterbus_lib(self,data,records):
484+
def parse_frame_meterbus_lib(self,meter, data,records):
485+
self._log.debug("parse_frame_meterbus_lib");
477486
telegram = self.meterbus.load(data)
478487
meterbus_obj = json.loads(telegram.to_JSON())
479488

@@ -491,31 +500,31 @@ def parse_frame_meterbus_lib(self,data,records):
491500
idx = idx+1
492501
return result
493502

494-
def request_data(self, address, records):
503+
def request_data(self, meter, address, records):
495504
for i in range(0,2):
496505
if self.use_meterbus_lib:
497506
self.meterbus.send_request_frame(self.ser, address)
498507
else:
499508
self.mbus_short_frame(address, 0x5b)
500509
# time.sleep(1.0)
501-
result = self.read_data_frame(records)
510+
result = self.read_data_frame(meter, records)
502511
if result!=None:
503512
return result
504513
else:
505514
time.sleep(0.2)
506515

507-
def request_data_sdm120(self, address, records):
516+
def request_data_sdm120(self, meter, address, records):
508517
for i in range(0,2):
509518
self.mbus_request_sdm120(address)
510519
# time.sleep(1.0)
511-
result = self.read_data_frame(records)
520+
result = self.read_data_frame(meter, records)
512521
if result!=None:
513522
return result
514523
else:
515524
time.sleep(0.2)
516525

517526

518-
def read_data_frame(self,records):
527+
def read_data_frame(self,meter, records):
519528
data = []
520529
bid = 0
521530
bid_end = 255
@@ -567,13 +576,14 @@ def read_data_frame(self,records):
567576

568577
if valid: # Parse frame if still valid
569578
if self.use_meterbus_lib:
570-
return self.parse_frame_meterbus_lib(data,records)
579+
return self.parse_frame_meterbus_lib(meter, data,records)
571580
else:
572-
return self.parse_frame(data,records)
581+
return self.parse_frame(meter, data,records)
573582

574583
bid += 1
575584
time.sleep(0.1)
576585
except Exception:
586+
self._log.error("================================");
577587
self.ser = False
578588
self._log.error("read_data_frame could not read from serial port")
579589
# If we are here data response is corrupt
@@ -585,15 +595,33 @@ def read_data_frame(self,records):
585595
if self.invalid_count>=10:
586596
# Reset invalid count
587597
self.invalid_count = 0
598+
self._log.error("================================");
588599
self._log.debug("Invalid count = 10. Restarting MBUS serial connection on next read")
589600
self.ser = False
590601

591-
def add_result_to_cargo(self,meter,c,result):
602+
def add_result_to_cargo(self,meter,nodesName,c,result):
592603
if result != None:
593-
self._log.debug("Decoded MBUS data: " + json.dumps(result))
594-
604+
self._log.info("Decoded MBUS data: " + json.dumps(result))
605+
606+
self._log.error("nodesName:" + ",".join(nodesName));
607+
nodesNameHash = {}
608+
for nameTranslator in nodesName:
609+
self._log.error("nameTranslator:" + nameTranslator);
610+
nameTranslatorPart = nameTranslator.split(':')
611+
nodesNameHash[nameTranslatorPart[0]]=nameTranslatorPart[1]
612+
self._log.error(nameTranslatorPart[0] + " <> " + nameTranslatorPart[1]);
613+
614+
615+
595616
for key in result:
596-
c.names.append(meter+"_"+key)
617+
self._log.error("key1:" + key);
618+
key1=key
619+
if key in nodesNameHash:
620+
key1 = nodesNameHash[key]
621+
622+
self._log.error("key2:" + key);
623+
624+
c.names.append(key1+"_"+meter)
597625
c.realdata.append(result[key][0])
598626
c.units.append(result[key][1])
599627
else:
@@ -621,6 +649,7 @@ def read(self):
621649
else:
622650
self.connect()
623651
except Exception:
652+
self._log.error("================================");
624653
self._log.error("Could not connect to MBUS serial")
625654
self.ser = False
626655

@@ -641,41 +670,42 @@ def read(self):
641670
c.nodeid = self._settings['nodename']
642671

643672
meterPrefix = self._settings['meters'][meter]['name'];
673+
nodesName = self._settings['meters'][meter]['nodesName'];
644674
res.append(c)
645675

646676
# Most mbus meters use standard request, page 0 or default, all records
647677
if meter_type=="standard":
648-
result = self.request_data(address,[])
649-
self.add_result_to_cargo(meterPrefix,c,result)
678+
result = self.request_data(meter, address,[])
679+
self.add_result_to_cargo(meterPrefix, nodesName, c,result)
650680

651681
# Qalcosonic E3
652682
if meter_type=="qalcosonic_e3":
653-
result = self.request_data(address,[4,5,6,7,8,9,10,11,12,13,14,15])
654-
self.add_result_to_cargo(meterPrefix,c,result)
683+
result = self.request_data(meter, address,[4,5,6,7,8,9,10,11,12,13,14,15])
684+
self.add_result_to_cargo(meterPrefix,nodesName,c,result)
655685

656686
# ------------------------------------------------------
657687
# Sontex Multical 531
658688
if meter_type=="sontex531":
659689
# p1
660690
self.set_page(address, 1)
661-
result = self.request_data(address,[4,5])
662-
self.add_result_to_cargo(meterPrefix,c,result)
691+
result = self.request_data(meter, address,[4,5])
692+
self.add_result_to_cargo(meterPrefix,nodesName,c,result)
663693
# p3
664694
self.set_page(address, 3)
665-
result = self.request_data(address,[1,2,3,4])
666-
self.add_result_to_cargo(meterPrefix,c,result)
695+
result = self.request_data(meter, address,[1,2,3,4])
696+
self.add_result_to_cargo(meterPrefix,nodesName,c,result)
667697

668698
# SDM120 special request command
669699
elif meter_type=="sdm120":
670700
# 1. Get energy data
671-
result = self.request_data(address,[1])
672-
self.add_result_to_cargo(meterPrefix,c,result)
701+
result = self.request_data(meter, address,[1])
702+
self.add_result_to_cargo(meterPrefix,nodesName,c,result)
673703
# 2. Get instantaneous data
674-
result = self.request_data_sdm120(address,[1,7,11,23])
675-
self.add_result_to_cargo(meterPrefix,c,result)
704+
result = self.request_data_sdm120(meter, address,[1,7,11,23])
705+
self.add_result_to_cargo(meterPrefix,nodesName,c,result)
676706
elif meter_type=="kamstrup403":
677-
result = self.request_data(address,[1,4,7,8,9,10,11,12,14])
678-
self.add_result_to_cargo(meterPrefix,c,result)
707+
result = self.request_data(meter, address,[1,4,7,8,9,10,11,12,14])
708+
self.add_result_to_cargo(meterPrefix,nodesName,c,result)
679709
# ------------------------------------------------------
680710

681711
return res
@@ -725,14 +755,17 @@ def set(self, **kwargs):
725755
address = int(setting[meter]['address'])
726756
if 'name' in setting[meter]:
727757
name = setting[meter]['name']
758+
if 'nodesName' in setting[meter]:
759+
nodesName = setting[meter]['nodesName']
728760
# type e.g sdm
729761
if 'type' in setting[meter]:
730762
meter_type = str(setting[meter]['type'])
731763
#assign
732764
self._settings['meters'][meter] = {
733765
'address':address,
734766
'type':meter_type,
735-
'name':name
767+
'name':name,
768+
'nodesName':nodesName
736769
}
737770
continue
738771
else:

0 commit comments

Comments
 (0)