Initial commit with alarms and event log
This commit is contained in:
9
config.txt
Normal file
9
config.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
|
||||
"driverFileName":"easttexas.py",
|
||||
"deviceName":"easttexas",
|
||||
"driverId":"0110",
|
||||
"releaseVersion":"1",
|
||||
"files": {
|
||||
"file1":"easttexas.py"}
|
||||
}
|
||||
163
easttexas.py
Normal file
163
easttexas.py
Normal file
@@ -0,0 +1,163 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import traceback
|
||||
import threading
|
||||
import time
|
||||
import os
|
||||
from device_base import deviceBase
|
||||
from datetime import datetime
|
||||
import requests
|
||||
import json
|
||||
import calendar
|
||||
import pickle
|
||||
import minimalmodbus
|
||||
import minimalmodbusM1
|
||||
|
||||
|
||||
class start(threading.Thread, deviceBase):
|
||||
|
||||
def __init__(self, name=None, number=None, mac=None, Q=None, mcu=None, companyId=None, offset=None, mqtt=None, Nodes=None):
|
||||
threading.Thread.__init__(self)
|
||||
deviceBase.__init__(self, name=name, number=number, mac=mac, Q=Q, mcu=mcu, companyId=companyId, offset=offset, mqtt=mqtt, Nodes=Nodes)
|
||||
self.daemon = True
|
||||
self.version = "1"
|
||||
self.finished = threading.Event()
|
||||
|
||||
# Setup Modbus Connection
|
||||
baud = 115200
|
||||
mb_connected = False
|
||||
while not mb_connected:
|
||||
mb_connected = self.mcu.set232Baud(baud)
|
||||
time.sleep(1)
|
||||
|
||||
ser232 = self.mcu.rs232
|
||||
self.modbus_interface = minimalmodbusM1.Instrument(1, ser232)
|
||||
self.modbus_interface.address = 1
|
||||
self.event_log = []
|
||||
|
||||
threading.Thread.start(self)
|
||||
|
||||
|
||||
# this is a required function for all drivers, its goal is to upload some piece of data
|
||||
# about your device so it can be seen on the web
|
||||
def register(self):
|
||||
self.sendtodb("connected", "True", 0)
|
||||
|
||||
def run(self):
|
||||
first_scan = True
|
||||
|
||||
try:
|
||||
with open('eventlog.pickle', 'rb') as evt_pickle:
|
||||
self.event_log = pickle.load(evt_pickle)
|
||||
print "found pickled Event Log dictionary: {0}".format(self.event_log)
|
||||
except:
|
||||
print "couldn't load Event Log from pickle"
|
||||
|
||||
|
||||
|
||||
# Dynamic Alarms
|
||||
dyn_alarm_registers = {
|
||||
1: {'ch': 'norpm', 'last_value': None, 'last_send': 0},
|
||||
2: {'ch': 'nocrank', 'last_value': None, 'last_send': 0},
|
||||
3: {'ch': 'beltslippage', 'last_value': None, 'last_send': 0},
|
||||
4: {'ch': 'peakpolishedrodhp', 'last_value': None, 'last_send': 0},
|
||||
5: {'ch': 'vfdpeakloadlimit', 'last_value': None, 'last_send': 0},
|
||||
6: {'ch': 'vfdminloadlimit', 'last_value': None, 'last_send': 0},
|
||||
7: {'ch': 'invalidhoadigital', 'last_value': None, 'last_send': 0},
|
||||
8: {'ch': 'invalidlinearpumpdigital', 'last_value': None, 'last_send': 0},
|
||||
9: {'ch': 'cryoutalarm', 'last_value': None, 'last_send': 0},
|
||||
10: {'ch': 'vfdcommerror', 'last_value': None, 'last_send': 0},
|
||||
11: {'ch': 'vfddrivefaulterror', 'last_value': None, 'last_send': 0},
|
||||
12: {'ch': 'vfddrivefaultbypass', 'last_value': None, 'last_send': 0},
|
||||
13: {'ch': 'vfddrivepardifference', 'last_value': None, 'last_send': 0},
|
||||
14: {'ch': 'vfdkeypadcontrol', 'last_value': None, 'last_send': 0},
|
||||
15: {'ch': 'vfdswitchoff', 'last_value': None, 'last_send': 0},
|
||||
16: {'ch': 'vfdpresswengaged', 'last_value': None, 'last_send': 0},
|
||||
17: {'ch': 'invalidtubingsize', 'last_value': None, 'last_send': 0},
|
||||
18: {'ch': 'vfddrivebypassswengaged', 'last_value': None, 'last_send': 0},
|
||||
19: {'ch': 'vfdabbigbtfansnotconfig', 'last_value': None, 'last_send': 0},
|
||||
20: {'ch': 'vfdabbigbtfansconflict', 'last_value': None, 'last_send': 0}
|
||||
}
|
||||
|
||||
# Latched Alarms
|
||||
latched_alarm_registers = {
|
||||
33: {'ch': 'changeinprogramming', 'last_value': None, 'last_send': 0},
|
||||
34: {'ch': 'resettodefaults', 'last_value': None, 'last_send': 0},
|
||||
35: {'ch': 'changepassword', 'last_value': None, 'last_send': 0},
|
||||
37: {'ch': 'vfddrivefaulterror', 'last_value': None, 'last_send': 0},
|
||||
38: {'ch': 'vfddrivefaultbypass', 'last_value': None, 'last_send': 0},
|
||||
39: {'ch': 'vfdkeypadcontrol', 'last_value': None, 'last_send': 0},
|
||||
40: {'ch': 'vfdswitchoff', 'last_value': None, 'last_send': 0},
|
||||
41: {'ch': 'vfdpresswengaged', 'last_value': None, 'last_send': 0},
|
||||
42: {'ch': 'malfunctionlockout', 'last_value': None, 'last_send': 0},
|
||||
43: {'ch': 'vfddrivebypassswengaged', 'last_value': None, 'last_send': 0},
|
||||
44: {'ch': 'vfdabbigbtfansnotconfig', 'last_value': None, 'last_send': 0},
|
||||
45: {'ch': 'vfdabbigbtfansconflict', 'last_value': None, 'last_send': 0}
|
||||
}
|
||||
|
||||
def check_alarm_register(register, prefix, obj):
|
||||
channel = "{}_{}".format(prefix, obj['ch'])
|
||||
test_coil = self.modbus_interface.read_bit(register, functioncode=1)
|
||||
if not (test_coil == obj['last_value']) or (time.time() - obj['last_send']) > 3600:
|
||||
self.sendtodb(channel, test_coil, 0)
|
||||
obj['last_value'] = test_coil
|
||||
obj['last_send'] = time.time()
|
||||
return obj
|
||||
|
||||
|
||||
while True:
|
||||
try:
|
||||
dyn_alarm_act = not self.modbus_interface.read_bit(32, functioncode=1) == 0
|
||||
latched_alarm_act = not self.modbus_interface.read_bit(64, functioncode=1) == 0
|
||||
except Exception as e:
|
||||
print("Unable to get alarm active tags:\n{}".format(e))
|
||||
|
||||
if dyn_alarm_act or first_scan:
|
||||
print("There's a dynamic alarm")
|
||||
for r in dyn_alarm_registers:
|
||||
try:
|
||||
dyn_alarm_registers[r] = check_alarm_register(r, 'alarm_dyn', dyn_alarm_registers[r])
|
||||
except Exception as e:
|
||||
print("Error during dyn_alarm_registers loop:\n{}".format(e))
|
||||
continue
|
||||
else:
|
||||
print("No dynamic alarms")
|
||||
|
||||
if latched_alarm_act or first_scan:
|
||||
print("There's a latched alarm")
|
||||
for r in latched_alarm_registers:
|
||||
try:
|
||||
latched_alarm_registers[r] = check_alarm_register(r, 'alarm_lat', latched_alarm_registers[r])
|
||||
except Exception as e:
|
||||
print("Error during latched_alarm_registers loop:\n{}".format(e))
|
||||
continue
|
||||
else:
|
||||
print("No latched alarms")
|
||||
|
||||
self.check_EventLog()
|
||||
|
||||
first_scan = False
|
||||
time.sleep(10)
|
||||
|
||||
|
||||
def check_EventLog(self):
|
||||
end_of_eventlog = False
|
||||
event_log_changed = False
|
||||
event_log_index = 0
|
||||
while not end_of_eventlog:
|
||||
event_dt_register = 802 + event_log_index
|
||||
event_id_register = 602 + event_log_index
|
||||
event_dt = self.modbus_interface.read_register(event_dt_register, functioncode=4)
|
||||
if not event_dt in self.event_log:
|
||||
event_id = self.modbus_interface.read_register(event_id_register, functioncode=4)
|
||||
# self.sendtodb('event_log', '{"event_id":{}, "event_dt": {}}'.format(event_id, event_dt), event_dt)
|
||||
print('{"event_id":{}, "event_dt": {}}'.format(event_id, event_dt))
|
||||
self.event_log.append(event_dt)
|
||||
event_log_changed = True
|
||||
else:
|
||||
end_of_eventlog = True
|
||||
if event_log_changed:
|
||||
with open('event_log.pickle', 'wb') as handle:
|
||||
pickle.dump(self.event_log, handle)
|
||||
return True
|
||||
|
||||
Reference in New Issue
Block a user