2023-11-30 05:31:59 +00:00
|
|
|
import sys, os, time, json
|
|
|
|
import serial
|
|
|
|
import paho.mqtt.client as mqtt
|
|
|
|
import argparse
|
|
|
|
|
|
|
|
if os.system("lsmod | grep max7301") == 0:
|
|
|
|
os.system("rmmod gpio-max7301")
|
|
|
|
os.system("rmmod gpio-max730x")
|
|
|
|
os.system("rmmod gpio-pisosr")
|
|
|
|
os.system("insmod /lib/modules/5.4.31/extra/max3109test.ko")
|
|
|
|
|
|
|
|
serial_MFC = serial.Serial('/dev/ttyMAX0', baudrate=115200, bytesize=8,
|
|
|
|
parity='N', stopbits=1, timeout=0.5)
|
|
|
|
|
|
|
|
serial_TEMP = serial.Serial('/dev/ttyMAX3', baudrate=9600, bytesize=8,
|
|
|
|
parity='N', stopbits=1, timeout=0.5)
|
|
|
|
|
|
|
|
serial_WINDER = serial.Serial('/dev/ttyMAX2', baudrate=9600, bytesize=8,
|
|
|
|
parity='N', stopbits=1, timeout=0.5)
|
|
|
|
|
|
|
|
parser = argparse.ArgumentParser()
|
|
|
|
parser.add_argument('-config',help='')
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
|
|
ROOT_PATH = f'/usr/local/sdt/app/{args.config}'
|
|
|
|
|
|
|
|
with open(f'{ROOT_PATH}/connect_info.json') as f:
|
|
|
|
info = json.load(f)
|
|
|
|
|
|
|
|
MQTT_TOPIC = info['mqtt']['topic']
|
|
|
|
# MQTT_TOPIC = "/axrcnt/device-test/S0NQ0R223090003"
|
|
|
|
MQTT_ID = info['mqtt']['id']
|
|
|
|
MQTT_PW = info['mqtt']['pw']
|
|
|
|
MQTT_HOST_IP = info['mqtt']['host_ip']
|
|
|
|
MQTT_PORT = info['mqtt']['port']
|
|
|
|
|
|
|
|
mqtt_client = mqtt.Client(info['mqtt']['assetCode'])
|
|
|
|
mqtt_client.username_pw_set(MQTT_ID, MQTT_PW)
|
|
|
|
|
|
|
|
def MFC_Read_Flow(client):
|
|
|
|
command_hex = '235246310D' # '#RF1'
|
|
|
|
command_bytes = bytes.fromhex(command_hex)
|
|
|
|
|
|
|
|
client.write(command_bytes)
|
|
|
|
time.sleep(0.02)
|
|
|
|
ch1 = client.readline()
|
|
|
|
# print(ch1)
|
|
|
|
ch1 = str(ch1, 'utf-8')
|
2023-12-21 04:52:04 +00:00
|
|
|
# print(f'ch1: {ch1}')
|
|
|
|
ch1 = ch1.replace('\r', '')
|
|
|
|
|
2023-11-30 05:31:59 +00:00
|
|
|
if ch1 != '':
|
2023-12-21 04:52:04 +00:00
|
|
|
if len(ch1) < 8:
|
|
|
|
ch1 = float(ch1)
|
|
|
|
else:
|
|
|
|
ch1 = None
|
2023-11-30 05:31:59 +00:00
|
|
|
else:
|
|
|
|
ch1 = None
|
|
|
|
time.sleep(0.02)
|
|
|
|
|
2023-12-21 04:52:04 +00:00
|
|
|
client.reset_input_buffer()
|
|
|
|
|
2023-11-30 05:31:59 +00:00
|
|
|
command_hex = '235246320D' # '#RF2'
|
|
|
|
command_bytes = bytes.fromhex(command_hex)
|
|
|
|
|
|
|
|
client.write(command_bytes)
|
|
|
|
time.sleep(0.02)
|
|
|
|
ch2 = client.readline()
|
|
|
|
# print(ch2)
|
|
|
|
ch2 = str(ch2, 'utf-8')
|
2023-12-21 04:52:04 +00:00
|
|
|
# print(f'ch2: {ch2}')
|
|
|
|
ch2 = ch2.replace('\r', '')
|
2023-11-30 05:31:59 +00:00
|
|
|
if ch2 != '':
|
2023-12-21 04:52:04 +00:00
|
|
|
if len(ch2) < 8:
|
|
|
|
ch2 = float(ch2)
|
|
|
|
else:
|
|
|
|
ch2 = None
|
2023-11-30 05:31:59 +00:00
|
|
|
else:
|
|
|
|
ch2 = None
|
|
|
|
|
|
|
|
time.sleep(0.02)
|
|
|
|
|
2023-12-21 04:52:04 +00:00
|
|
|
client.reset_input_buffer()
|
|
|
|
|
2023-11-30 05:31:59 +00:00
|
|
|
data = {
|
|
|
|
"assetCode": info['mqtt']['assetCode'],
|
2023-12-21 04:52:04 +00:00
|
|
|
"timestamp": int(time.time() * 1000),
|
2023-11-30 05:31:59 +00:00
|
|
|
"dataType": "DATA",
|
|
|
|
"data": {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ch1 != None:
|
|
|
|
data['data']['hydrogen1'] = ch1
|
|
|
|
|
|
|
|
if ch2 != None:
|
|
|
|
data['data']['hydrogen2'] = ch2
|
|
|
|
|
|
|
|
# print(f'MFC: {data}')
|
|
|
|
Publish_mqtt(data)
|
|
|
|
|
|
|
|
def MFC_Write(client, cmd, ch, subcmd=None, value=None):
|
|
|
|
send_data = ['#', 'S']
|
|
|
|
if cmd == 'SetPoint':
|
|
|
|
send_data.append('S')
|
|
|
|
elif cmd == 'SetFlow':
|
|
|
|
send_data.append('F')
|
|
|
|
|
|
|
|
if ch == 'hydrogen1':
|
|
|
|
send_data.append('1')
|
|
|
|
else: # ch == 'hydrogen2
|
|
|
|
send_data.append('2')
|
|
|
|
|
|
|
|
if subcmd != None:
|
|
|
|
send_data.append(' ')
|
|
|
|
if subcmd == 'On':
|
|
|
|
send_data.append('1')
|
|
|
|
else: # subcmd = 'Off'
|
|
|
|
send_data.append('0')
|
|
|
|
|
|
|
|
if value != None:
|
|
|
|
send_data.append(' ')
|
|
|
|
send_data.append(value)
|
|
|
|
|
|
|
|
send_data.append('\r')
|
|
|
|
send_data = ''.join(send_data)
|
|
|
|
send_data = send_data.encode()
|
|
|
|
|
|
|
|
send_data_hex = send_data.hex()
|
|
|
|
send_data_hex = bytes.fromhex(send_data_hex)
|
|
|
|
|
|
|
|
client.write(send_data_hex)
|
|
|
|
time.sleep(0.02)
|
|
|
|
|
|
|
|
result = client.readline()
|
|
|
|
|
|
|
|
def Temp_Hum_Press_Read(client):
|
|
|
|
ch1_temp, ch1_humi, ch1_pres, ch2_temp, ch2_humi = None, None, None, None, None
|
|
|
|
|
2023-12-21 04:52:04 +00:00
|
|
|
command_hex = '410030315A53300D'
|
|
|
|
command_bytes = bytes.fromhex(command_hex)
|
|
|
|
|
2023-11-30 05:31:59 +00:00
|
|
|
client.write(command_bytes)
|
2023-12-21 04:52:04 +00:00
|
|
|
time.sleep(0.4)
|
2023-11-30 05:31:59 +00:00
|
|
|
ch1 = client.readline()
|
2023-12-21 04:52:04 +00:00
|
|
|
time.sleep(0.02)
|
|
|
|
# print(f'Receive: 01 {ch1}')
|
2023-11-30 05:31:59 +00:00
|
|
|
parts = ch1.split()
|
|
|
|
|
2023-12-21 04:52:04 +00:00
|
|
|
for i in parts:
|
|
|
|
if b'\xf8C' in i:
|
|
|
|
i = i.replace(b'\xf8C', b'')
|
|
|
|
if i != b'':
|
|
|
|
ch1_temp = float(i)
|
|
|
|
|
|
|
|
|
|
|
|
if b'RH%' in i:
|
|
|
|
i = i.replace(b'RH%', b'')
|
|
|
|
if i != b'':
|
|
|
|
ch1_humi = float(i)
|
|
|
|
|
|
|
|
if b'hPa' in i:
|
|
|
|
i = i.replace(b'hPa', b'')
|
|
|
|
if i != b'':
|
|
|
|
ch1_pres = float(i)
|
|
|
|
|
|
|
|
client.reset_input_buffer()
|
2023-11-30 05:31:59 +00:00
|
|
|
|
2023-12-21 04:52:04 +00:00
|
|
|
command_hex = '410030305A53300D'
|
|
|
|
command_bytes = bytes.fromhex(command_hex)
|
|
|
|
|
2023-11-30 05:31:59 +00:00
|
|
|
client.write(command_bytes)
|
2023-12-21 04:52:04 +00:00
|
|
|
time.sleep(0.4)
|
2023-11-30 05:31:59 +00:00
|
|
|
ch2 = client.readline()
|
2023-12-21 04:52:04 +00:00
|
|
|
time.sleep(0.02)
|
|
|
|
# print(f'Receive: 00 {ch2}')
|
2023-11-30 05:31:59 +00:00
|
|
|
parts = ch2.split()
|
|
|
|
|
2023-12-21 04:52:04 +00:00
|
|
|
for i in parts:
|
|
|
|
if b'\xf8C' in i:
|
|
|
|
i = i.replace(b'\xf8C', b'')
|
|
|
|
if i != b'':
|
|
|
|
ch2_temp = float(i)
|
2023-11-30 05:31:59 +00:00
|
|
|
|
2023-12-21 04:52:04 +00:00
|
|
|
if b'RH%' in i:
|
|
|
|
i = i.replace(b'RH%', b'')
|
|
|
|
if i != b'':
|
|
|
|
ch2_humi = float(i)
|
|
|
|
|
|
|
|
client.reset_input_buffer()
|
2023-11-30 05:31:59 +00:00
|
|
|
|
|
|
|
data = {
|
|
|
|
"assetCode":info['mqtt']['assetCode'],
|
2023-12-21 04:52:04 +00:00
|
|
|
"timestamp": int(time.time() * 1000),
|
2023-11-30 05:31:59 +00:00
|
|
|
"dataType": "DATA",
|
|
|
|
"data": {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ch1_temp != None:
|
|
|
|
data['data']['tempOn'] = ch1_temp
|
|
|
|
|
|
|
|
if ch1_humi != None:
|
2023-12-21 04:52:04 +00:00
|
|
|
data['data']['humiOn'] = ch1_humi
|
2023-11-30 05:31:59 +00:00
|
|
|
|
|
|
|
if ch1_pres != None:
|
|
|
|
data['data']['presOn'] = ch1_pres
|
|
|
|
|
|
|
|
if ch2_temp != None:
|
|
|
|
data['data']['tempSb'] = ch2_temp
|
|
|
|
|
|
|
|
if ch2_humi != None:
|
|
|
|
data['data']['humiSb'] = ch2_humi
|
|
|
|
|
|
|
|
# print(data)
|
|
|
|
|
|
|
|
Publish_mqtt(data)
|
|
|
|
|
|
|
|
def Set_WinderSpeed(client, value):
|
|
|
|
return 0
|
|
|
|
|
|
|
|
def Publish_mqtt(data):
|
|
|
|
send_mqtt_data = json.dumps(data, indent=4)
|
|
|
|
|
|
|
|
while True:
|
|
|
|
try:
|
|
|
|
mqtt_client.connect(host=MQTT_HOST_IP, port=MQTT_PORT)
|
|
|
|
break
|
|
|
|
except:
|
|
|
|
continue
|
|
|
|
|
|
|
|
mqtt_client.publish(topic=MQTT_TOPIC, payload=send_mqtt_data)
|
|
|
|
|
|
|
|
while True:
|
|
|
|
try:
|
|
|
|
mqtt_client.disconnect()
|
|
|
|
break
|
|
|
|
except:
|
|
|
|
continue
|
|
|
|
|
|
|
|
def Command_Read():
|
|
|
|
with open(f'{ROOT_PATH}/control.json', 'r', encoding='UTF-8') as f:
|
|
|
|
cmd = json.load(f)
|
|
|
|
|
|
|
|
# print(cmd)
|
|
|
|
if cmd['type'] != 'null':
|
|
|
|
if 'start' in cmd['type']:
|
|
|
|
if cmd['cmd']['hydrogen1'] != 'null':
|
|
|
|
MFC_Write(client=serial_MFC, ch='hydrogen1', cmd='SetPoint', value=cmd['cmd']['hydrogen1'])
|
|
|
|
MFC_Write(client=serial_MFC, ch='hydrogen1', cmd='SetFlow', subcmd='On')
|
|
|
|
|
|
|
|
if cmd['cmd']['hydrogen2'] != 'null':
|
|
|
|
MFC_Write(client=serial_MFC, ch='hydrogen2', cmd='SetPoint', value=cmd['cmd']['hydrogen2'])
|
|
|
|
MFC_Write(client=serial_MFC, ch='hydrogen2', cmd='SetFlow', subcmd='On')
|
|
|
|
|
|
|
|
if cmd['cmd']['speedRol'] != 'null':
|
|
|
|
Set_WinderSpeed(serial_WINDER, value=cmd['cmd']['speedRol'])
|
|
|
|
|
|
|
|
elif 'change' in cmd['type']:
|
|
|
|
if cmd['cmd']['hydrogen1'] != 'null':
|
|
|
|
MFC_Write(client=serial_MFC, ch='hydrogen1', cmd='SetPoint', value=cmd['cmd']['hydrogen1'])
|
|
|
|
|
|
|
|
if cmd['cmd']['hydrogen2'] != 'null':
|
|
|
|
MFC_Write(client=serial_MFC, ch='hydrogen2', cmd='SetPoint', value=cmd['cmd']['hydrogen2'])
|
|
|
|
|
|
|
|
if cmd['cmd']['speedRol'] != 'null':
|
|
|
|
Set_WinderSpeed(serial_WINDER, value=cmd['cmd']['speedRol'])
|
|
|
|
|
|
|
|
else: # 'stop' in cmd['type]
|
|
|
|
MFC_Write(client=serial_MFC, ch='hydrogen1', cmd='SetFlow', subcmd='Off')
|
|
|
|
MFC_Write(client=serial_MFC, ch='hydrogen2', cmd='SetFlow', subcmd='Off')
|
|
|
|
Set_WinderSpeed(serial_WINDER, value=cmd['cmd']['speedRol'])
|
|
|
|
|
|
|
|
cmd = {
|
|
|
|
'type': 'null',
|
|
|
|
'cmd': {
|
|
|
|
'hydrogen1': 'null',
|
|
|
|
'hydrogen2': 'null',
|
|
|
|
'speedRol': 'null'
|
|
|
|
}
|
|
|
|
}
|
|
|
|
with open(f'{ROOT_PATH}/control.json', 'w') as f:
|
|
|
|
json.dump(cmd, f)
|
|
|
|
|
|
|
|
while True:
|
|
|
|
start = time.time()
|
|
|
|
|
|
|
|
Command_Read()
|
|
|
|
|
|
|
|
MFC_Read_Flow(serial_MFC)
|
|
|
|
|
|
|
|
Temp_Hum_Press_Read(serial_TEMP)
|
|
|
|
|
|
|
|
end = time.time()
|
|
|
|
diff = end - start
|
|
|
|
# print(diff)
|
|
|
|
if diff < 3:
|
|
|
|
time.sleep(3 - diff)
|