Compare commits

..

No commits in common. "main" and "v1.0.5" have entirely different histories.
main ... v1.0.5

5 changed files with 162 additions and 806 deletions

View File

@ -1,182 +1,24 @@
{ {
"status": { "get_data_interval": 10,
"cmd": [ "set_zero_temperature": "n",
1,
"y"
]
},
"ref_zero_point": { "ref_zero_point": {
"oilInFlowRate": 4005, "oilInFlowRate": 6143,
"waterInFlowRate": 4000 "oilOutFlowRate": 5998,
"waterInFlowRate": 5778,
"waterOutFlowRate": 5758
}, },
"cdu_digital_list": { "temperature_point": {
"valve1OpenStatus": [ "ch_1": ["n", "test_ch_1"],
1, "ch_2": ["n", "ch_2_name"],
"y" "ch_3": ["n", "ch_3_name"],
], "ch_4": ["n", "ch_4_name"],
"valve1CloseStatus": [ "ch_5": ["n", "ch_5_name"],
2, "ch_6": ["n", "ch_6_name"],
"y" "ch_7": ["n", "ch_7_name"],
], "ch_8": ["n", "ch_8_name"],
"valve2OpenStatus": [ "ch_9": ["n", "ch_2_name"],
3, "ch_10": ["n", "ch_10_name"],
"y" "ch_11": ["n", "ch_11_name"],
], "ch_12": ["n", "ch_12_name"]
"valve2CloseStatus": [
4,
"y"
],
"doorOpenSensor": [
5,
"y"
]
},
"cdu_analog_list": {
"oilInFlowRate": [
5,
"y"
],
"oilInTemp": [
6,
"y"
],
"waterInFlowRate": [
1,
"y"
],
"waterInTemp": [
2,
"y"
],
"oilOutTemp": [
8,
"y"
],
"waterOutTemp": [
4,
"y"
],
"oilInPress": [
7,
"y"
],
"waterInPress": [
3,
"y"
]
},
"cdu_sensor_list": {
"cduHumi": [
1,
"y"
],
"cduTemp": [
2,
"y"
]
},
"cdu_device_list": {
"pump1StatusFrequency": [
1,
"y"
],
"pump1StatusErrorCode": [
2,
"y"
],
"pump1StatusRunning": [
3,
"y"
],
"pump2StatusFrequency": [
4,
"y"
],
"pump2StatusErrorCode": [
5,
"y"
],
"pump2StatusRunning": [
6,
"y"
]
},
"cdu_pdu_list": {
"pduCDU1": [
1,
"y"
],
"pduCDU2": [
2,
"y"
]
},
"tank_device_list": {
"tankLeftTopFrontTemp": [
1,
"y"
],
"tankLeftBotFrontTemp": [
2,
"y"
],
"tankLeftTopBackTemp": [
3,
"y"
],
"tankLeftBotBackTemp": [
4,
"y"
],
"tankRightTopFrontTemp": [
5,
"y"
],
"tankRightBotFrontTemp": [
6,
"y"
],
"tankRightTopBackTemp": [
7,
"y"
],
"tankRightBotBackTemp": [
8,
"y"
],
"tankMidTopFrontTemp": [
9,
"y"
],
"tankMidBotFrontTemp": [
10,
"y"
],
"tankMidTopBackTemp": [
11,
"y"
],
"tankMidBotBackTemp": [
12,
"y"
]
},
"tank_pdu_list": {
"pduTank1": [
1,
"n"
],
"pduTank2": [
2,
"n"
],
"pduTank3": [
3,
"n"
],
"pduTank4": [
4,
"n"
]
} }
} }

View File

@ -1,18 +0,0 @@
{
"get_data_interval": 2,
"set_zero_flow": "n",
"valve1": "Off",
"valve2": "Off",
"inverter": {
"inverter1": "Off",
"inverter1Frq": 50,
"inverter1Acc": 5.0,
"inverter1Dec": 10.0,
"inverter2": "Off",
"inverter2Frq": 40,
"inverter2Acc": 5.0,
"inverter2Dec": 10.0
},
"mode": "auto",
"cmd": "none"
}

View File

@ -8,5 +8,5 @@ spec:
package: requirements.txt # 설치할 Python 패키지 정보 파일입니다.(기본 값은 requirement.txt 입니다.) package: requirements.txt # 설치할 Python 패키지 정보 파일입니다.(기본 값은 requirement.txt 입니다.)
runtime: python3.9 runtime: python3.9
stackbase: stackbase:
tagName: v2.0.4 # Stackbase(gitea)에 릴리즈 태그명 입니다. tagName: v1.0.5 # Stackbase(gitea)에 릴리즈 태그명 입니다.
repoName: aquarack-sensor-collector # Satackbase(gitea)에 저장될 저장소 이릅니다. repoName: aquarack-sensor-collector # Satackbase(gitea)에 저장될 저장소 이릅니다.

720
main.py
View File

@ -1,626 +1,158 @@
import sdtcloudpubsub import sdtcloudpubsub
import time
import uuid import uuid
from pymodbus.client import ModbusSerialClient as ModbusClient from pymodbus.client import ModbusSerialClient as ModbusClient
import os, json, sys, time import os, json
import threading, struct from collections import Counter
import serial
sdtcloud = sdtcloudpubsub.sdtcloudpubsub() sdtcloud = sdtcloudpubsub.sdtcloudpubsub()
sdtcloud.setClient(f"device-app-{uuid.uuid1()}") # parameter is client ID(string) sdtcloud.setClient(f"device-app-{uuid.uuid1()}") # parameter is client ID(string)
def get_inverter_errorcode(data): def get_point_temperature(serial_obj):
error_code = ['Reserved', 'OVT', 'EXT-A', 'ETX(BX)', 'COL', 'GFT', 'OHT', 'ETH', 'OLT', 'Reserved', 'EXT-B', 'EEP', 'FAN', 'POT', 'IOLT', 'LVT'] global t_col
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, s_col, path
global isThread, g_zero_point, pub_dict, a_col, d_col, t_col, p_col, S_col, s_col
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(path, 'control.json'), 'r') as f:
with open('./control.json', 'r') as f:
control_data = json.load(f)
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 # CWT-TM-320s
res_dict = {}
points = []
ch_list = [f'ch_{num}' for num in range(1, 13)]
with open('config.json', 'r') as f:
info = json.load(f)
t_col = []
for key, value in info['temperature_point'].items():
if value[0] == 'y':
t_col.append(value[1])
points.append(ch_list.index(key) + 1)
res_dict[value[1]] = 999.99
try: try:
tank_temperature = serial_obj.read_holding_registers(address=32, count=32, slave=2) res = serial_obj.read_holding_registers(address=32, count=32, slave=2)
# print(f'tank Temp: {tank_temperature.registers}')
for i, j in enumerate(t_col): for i, j in zip(res_dict.keys(), points):
pub_dict[j] = tank_temperature.registers[i] * 0.1 res_dict[i] = res.registers[j - 1] * 0.1
except Exception as e: except Exception as e:
print(f'Tank Sensor Error: {e}') print(f'error: {e}')
pass pass
# CTT-MB307D return res_dict
try:
cdu_analog = serial_obj.read_holding_registers(address=50, count=8, slave=5)
cdu_digital = serial_obj.read_discrete_inputs(address=0, count=8, slave=5)
# print(f'cdu_analog:{cdu_analog.registers}')
# print(f'cdu_digital:{cdu_digital.bits}')
if control_data['set_zero_flow'] == 'y': def get_keyence_devices(serial_obj):
# with open(os.path.join(path, 'config.json'), 'r') as f: global g_zero_point, k_col
with open('./config.json', 'r') as f: # CWT-MB307D
config_data = json.load(f) res_dict = {
"oilInFlowRate": 999.99,
"oilInTemperature": 999.99,
"oilOutFlowRate": 999.99,
"oilOutTemperature": 999.99,
for i, j in enumerate(a_col): "waterInFlowRate": 999.99,
if j == 'oilInFlowRate' or j == 'waterInFlowRate': "waterInTemperature": 999.99,
config_data['ref_zero_point'][j] = cdu_analog.registers[i] "waterOutFlowRate": 999.99,
"waterOutTemperature": 999.99
control_data['set_zero_flow'] = 'n'
# with open(os.path.join(path, 'config.json'), 'w') as f:
with open('./config.json', 'w') as f:
json.dump(config_data, f, indent=4)
g_zero_point[0] = config_data['ref_zero_point']['oilInFlowRate']
g_zero_point[1] = config_data['ref_zero_point']['waterInFlowRate']
for i, j in enumerate(a_col):
if j == 'oilInFlowRate':
pub_dict[j] = ((cdu_analog.registers[i] - g_zero_point[0]) / 16000) * 300
elif j == 'waterInFlowRate':
pub_dict[j] = ((cdu_analog.registers[i] - g_zero_point[1]) / 16000) * 300
elif j == 'oilInTemp' or j == 'waterInTemp':
pub_dict[j] = ((cdu_analog.registers[i] - 4000) / 16000) * 100
elif j == 'oilOutTemp' or j == 'waterOutTemp':
scale = ((cdu_analog.registers[i] - 4000) / 16000) # need to edit for temperature sensor
pub_dict[j] = (scale * 100) - 20
elif j == 'oilInPress' or j == 'waterInPress':
pub_dict[j] = ((cdu_analog.registers[i] - 4000) / 16000) # need to edit for pressure sensor
for i, j in enumerate(d_col):
pub_dict[j] = cdu_digital.bits[i]
# print(pub_dict)
except Exception as e:
print(f'CDU Divecs Error: {e}')
pass
try:
# M100
res = client1.read_holding_registers(address=9, count=6, slave=10)
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] / 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]
except Exception as e:
print(f'Inverter Status Error: {e}')
try:
if control_data['mode'] == 'auto':
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'] = 'workingInit'
elif cmd_sub_status == 'workingInit':
if (pub_dict['valve1OpenStatus'] == True
and pub_dict['valve2OpenStatus'] == True
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 != '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'] == '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 != 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['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)
else:
pre_dict = control_data.copy()
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'
except Exception as e:
print(f'Device Setting Error: {e}')
if pre_dict != control_data:
# 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
while isThread:
evt.wait()
evt.clear()
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'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 points = [1, 2, 3, 4, 5, 6, 7, 8]
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(0.5)
def timer_s1(evt):
global isThread
while isThread:
evt.set()
time.sleep(0.5)
def timer_s2(evt, interval):
global isThread
while isThread:
evt.set()
time.sleep(interval)
if __name__ == "__main__":
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=9600, parity='N', stopbits=1, bytesize=8, timeout=0.25)
port_name_2 = '/dev/ttyS1'
client2 = serial.Serial(port=port_name_2, baudrate=19200, parity='N', stopbits=1, bytesize=8, timeout=0.1)
try: try:
client1.connect() res = serial_obj.read_holding_registers(address=50, count=8, slave=5)
for i, j in enumerate(k_col):
if i % 2 == 0:
res_dict[j] = ((res.registers[i] - g_zero_point[i // 2]) / 16000) * 300
else:
res_dict[j] = ((res.registers[i] - 4000) / 16000) * 100
except Exception as e:
pass
return res_dict
def init_zero_detection(serial_obj, config_dict):
global g_zero_point, k_col
if config_dict['set_zero_temperature'] == 'y':
try:
res = serial_obj.read_holding_registers(address=50, count=8, slave=5)
for i, j in enumerate(k_col):
if not i % 2:
config_dict['ref_zero_point'][j] = res.registers[i]
config_dict['set_zero_temperature'] = 'n'
with open('./config.json', 'w') as f:
json.dump(config_dict, f, indent=4)
except: except:
sys.exit(0) return False
# path = '/home/sdtadmin/aquarack-sensor-collector' for idx, val in enumerate(k_col):
# with open(os.path.join(path, 'config.json'), 'r') as config: if not idx % 2:
g_zero_point[idx // 2] = config_dict['ref_zero_point'][val]
return True
def init_data_dict():
global k_col, t_col
# col = ["topLeftTemperature", "topRightTemperature", "bottomLeftTemperature", "bottomRightTemperature",
# "oilInFlowRate", "oilInTemperature", "oilOutFlowRate", "oilOutTemperature",
# "waterInFlowRate", "waterInTemperature", "waterOutFlowRate", "waterOutTemperature"]
col = k_col + t_col
return {key: 0.0 for key in col}
def runAction():
sum_data = init_data_dict()
# sum_data = {}
cnt, cnt_limit = 0, 0
while True:
with open('./config.json', 'r') as config: with open('./config.json', 'r') as config:
cfg_data = json.load(config) config_data = json.load(config)
g_zero_point = [cfg_data['ref_zero_point']['oilInFlowRate'], cfg_data['ref_zero_point']['waterInFlowRate']] interval = int(config_data['get_data_interval'])
# with open(os.path.join(path, 'control.json'), 'r') as control: if interval <= 5:
with open('./control.json', 'r') as control: cnt_limit = 1
ctl_data = json.load(control) elif interval <= 1800:
cnt_limit = 10
else:
cnt_limit = 100
len_a_col = len(cfg_data['cdu_analog_list']) init_zero_detection(client1, config_data)
len_t_col = len(cfg_data['tank_device_list'])
len_d_col = len(cfg_data['cdu_digital_list'])
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(): start = int(time.time() * 1000)
if value[1] == 'y': pub_data = {
a_col[value[0] - 1] = key **get_point_temperature(client1), **get_keyence_devices(client1)
a_col = [col for col in a_col if col != 0] }
for key, value in cfg_data['tank_device_list'].items(): for key, value in pub_data.items():
if value[1] == 'y': try:
t_col[value[0] - 1] = key sum_data[key] += value
t_col = [col for col in t_col if col != 0] except:
sum_data[key] = value
for key, value in cfg_data['cdu_digital_list'].items(): end = int(time.time() * 1000)
if value[1] == 'y': diff = end - start
d_col[value[0] - 1] = key sleep_time = int(interval / cnt_limit) - (diff * 0.001)
d_col = [col for col in d_col if col != 0] cnt += 1
if cnt == cnt_limit:
snd_data = {key: value / cnt_limit for key, value in sum_data.items()}
sdtcloud.pubMessage(snd_data)
cnt = 0
sum_data = init_data_dict()
for key, value in cfg_data['cdu_sensor_list'].items(): time.sleep(sleep_time)
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 __name__ == "__main__":
if value[1] == 'y': password = 'Sdt2513!@'
p_col[value[0] - 1] = key os.system(f'echo "{password}" | sudo chmod 777 /dev/ttyS0')
p_col = [col for col in p_col if col != 0] port_name = '/dev/ttyS0'
client1 = ModbusClient(port=port_name, baudrate=19200, parity='N', stopbits=1, bytesize=8, timeout=0.25)
for key, value in cfg_data['status'].items(): client1.connect()
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_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}')
# print(f'd_col: {d_col}')
# print(f's_col: {s_col}')
# print(f'p_col: {p_col}')
# print(f'S_col: {S_col}')
# runAction()
isThread = True
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_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()
g_zero_point = [0] * 4
k_col = ["oilInFlowRate","oilInTemperature","oilOutFlowRate","oilOutTemperature",
"waterInFlowRate","waterInTemperature","waterOutFlowRate","waterOutTemperature"]
t_col = []
runAction()

View File

@ -3,6 +3,6 @@ awsiotsdk
pyyaml pyyaml
pymodbus pymodbus
pyserial pyserial
#yaml yaml
AWSIoTPythonSDK AWSIoTPythonSDK
#sdtcloudpubsub #sdtcloudpubsub