diff --git a/config.json b/config.json index 556a259..c526714 100644 --- a/config.json +++ b/config.json @@ -6,8 +6,8 @@ ] }, "ref_zero_point": { - "oilInFlowRate": 3995, - "waterInFlowRate": 3984 + "oilInFlowRate": 4005, + "waterInFlowRate": 4000 }, "cdu_digital_list": { "valve1OpenStatus": [ @@ -101,6 +101,16 @@ "y" ] }, + "cdu_pdu_list": { + "pduCDU1": [ + 1, + "y" + ], + "pduCDU2": [ + 2, + "y" + ] + }, "tank_device_list": { "tankLeftTopFrontTemp": [ 1, @@ -150,5 +160,23 @@ 12, "y" ] + }, + "tank_pdu_list": { + "pduTank1": [ + 1, + "n" + ], + "pduTank2": [ + 2, + "n" + ], + "pduTank3": [ + 3, + "n" + ], + "pduTank4": [ + 4, + "n" + ] } } \ No newline at end of file diff --git a/control.json b/control.json index d8cea44..f4e5e8f 100644 --- a/control.json +++ b/control.json @@ -1,18 +1,18 @@ { - "get_data_interval": 1, - "set_zero_temperature": "n", + "get_data_interval": 2, + "set_zero_flow": "n", "valve1": "Off", "valve2": "Off", "inverter": { "inverter1": "Off", - "inverter1Frq": 30, + "inverter1Frq": 50, "inverter1Acc": 5.0, "inverter1Dec": 10.0, "inverter2": "Off", - "inverter2Frq": 30, + "inverter2Frq": 40, "inverter2Acc": 5.0, "inverter2Dec": 10.0 }, "mode": "auto", - "cmd": "None" + "cmd": "none" } \ No newline at end of file diff --git a/framework.yaml b/framework.yaml index 9421412..4420f3f 100644 --- a/framework.yaml +++ b/framework.yaml @@ -8,5 +8,5 @@ spec: package: requirements.txt # 설치할 Python 패키지 정보 파일입니다.(기본 값은 requirement.txt 입니다.) runtime: python3.9 stackbase: - tagName: v2.0.3 # Stackbase(gitea)에 릴리즈 태그명 입니다. + tagName: v2.0.4 # Stackbase(gitea)에 릴리즈 태그명 입니다. repoName: aquarack-sensor-collector # Satackbase(gitea)에 저장될 저장소 이릅니다. diff --git a/main.py b/main.py index c6f5519..c8a06b1 100644 --- a/main.py +++ b/main.py @@ -2,28 +2,43 @@ import sdtcloudpubsub import uuid from pymodbus.client import ModbusSerialClient as ModbusClient import os, json, sys, time -import threading +import threading, struct +import serial sdtcloud = sdtcloudpubsub.sdtcloudpubsub() sdtcloud.setClient(f"device-app-{uuid.uuid1()}") # parameter is client ID(string) +def get_inverter_errorcode(data): + error_code = ['Reserved', 'OVT', 'EXT-A', 'ETX(BX)', 'COL', 'GFT', 'OHT', 'ETH', 'OLT', 'Reserved', 'EXT-B', 'EEP', 'FAN', 'POT', 'IOLT', 'LVT'] + result = [error_code[i] for i in range(16) if (data & (0x8000 >> i)) and error_code[i] != 'Reserved'] + return ','.join(result) + def get_modbus(evt, serial_obj): - global isThread, g_zero_point, pub_dict, a_col, d_col, t_col, p_col, S_col + # global isThread, g_zero_point, pub_dict, a_col, d_col, t_col, p_col, S_col, s_col, path + global isThread, g_zero_point, pub_dict, a_col, d_col, t_col, p_col, S_col, s_col - ctl_mode = 'None' - cmd_status = [0, 0, 0, 0] - cmd_sub_status = 'None' + cmd_status = 'none' + cmd_sub_status = 'none' inverter_status = [0] * 6 valve_status = [False] * 8 + pre_dict = {} + init_flag = 0 while isThread: evt.wait() evt.clear() - # with open(os.path.join(file_path, 'control.json'), 'r') as f: + # with open(os.path.join(path, 'control.json'), 'r') as f: with open('./control.json', 'r') as f: control_data = json.load(f) - pre_dict = control_data.copy() + + try: + res = serial_obj.read_holding_registers(address=0, count=2, slave=20) + # print(f'humidity: {res.registers[0]/10}% / temperature: {res.registers[1]/10}°C') + for i, j in enumerate(s_col): + pub_dict[j] = res.registers[i] / 10 + except Exception as e: + print(f'Humidity/Temperature Senseor Error: {e}') # CWT-TM-320s try: @@ -42,8 +57,8 @@ def get_modbus(evt, serial_obj): # print(f'cdu_analog:{cdu_analog.registers}') # print(f'cdu_digital:{cdu_digital.bits}') - if control_data['set_zero_temperature'] == 'y': - # with open(os.path.join(file_path, 'config.json'), 'r') as f: + if control_data['set_zero_flow'] == 'y': + # with open(os.path.join(path, 'config.json'), 'r') as f: with open('./config.json', 'r') as f: config_data = json.load(f) @@ -51,7 +66,7 @@ def get_modbus(evt, serial_obj): if j == 'oilInFlowRate' or j == 'waterInFlowRate': config_data['ref_zero_point'][j] = cdu_analog.registers[i] - control_data['set_zero_temperature'] = 'n' + control_data['set_zero_flow'] = 'n' # with open(os.path.join(path, 'config.json'), 'w') as f: with open('./config.json', 'w') as f: @@ -83,13 +98,26 @@ def get_modbus(evt, serial_obj): try: # M100 res = client1.read_holding_registers(address=9, count=6, slave=10) - inverter_status[0] = res.registers[0] - inverter_status[1] = res.registers[5] - inverter_status[2] = res.registers[4] + inverter_status[0] = res.registers[0] / 100 # frequncy + inverter_status[1] = get_inverter_errorcode(res.registers[5]) # errorcode + run_status = res.registers[4] # running status + if run_status & 0x01: + inverter_status[2] = 'stop' + elif run_status & 0x02: + inverter_status[2] = 'running' + elif run_status & 0x08: + inverter_status[2] = 'error' + res = client1.read_holding_registers(address=9, count=6, slave=11) - inverter_status[3] = res.registers[0] - inverter_status[4] = res.registers[5] - inverter_status[5] = res.registers[4] + inverter_status[3] = res.registers[0] / 100 # frequncy + inverter_status[4] = get_inverter_errorcode(res.registers[5]) # errorcode + run_status = res.registers[4] # running status + if run_status & 0x01: + inverter_status[5] = 'stop' + elif run_status & 0x02: + inverter_status[5] = 'running' + elif run_status & 0x08: + inverter_status[5] = 'error' for i, j in enumerate(p_col): pub_dict[j] = inverter_status[i] @@ -98,231 +126,258 @@ def get_modbus(evt, serial_obj): try: if control_data['mode'] == 'auto': - if control_data['cmd'] == 'init': # 방어코드 필요 - if cmd_sub_status == 'None': + if control_data['cmd'] == 'init': + if cmd_sub_status != 'workingInit': valve_status[0], valve_status[1] = True, True res = serial_obj.write_coils(address=0, values=valve_status, slave=5) client1.write_registers(address=5, values=[193], slave=10) client1.write_registers(address=5, values=[193], slave=11) + cmd_status = 'init' cmd_sub_status = 'workingInit' - pub_dict['cmd'] = 'init' + pub_dict['cmd'] = 'workingInit' elif cmd_sub_status == 'workingInit': if (pub_dict['valve1OpenStatus'] == True and pub_dict['valve2OpenStatus'] == True - and (pub_dict['pump1StatusRunning'] & 0x01) - and (pub_dict['pump2StatusRunning'] & 0x01)): - cmd_sub_status = 'None' - pub_dict['cmd'] = 'None' - control_data['cmd'] = 'None' - - elif control_data['cmd'] == 'act1': - if cmd_sub_status == 'None': - if (pub_dict['pump1StatusRunning'] & 0x02 - and pub_dict['pump2StatusRunning'] & 0x01 - and pub_dict['valve1OpenStatus'] == True - and pub_dict['valve2CloseStatus'] == True): - cmd_stataus = 'None' - control_data['cmd'] = 'None' - else: - cmd_stataus = 'act1' - pub_dict['cmd'] = 'act1' - cmd_sub_status = 'stopPump1' - - elif cmd_sub_status == 'stopPump1': - if not (pub_dict['pump1StatusRunning'] & 0x01): - client1.write_registers(address=5, values=[193], slave=10) - cmd_sub_status = 'stoppingPump1' - else: - cmd_sub_status = 'stopPump2' - - elif cmd_sub_status == 'stoppingPump1': - if pub_dict['pump1StatusRunning'] & 0x01: - cmd_sub_status = 'stopPump2' - - elif cmd_sub_status == 'stopPump2': - if not (pub_dict['pump2StatusRunning'] & 0x01): - client1.write_registers(address=5, values=[193], slave=11) - cmd_sub_status = 'stoppingPump2' - else: - cmd_sub_status = 'closeValve2' - - elif cmd_sub_status == 'stoppingPump2': - if pub_dict['pump2StatusRunning'] & 0x01: - cmd_sub_status = 'closeValve2' - - elif cmd_sub_status == 'closeValve2': - if pub_dict['valve2OpenStatus'] == True: - valve_status[1] = False - res = serial_obj.write_coils(address=0, values=valve_status, slave=5) - cmd_sub_status = 'closingValve2' - elif pub_dict['valve2CloseStatus'] == True: - cmd_sub_status = 'openValve1' - - elif cmd_sub_status == 'closingValve2': - if pub_dict['valve2CloseStatus'] == True: - cmd_sub_status = 'openValve1' - - elif cmd_sub_status == 'openValve1': - if pub_dict['valve1CloseStatus'] == True: - valve_status[0] = True - res = serial_obj.write_coils(address=0, values=valve_status, slave=5) - cmd_sub_status = 'openningValve1' - elif pub_dict['valve1OpenStatus'] == True: - cmd_sub_status = 'startPump1' - - elif cmd_sub_status == 'openningValve1': - if pub_dict['valve1OpenStatus'] == True: - cmd_sub_status = 'startPump1' - - elif cmd_sub_status == 'startPump1': - frq = int(control_data['inverter']['inverter1Frq'] * 100) - acc = int(control_data['inverter']['inverter1Acc'] * 10) - dec = int(control_data['inverter']['inverter1Dec'] * 10) - client1.write_registers(address=4, values=[frq, 194, acc, dec], slave=10) - cmd_sub_status = 'startingPump1' - - elif cmd_sub_status == 'startingPump1': - if pub_dict['pump1StatusRunning'] & 0x40: - cmd_sub_status = 'None' - control_data['cmd'] = 'None' - - elif control_data['cmd'] == 'act2': - if cmd_sub_status == 'None': - if (pub_dict['pump1StatusRunning'] & 0x01 - and pub_dict['pump2StatusRunning'] & 0x02 - and pub_dict['valve1CloseStatus'] == True - and pub_dict['valve2OpenStatus'] == True): - cmd_stataus = 'None' - control_data['cmd'] = 'None' - else: - cmd_stataus = 'act2' - pub_dict['cmd'] = 'act2' - cmd_sub_status = 'stopPump1' - - elif cmd_sub_status == 'stopPump1': - if not (pub_dict['pump1StatusRunning'] & 0x01): - client1.write_registers(address=5, values=[193], slave=10) - cmd_sub_status = 'stoppingPump1' - else: - cmd_sub_status = 'stopPump2' - - elif cmd_sub_status == 'stoppingPump1': - if pub_dict['pump1StatusRunning'] & 0x01: - cmd_sub_status = 'stopPump2' - - elif cmd_sub_status == 'stopPump2': - if not (pub_dict['pump2StatusRunning'] & 0x01): - client1.write_registers(address=5, values=[193], slave=11) - cmd_sub_status = 'stoppingPump2' - else: - cmd_sub_status = 'closeValve1' - - elif cmd_sub_status == 'stoppingPump2': - if pub_dict['pump2StatusRunning'] & 0x01: - cmd_sub_status = 'closeValve1' - - elif cmd_sub_status == 'closeValve1': - if pub_dict['valve1OpenStatus'] == True: - valve_status[0] = False - res = serial_obj.write_coils(address=0, values=valve_status, slave=5) - cmd_sub_status = 'closingValve1' - elif pub_dict['valve1CloseStatus'] == True: - cmd_sub_status = 'openValve2' - - elif cmd_sub_status == 'closingValve1': - if pub_dict['valve1CloseStatus'] == True: - cmd_sub_status = 'openValve2' - - elif cmd_sub_status == 'openValve2': - if pub_dict['valve2CloseStatus'] == True: - valve_status[1] = True - res = serial_obj.write_coils(address=0, values=valve_status, slave=5) - cmd_sub_status = 'openningValve2' - elif pub_dict['valve2OpenStatus'] == True: - cmd_sub_status = 'startPump2' - - elif cmd_sub_status == 'openningValve2': - if pub_dict['valve2OpenStatus'] == True: - cmd_sub_status = 'startPump2' - - elif cmd_sub_status == 'startPump2': - frq = int(control_data['inverter']['inverter2Frq'] * 100) - acc = int(control_data['inverter']['inverter2Acc'] * 10) - dec = int(control_data['inverter']['inverter2Dec'] * 10) - client1.write_registers(address=4, values=[frq, 194, acc, dec], slave=11) - cmd_sub_status = 'startingPump2' - - elif cmd_sub_status == 'startingPump2': - if pub_dict['pump2StatusRunning'] & 0x40: - cmd_sub_status = 'None' - control_data['cmd'] = 'None' + and (pub_dict['pump1StatusRunning'] == 'stop') + and (pub_dict['pump2StatusRunning'] == 'stop')): + cmd_status = 'none' + cmd_sub_status = 'doneInit' + pub_dict['cmd'] = 'doneInit' + control_data['cmd'] = 'none' + init_flag = 1 elif control_data['cmd'] == 'emer': # 어느 조건에서든 입력되면 바로 수행 - if cmd_sub_status == 'None': + if cmd_sub_status != 'workingEmer': valve_status[0], valve_status[1] = False, False res = serial_obj.write_coils(address=0, values=valve_status, slave=5) client1.write_registers(address=5, values=[208], slave=10) client1.write_registers(address=5, values=[208], slave=11) - + cmd_status = 'emer' cmd_sub_status = 'workingEmer' pub_dict['cmd'] = 'emer' + init_flag = 0 elif cmd_sub_status == 'workingEmer': if (pub_dict['valve1CloseStatus'] == True and pub_dict['valve2CloseStatus'] == True - and (pub_dict['pump1StatusRunning'] & 0x01) - and (pub_dict['pump2StatusRunning'] & 0x01)): - cmd_sub_status = 'None' - pub_dict['cmd'] = 'None' - control_data['cmd'] = 'None' + and (pub_dict['pump1StatusRunning'] == 'stop') + and (pub_dict['pump2StatusRunning'] == 'stop')): + cmd_sub_status = 'none' + control_data['cmd'] = 'none' + + elif control_data['cmd'] == 'stop' or cmd_status == 'stop': + if init_flag == 0: + continue + if cmd_status == 'none' or cmd_status == 'stop' or cmd_status == 'act1' or cmd_status == 'act2': + client1.write_registers(address=5, values=[193], slave=10) + client1.write_registers(address=5, values=[193], slave=11) + if not ((pub_dict['pump1StatusRunning'] == 'stop') + and (pub_dict['pump2StatusRunning'] == 'stop')): + cmd_status = 'stop' + cmd_sub_status = 'stopping' + pub_dict['cmd'] = 'stopping' + elif ((pub_dict['pump1StatusRunning'] == 'stop') + and (pub_dict['pump2StatusRunning'] == 'stop')): + cmd_status = 'none' + cmd_sub_status = 'stop' + pub_dict['cmd'] = 'stop' + control_data['cmd'] = 'none' + + elif control_data['cmd'] == 'act1': + if init_flag == 0: + continue + if cmd_status == 'none' or cmd_status == 'act1': + if cmd_sub_status == 'doneInit' or cmd_sub_status == 'stop': + cmd_status = 'act1' + cmd_sub_status = 'closeValve2' + pub_dict['cmd'] = 'startAct1' + + elif cmd_sub_status == 'workingPump2': + cmd_status = 'act1' + cmd_sub_status = 'stopPump2' + pub_dict['cmd'] = 'startAct1' + + elif cmd_sub_status == 'stopPump2': + if not (pub_dict['pump2StatusRunning'] == 'stop'): + client1.write_registers(address=5, values=[193], slave=11) + cmd_sub_status = 'stoppingPump2' + else: + cmd_sub_status = 'closeValve2' + + elif cmd_sub_status == 'stoppingPump2': + if pub_dict['pump2StatusRunning'] == 'stop': + cmd_sub_status = 'closeValve2' + + elif cmd_sub_status == 'closeValve2': + if pub_dict['valve2OpenStatus'] == True: + valve_status[1] = False + res = serial_obj.write_coils(address=0, values=valve_status, slave=5) + cmd_sub_status = 'closingValve2' + elif pub_dict['valve2CloseStatus'] == True: + cmd_sub_status = 'openValve1' + + elif cmd_sub_status == 'closingValve2': + if pub_dict['valve2CloseStatus'] == True: + cmd_sub_status = 'openValve1' + + elif cmd_sub_status == 'openValve1': + if pub_dict['valve1CloseStatus'] == True: + valve_status[0] = True + res = serial_obj.write_coils(address=0, values=valve_status, slave=5) + cmd_sub_status = 'openningValve1' + elif pub_dict['valve1OpenStatus'] == True: + cmd_sub_status = 'startPump1' + + elif cmd_sub_status == 'openningValve1': + if pub_dict['valve1OpenStatus'] == True: + cmd_sub_status = 'startPump1' + + elif cmd_sub_status == 'startPump1': + frq = int(control_data['inverter']['inverter1Frq'] * 100) + acc = int(control_data['inverter']['inverter1Acc'] * 10) + dec = int(control_data['inverter']['inverter1Dec'] * 10) + client1.write_registers(address=4, values=[frq, 194, acc, dec], slave=10) + cmd_sub_status = 'startingPump1' + + elif cmd_sub_status == 'startingPump1': + if pub_dict['pump1StatusRunning'] == 'running': + cmd_status = 'none' + cmd_sub_status = 'workingPump1' + pub_dict['cmd'] = 'workingAct1' + control_data['cmd'] = 'none' + else: + client1.write_registers(address=5, values=[193], slave=10) + client1.write_registers(address=5, values=[193], slave=11) + pub_dict['cmd'] = 'errorAct1' + cmd_status = 'errorAct1' + cmd_sub_status = 'errorPump1' + init_flag = 0 + + elif control_data['cmd'] == 'act2': + if init_flag == 0: + continue + if cmd_status == 'none' or cmd_status == 'act2': + if cmd_sub_status == 'doneInit' or cmd_sub_status == 'stop': + cmd_status = 'act2' + cmd_sub_status = 'closeValve1' + pub_dict['cmd'] = 'startAct2' + + elif cmd_sub_status == 'workingPump1': + cmd_status = 'act2' + cmd_sub_status = 'stopPump1' + pub_dict['cmd'] = 'startAct2' + + elif cmd_sub_status == 'stopPump1': + if not (pub_dict['pump1StatusRunning'] == 'stop'): + client1.write_registers(address=5, values=[193], slave=10) + cmd_sub_status = 'stoppingPump1' + else: + cmd_sub_status = 'closeValve1' + + elif cmd_sub_status == 'stoppingPump1': + if pub_dict['pump1StatusRunning'] == 'stop': + cmd_sub_status = 'closeValve1' + + elif cmd_sub_status == 'closeValve1': + if pub_dict['valve1OpenStatus'] == True: + valve_status[0] = False + res = serial_obj.write_coils(address=0, values=valve_status, slave=5) + cmd_sub_status = 'closingValve1' + elif pub_dict['valve1CloseStatus'] == True: + cmd_sub_status = 'openValve2' + + elif cmd_sub_status == 'closingValve1': + if pub_dict['valve1CloseStatus'] == True: + cmd_sub_status = 'openValve2' + + elif cmd_sub_status == 'openValve2': + if pub_dict['valve2CloseStatus'] == True: + valve_status[1] = True + res = serial_obj.write_coils(address=0, values=valve_status, slave=5) + cmd_sub_status = 'openningValve2' + elif pub_dict['valve2OpenStatus'] == True: + cmd_sub_status = 'startPump2' + + elif cmd_sub_status == 'openningValve2': + if pub_dict['valve2OpenStatus'] == True: + cmd_sub_status = 'startPump2' + + elif cmd_sub_status == 'startPump2': + frq = int(control_data['inverter']['inverter2Frq'] * 100) + acc = int(control_data['inverter']['inverter2Acc'] * 10) + dec = int(control_data['inverter']['inverter2Dec'] * 10) + client1.write_registers(address=4, values=[frq, 194, acc, dec], slave=11) + cmd_sub_status = 'startingPump2' + + elif cmd_sub_status == 'startingPump2': + if pub_dict['pump2StatusRunning'] == 'running': + cmd_status = 'none' + cmd_sub_status = 'workingPump2' + pub_dict['cmd'] = 'workingAct2' + control_data['cmd'] = 'none' + else: + client1.write_registers(address=5, values=[193], slave=10) + client1.write_registers(address=5, values=[193], slave=11) + pub_dict['cmd'] = 'errorAct2' + cmd_status = 'errorAct2' + cmd_sub_status = 'errorPump2' + init_flag = 0 + + else: + if isinstance(pub_dict['cmd'], (int, float)): + pub_dict['cmd'] = 'none' elif control_data['mode'] == 'manual': - if control_data['inverter']['inverter1'] == 'On' and cmd_status[0] == 0: - frq = int(control_data['inverter']['inverter1Frq'] * 100) - acc = int(control_data['inverter']['inverter1Acc'] * 10) - dec = int(control_data['inverter']['inverter1Dec'] * 10) - client1.write_registers(address=4, values=[frq, 194, acc, dec], slave=10) - cmd_status[0] = 1 - elif control_data['inverter']['inverter1'] == 'Off' and cmd_status[0] == 1: - client1.write_registers(address=5, values=[193], slave=10) - cmd_status[0] = 0 - - if control_data['inverter']['inverter2'] == 'On' and cmd_status[1] == 0: - frq = int(control_data['inverter']['inverter1Frq'] * 100) - acc = int(control_data['inverter']['inverter1Acc'] * 10) - dec = int(control_data['inverter']['inverter1Dec'] * 10) - client1.write_registers(address=4, values=[frq, 194, acc, dec], slave=10) - cmd_status[1] = 1 - elif control_data['inverter']['inverter2'] == 'Off' and cmd_status[1] == 1: - client1.write_registers(address=5, values=[193], slave=10) - cmd_status[1] = 0 + if control_data != pre_dict: + pub_dict['cmd'] = 'manual' + if control_data['inverter']['inverter1'] == 'On' and cmd_status[0] == 0: + frq = int(control_data['inverter']['inverter1Frq'] * 100) + acc = int(control_data['inverter']['inverter1Acc'] * 10) + dec = int(control_data['inverter']['inverter1Dec'] * 10) + client1.write_registers(address=4, values=[frq, 194, acc, dec], slave=10) + cmd_status[0] = 1 + elif control_data['inverter']['inverter1'] == 'Off' and cmd_status[0] == 1: + client1.write_registers(address=5, values=[193], slave=10) + cmd_status[0] = 0 + + if control_data['inverter']['inverter2'] == 'On' and cmd_status[1] == 0: + frq = int(control_data['inverter']['inverter1Frq'] * 100) + acc = int(control_data['inverter']['inverter1Acc'] * 10) + dec = int(control_data['inverter']['inverter1Dec'] * 10) + client1.write_registers(address=4, values=[frq, 194, acc, dec], slave=10) + cmd_status[1] = 1 + elif control_data['inverter']['inverter2'] == 'Off' and cmd_status[1] == 1: + client1.write_registers(address=5, values=[193], slave=10) + cmd_status[1] = 0 - if control_data['valve1'] == 'On' and cmd_status[2] == 0: - valve_status[0] = True - cmd_status[2] = 1 - elif control_data['valve1'] == 'Off' and cmd_status[2] == 1: - valve_status[0] = False - cmd_status[2] = 0 + if control_data['valve1'] == 'On' and cmd_status[2] == 0: + valve_status[0] = True + cmd_status[2] = 1 + elif control_data['valve1'] == 'Off' and cmd_status[2] == 1: + valve_status[0] = False + cmd_status[2] = 0 - if control_data['valve2'] == 'On' and cmd_status[3] == 0: - valve_status[1] = True - cmd_status[3] = 1 - elif control_data['valve2'] == 'Off' and cmd_status[3] == 1: - valve_status[1] = False - cmd_status[3] = 0 + if control_data['valve2'] == 'On' and cmd_status[3] == 0: + valve_status[1] = True + cmd_status[3] = 1 + elif control_data['valve2'] == 'Off' and cmd_status[3] == 1: + valve_status[1] = False + cmd_status[3] = 0 - res = serial_obj.write_coils(address=0, values=valve_status, slave=5) + res = serial_obj.write_coils(address=0, values=valve_status, slave=5) + else: + pre_dict = control_data.copy() - elif control_data['mode'] == 'None': + elif control_data['mode'] == 'none': valve_status[0], valve_status[1] = False, False res = serial_obj.write_coils(address=0, values=valve_status, slave=5) client1.write_registers(address=5, values=[193], slave=10) client1.write_registers(address=5, values=[193], slave=11) else: - pub_dict['cmd'] = 'None' + pub_dict['cmd'] = 'none' except Exception as e: print(f'Device Setting Error: {e}') @@ -331,6 +386,7 @@ def get_modbus(evt, serial_obj): # with open(os.path.join(path, 'control.json'), 'w') as f: with open('./control.json', 'w') as f: json.dump(control_data, f, indent=4) + pre_dict = control_data.copy() def get_sensor(evt, serial_obj): global isThread, pub_dict, s_col @@ -345,79 +401,129 @@ def get_sensor(evt, serial_obj): except Exception as e: print(f'Error: {e}') +def get_pdu(evt, serial_obj): + global isThread, pub_dict, cp_col, tp_col + + pdu_dict = { + 'pduCDU1': '1E', + 'pduCDU2': '1F', + 'pduTank1': '28', + 'pduTank2': '29', + 'pduTank3': '2A', + 'pduTank4': '2B' + } + + pdu_list = cp_col + tp_col + pdu_list = [col for col in pdu_list if col != 0] + # print(pdu_list) + + while isThread: + evt.wait() + evt.clear() + for pdu in pdu_list: + rcv_data = [] + sum = 0 + cnt = 0 + command_hex = f'FEFF{pdu_dict[pdu]}01010000' + # print(command_hex) + command_bytes = bytes.fromhex(command_hex) + + for x in command_bytes[2:]: + sum += x + sum = sum & 0xff + sum = struct.pack('>B', sum) + snd_bytes = command_bytes + b'\x00' + sum + b'\xfd' + # print(f'snd_bytes: {snd_bytes}') + serial_obj.write(snd_bytes) + + while True: + res = serial_obj.read(1) + # print(res) + if res != b'': + rcv_data.append(res) + else: + cnt += 1 + + if cnt == 10: + break + + if len(rcv_data) >= 2: + if not(rcv_data[0] == b'\xfc' and rcv_data[1] == b'\xff'): + rcv_data = [] + break + elif rcv_data[:-1] == b'\xfd': + break + + if len(rcv_data): + sum = 0 + # print(f'rcv_data: {rcv_data}') + for x in rcv_data[2:-3]: + sum += int.from_bytes(x, byteorder='big') + sum = sum & 0xff + sum = struct.pack('>B', sum) + # print(f'sum: {sum}') + if rcv_data[-2] == sum: + byte_val = rcv_data[10:12] + int_val = int.from_bytes(byte_val[0] + byte_val[1], byteorder='big') + int_val /= 100 + pub_dict[pdu] = int_val + else: + continue + +def runAction(evt): + global isThread, pub_dict + cnt = 0 + while isThread: + evt.wait() + evt.clear() + if cnt: + # print(pub_dict) + sdtcloud.pubMessage(pub_dict) + else: + cnt += 1 + def timer_s0(evt): global isThread while isThread: evt.set() - time.sleep(1) + time.sleep(0.5) def timer_s1(evt): global isThread while isThread: evt.set() - time.sleep(5) + time.sleep(0.5) -def runAction(): - global ctl_data, pub_dict - sum_data = {key: 0.0 for key in pub_dict.keys()} - - cnt, cnt_limit = 0, 0 - interval = int(ctl_data['get_data_interval']) +def timer_s2(evt, interval): + global isThread - if interval <= 5: - cnt_limit = 1 - elif interval <= 1800: - cnt_limit = 10 - else: - cnt_limit = 100 - - act = 0 - - while True: - start = int(time.time() * 1000) - - for key, value in pub_dict.items(): - try: - sum_data[key] += value - except: - sum_data[key] = value - - end = int(time.time() * 1000) - diff = end - start - sleep_time = int(interval / cnt_limit) - (diff * 0.001) - cnt += 1 - if cnt == cnt_limit: - snd_data = {key: value / cnt_limit for key, value in sum_data.items()} - # print(snd_data) - sdtcloud.pubMessage(snd_data) - cnt = 0 - sum_data = {key: 0.0 for key in pub_dict.keys()} - - time.sleep(sleep_time) + while isThread: + evt.set() + time.sleep(interval) if __name__ == "__main__": - os.system(f'chmod 777 /dev/ttyS0') - os.system(f'chmod 777 /dev/ttyS1') + pw = 'Sdt2513!@' + os.system(f'echo {pw} | sudo -S chmod 777 /dev/ttyS0') + os.system(f'echo {pw} | sudo -S chmod 777 /dev/ttyS1') port_name_1 = '/dev/ttyS0' - client1 = ModbusClient(port=port_name_1, baudrate=19200, parity='N', stopbits=1, bytesize=8, timeout=0.25) + client1 = ModbusClient(port=port_name_1, baudrate=9600, parity='N', stopbits=1, bytesize=8, timeout=0.25) port_name_2 = '/dev/ttyS1' - client2 = ModbusClient(port=port_name_2, baudrate=9600, parity='N', stopbits=1, bytesize=8, timeout=0.25) + client2 = serial.Serial(port=port_name_2, baudrate=19200, parity='N', stopbits=1, bytesize=8, timeout=0.1) try: client1.connect() - client2.connect() except: sys.exit(0) - - g_zero_point = [0] * 2 - # path = '/home/ecn-2u/Aquarack/21u' + # path = '/home/sdtadmin/aquarack-sensor-collector' # with open(os.path.join(path, 'config.json'), 'r') as config: with open('./config.json', 'r') as config: cfg_data = json.load(config) + g_zero_point = [cfg_data['ref_zero_point']['oilInFlowRate'], cfg_data['ref_zero_point']['waterInFlowRate']] + # with open(os.path.join(path, 'control.json'), 'r') as control: with open('./control.json', 'r') as control: ctl_data = json.load(control) @@ -428,38 +534,58 @@ if __name__ == "__main__": len_s_col = len(cfg_data['cdu_sensor_list']) len_p_col = len(cfg_data['cdu_device_list']) len_S_col = len(cfg_data['status']) + len_cp_col = len(cfg_data['cdu_pdu_list']) + len_tp_col = len(cfg_data['tank_pdu_list']) a_col = [0] * len_a_col t_col = [0] * len_t_col d_col = [0] * len_d_col s_col = [0] * len_s_col p_col = [0] * len_p_col S_col = [0] * len_S_col + cp_col = [0] * len_cp_col + tp_col = [0] * len_tp_col for key, value in cfg_data['cdu_analog_list'].items(): if value[1] == 'y': a_col[value[0] - 1] = key + a_col = [col for col in a_col if col != 0] for key, value in cfg_data['tank_device_list'].items(): if value[1] == 'y': t_col[value[0] - 1] = key + t_col = [col for col in t_col if col != 0] for key, value in cfg_data['cdu_digital_list'].items(): if value[1] == 'y': d_col[value[0] - 1] = key - + d_col = [col for col in d_col if col != 0] + for key, value in cfg_data['cdu_sensor_list'].items(): if value[1] == 'y': s_col[value[0] - 1] = key - + s_col = [col for col in s_col if col != 0] + for key, value in cfg_data['cdu_device_list'].items(): if value[1] == 'y': p_col[value[0] - 1] = key - + p_col = [col for col in p_col if col != 0] + for key, value in cfg_data['status'].items(): if value[1] == 'y': S_col[value[0] - 1] = key + S_col = [col for col in S_col if col != 0] - pub_dict = {key: 0.0 for key in (a_col+t_col+d_col+s_col+p_col+S_col)} + for key, value in cfg_data['cdu_pdu_list'].items(): + if value[1] == 'y': + cp_col[value[0] - 1] = key + cp_col = [col for col in cp_col if col != 0] + + for key, value in cfg_data['tank_pdu_list'].items(): + if value[1] == 'y': + tp_col[value[0] - 1] = key + tp_col = [col for col in tp_col if col != 0] + + pub_dict = {key: 0.0 for key in (a_col+t_col+d_col+s_col+p_col+S_col+cp_col+tp_col)} # print(f'a_col: {a_col}') # print(f't_col: {t_col}') @@ -472,19 +598,29 @@ if __name__ == "__main__": timer_evt_s0 = threading.Event() timer_evt_s1 = threading.Event() + timer_evt_s2 = threading.Event() timer_evt_s0.set() timer_evt_s1.set() + timer_evt_s2.set() + + + thr_evt_s0 = threading.Thread(target=timer_s0, args=(timer_evt_s0,)) + thr_evt_s1 = threading.Thread(target=timer_s1, args=(timer_evt_s1,)) + thr_evt_s2 = threading.Thread(target=timer_s2, args=(timer_evt_s2, ctl_data['get_data_interval'],)) + thr_evt_s0.start() + thr_evt_s1.start() + thr_evt_s2.start() thr_modbus_rtu = threading.Thread(target=get_modbus, args=(timer_evt_s0, client1, )) thr_modbus_rtu.start() - thr_get_sensor = threading.Thread(target=get_sensor, args=(timer_evt_s1, client2,)) - thr_get_sensor.start() + # thr_get_sensor = threading.Thread(target=get_sensor, args=(timer_evt_s1, client2,)) + # thr_get_sensor.start() + + thr_get_pdu = threading.Thread(target=get_pdu, args=(timer_evt_s1, client2, )) + thr_get_pdu.start() + + thr_run = threading.Thread(target=runAction, args=(timer_evt_s2, )) + thr_run.start() - thr_evt_s0 = threading.Thread(target=timer_s0, args=(timer_evt_s0,)) - thr_evt_s1 = threading.Thread(target=timer_s1, args=(timer_evt_s1,)) - thr_evt_s0.start() - thr_evt_s1.start() - thr_run = threading.Thread(target=runAction, args=()) - thr_run.start() \ No newline at end of file