Compare commits

...

6 Commits
v1.0.8 ... main

Author SHA1 Message Date
kh.kim 310f0b507d Commit message 2025-04-15 15:11:57 +09:00
kh.kim 5eff7bb7d3 Commit message 2025-04-04 13:59:00 +09:00
kh.kim 9722b2b8d0 Commit message 2025-04-04 13:36:26 +09:00
kh.kim bbc2f5e6cc Commit message 2025-04-04 11:17:12 +09:00
kh.kim f434c8e448 Commit message 2025-04-03 09:37:35 +09:00
kh.kim 92dd92016a Commit message 2025-02-04 15:28:52 +09:00
5 changed files with 809 additions and 165 deletions

View File

@ -1,24 +1,182 @@
{ {
"get_data_interval": 10, "status": {
"set_zero_temperature": "n", "cmd": [
"ref_zero_point": { 1,
"oilInFlowRate": 6143, "y"
"oilOutFlowRate": 5998, ]
"waterInFlowRate": 5778,
"waterOutFlowRate": 5758
}, },
"temperature_point": { "ref_zero_point": {
"ch_1": ["n", "test_ch_1"], "oilInFlowRate": 4005,
"ch_2": ["n", "ch_2_name"], "waterInFlowRate": 4000
"ch_3": ["n", "ch_3_name"], },
"ch_4": ["n", "ch_4_name"], "cdu_digital_list": {
"ch_5": ["n", "ch_5_name"], "valve1OpenStatus": [
"ch_6": ["n", "ch_6_name"], 1,
"ch_7": ["n", "ch_7_name"], "y"
"ch_8": ["n", "ch_8_name"], ],
"ch_9": ["n", "ch_2_name"], "valve1CloseStatus": [
"ch_10": ["n", "ch_10_name"], 2,
"ch_11": ["n", "ch_11_name"], "y"
"ch_12": ["n", "ch_12_name"] ],
"valve2OpenStatus": [
3,
"y"
],
"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"
]
} }
} }

18
control.json Normal file
View File

@ -0,0 +1,18 @@
{
"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: v1.0.8 # Stackbase(gitea)에 릴리즈 태그명 입니다. tagName: v2.0.4 # Stackbase(gitea)에 릴리즈 태그명 입니다.
repoName: aquarack-sensor-collector # Satackbase(gitea)에 저장될 저장소 이릅니다. repoName: aquarack-sensor-collector # Satackbase(gitea)에 저장될 저장소 이릅니다.

736
main.py
View File

@ -1,158 +1,626 @@
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 import os, json, sys, time
from collections import Counter import threading, struct
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_point_temperature(serial_obj): def get_inverter_errorcode(data):
global t_col error_code = ['Reserved', 'OVT', 'EXT-A', 'ETX(BX)', 'COL', 'GFT', 'OHT', 'ETH', 'OLT', 'Reserved', 'EXT-B', 'EEP', 'FAN', 'POT', 'IOLT', 'LVT']
# CWT-TM-320s result = [error_code[i] for i in range(16) if (data & (0x8000 >> i)) and error_code[i] != 'Reserved']
res_dict = {} return ','.join(result)
points = []
ch_list = [f'ch_{num}' for num in range(1, 13)]
with open('config.json', 'r') as f: def get_modbus(evt, serial_obj):
info = json.load(f) # 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
t_col = [] cmd_status = 'none'
for key, value in info['temperature_point'].items(): cmd_sub_status = 'none'
if value[0] == 'y': inverter_status = [0] * 6
t_col.append(value[1]) valve_status = [False] * 8
points.append(ch_list.index(key) + 1) pre_dict = {}
res_dict[value[1]] = 999.99 init_flag = 0
try: while isThread:
res = serial_obj.read_holding_registers(address=32, count=32, slave=2) evt.wait()
evt.clear()
for i, j in zip(res_dict.keys(), points): # with open(os.path.join(path, 'control.json'), 'r') as f:
res_dict[i] = res.registers[j - 1] * 0.1 with open('./control.json', 'r') as f:
except Exception as e: control_data = json.load(f)
print(f'error: {e}')
pass
return res_dict 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}')
def get_keyence_devices(serial_obj): # CWT-TM-320s
global g_zero_point, k_col try:
# CWT-MB307D tank_temperature = serial_obj.read_holding_registers(address=32, count=32, slave=2)
res_dict = { # print(f'tank Temp: {tank_temperature.registers}')
"oilInFlowRate": 999.99, for i, j in enumerate(t_col):
"oilInTemperature": 999.99, pub_dict[j] = tank_temperature.registers[i] * 0.1
"oilOutFlowRate": 999.99, except Exception as e:
"oilOutTemperature": 999.99, print(f'Tank Sensor Error: {e}')
pass
"waterInFlowRate": 999.99, # CTT-MB307D
"waterInTemperature": 999.99, try:
"waterOutFlowRate": 999.99, cdu_analog = serial_obj.read_holding_registers(address=50, count=8, slave=5)
"waterOutTemperature": 999.99 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 = {
'pduCDU1': '1E',
'pduCDU2': '1F',
'pduTank1': '28',
'pduTank2': '29',
'pduTank3': '2A',
'pduTank4': '2B'
} }
points = [1, 2, 3, 4, 5, 6, 7, 8] pdu_list = cp_col + tp_col
pdu_list = [col for col in pdu_list if col != 0]
# print(pdu_list)
try: while isThread:
res = serial_obj.read_holding_registers(address=50, count=8, slave=5) evt.wait()
evt.clear()
for i, j in enumerate(k_col): for pdu in pdu_list:
if i % 2 == 0: rcv_data = []
res_dict[j] = ((res.registers[i] - g_zero_point[i // 2]) / 16000) * 300 sum = 0
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:
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:
cnt_limit = 100
init_zero_detection(client1, config_data)
start = int(time.time() * 1000)
pub_data = {
**get_point_temperature(client1), **get_keyence_devices(client1)
}
for key, value in pub_data.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()}
sdtcloud.pubMessage(snd_data)
cnt = 0 cnt = 0
sum_data = init_data_dict() command_hex = f'FEFF{pdu_dict[pdu]}01010000'
# print(command_hex)
command_bytes = bytes.fromhex(command_hex)
time.sleep(sleep_time) 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__": if __name__ == "__main__":
password = 'Sdt2513!@' pw = 'Sdt2513!@'
os.system(f'echo "{password}" | sudo chmod 777 /dev/ttyS0') os.system(f'echo {pw} | sudo -S chmod 777 /dev/ttyS0')
port_name = '/dev/ttyS0' os.system(f'echo {pw} | sudo -S chmod 777 /dev/ttyS1')
client1 = ModbusClient(port=port_name, baudrate=19200, parity='N', stopbits=1, bytesize=8, timeout=0.25) 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)
client1.connect() 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()
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