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)에 저장될 저장소 이릅니다.

746
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'] # CWT-TM-320s
return ','.join(result) res_dict = {}
points = []
def get_modbus(evt, serial_obj): ch_list = [f'ch_{num}' for num in range(1, 13)]
# 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' with open('config.json', 'r') as f:
cmd_sub_status = 'none' info = json.load(f)
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
try:
tank_temperature = 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):
pub_dict[j] = tank_temperature.registers[i] * 0.1
except Exception as e:
print(f'Tank Sensor Error: {e}')
pass
# CTT-MB307D
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':
# with open(os.path.join(path, 'config.json'), 'r') as f:
with open('./config.json', 'r') as f:
config_data = json.load(f)
for i, j in enumerate(a_col):
if j == 'oilInFlowRate' or j == 'waterInFlowRate':
config_data['ref_zero_point'][j] = cdu_analog.registers[i]
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 = { t_col = []
'pduCDU1': '1E', for key, value in info['temperature_point'].items():
'pduCDU2': '1F', if value[0] == 'y':
'pduTank1': '28', t_col.append(value[1])
'pduTank2': '29', points.append(ch_list.index(key) + 1)
'pduTank3': '2A', res_dict[value[1]] = 999.99
'pduTank4': '2B'
try:
res = serial_obj.read_holding_registers(address=32, count=32, slave=2)
for i, j in zip(res_dict.keys(), points):
res_dict[i] = res.registers[j - 1] * 0.1
except Exception as e:
print(f'error: {e}')
pass
return res_dict
def get_keyence_devices(serial_obj):
global g_zero_point, k_col
# CWT-MB307D
res_dict = {
"oilInFlowRate": 999.99,
"oilInTemperature": 999.99,
"oilOutFlowRate": 999.99,
"oilOutTemperature": 999.99,
"waterInFlowRate": 999.99,
"waterInTemperature": 999.99,
"waterOutFlowRate": 999.99,
"waterOutTemperature": 999.99
} }
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: try:
evt.wait() res = serial_obj.read_holding_registers(address=50, count=8, slave=5)
evt.clear()
for pdu in pdu_list: for i, j in enumerate(k_col):
rcv_data = [] if i % 2 == 0:
sum = 0 res_dict[j] = ((res.registers[i] - g_zero_point[i // 2]) / 16000) * 300
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: else:
continue res_dict[j] = ((res.registers[i] - 4000) / 16000) * 100
except Exception as e:
pass
return res_dict
def runAction(evt): def init_zero_detection(serial_obj, config_dict):
global isThread, pub_dict global g_zero_point, k_col
cnt = 0
while isThread: if config_dict['set_zero_temperature'] == 'y':
evt.wait() try:
evt.clear() res = serial_obj.read_holding_registers(address=50, count=8, slave=5)
if cnt:
# print(pub_dict) for i, j in enumerate(k_col):
sdtcloud.pubMessage(pub_dict) 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:
return False
for idx, val in enumerate(k_col):
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:
config_data = json.load(config)
interval = int(config_data['get_data_interval'])
if interval <= 5:
cnt_limit = 1
elif interval <= 1800:
cnt_limit = 10
else: else:
cnt += 1 cnt_limit = 100
def timer_s0(evt): init_zero_detection(client1, config_data)
global isThread
start = int(time.time() * 1000)
while isThread: pub_data = {
evt.set() **get_point_temperature(client1), **get_keyence_devices(client1)
time.sleep(0.5) }
def timer_s1(evt): for key, value in pub_data.items():
global isThread try:
sum_data[key] += value
while isThread: except:
evt.set() sum_data[key] = value
time.sleep(0.5)
end = int(time.time() * 1000)
def timer_s2(evt, interval): diff = end - start
global isThread sleep_time = int(interval / cnt_limit) - (diff * 0.001)
cnt += 1
while isThread: if cnt == cnt_limit:
evt.set() snd_data = {key: value / cnt_limit for key, value in sum_data.items()}
time.sleep(interval) sdtcloud.pubMessage(snd_data)
cnt = 0
sum_data = init_data_dict()
time.sleep(sleep_time)
if __name__ == "__main__": if __name__ == "__main__":
pw = 'Sdt2513!@' password = 'Sdt2513!@'
os.system(f'echo {pw} | sudo -S chmod 777 /dev/ttyS0') os.system(f'echo "{password}" | sudo chmod 777 /dev/ttyS0')
os.system(f'echo {pw} | sudo -S chmod 777 /dev/ttyS1') port_name = '/dev/ttyS0'
port_name_1 = '/dev/ttyS0' client1 = ModbusClient(port=port_name, 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 = serial.Serial(port=port_name_2, baudrate=19200, parity='N', stopbits=1, bytesize=8, timeout=0.1)
try:
client1.connect()
except:
sys.exit(0)
# 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)
len_a_col = len(cfg_data['cdu_analog_list'])
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():
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]
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() client1.connect()
timer_evt_s1 = threading.Event()
timer_evt_s2 = threading.Event() g_zero_point = [0] * 4
timer_evt_s0.set() k_col = ["oilInFlowRate","oilInTemperature","oilOutFlowRate","oilOutTemperature",
timer_evt_s1.set() "waterInFlowRate","waterInTemperature","waterOutFlowRate","waterOutTemperature"]
timer_evt_s2.set() t_col = []
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()
runAction()

View File

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