More Meshify Scheduler fixes

This commit is contained in:
Patrick McDonagh
2017-05-24 19:01:37 -05:00
parent cf610811cf
commit bee4fe3b06
5 changed files with 6100 additions and 5849 deletions

File diff suppressed because one or more lines are too long

View File

@@ -131,7 +131,6 @@ class Channel:
elif force_send:
send_needed = True
send_reason = "forced"
if send_needed:
self.last_value = self.value
if self.map_:
@@ -143,5 +142,5 @@ class Channel:
else:
self.value = v[0]
self.last_send_time = time.time()
# print("Sending {} for {} - {}".format(self.value, self.mesh_name, send_reason))
print("Sending {} for {} - {}".format(self.value, self.mesh_name, send_reason))
return send_needed

View File

@@ -2,3 +2,14 @@
data-channelId="<%= channels["advvfdipp.log"].channelId %>"
class="data-table btn-block btn btn-theme animated"
title="Device Log"><i style='margin-left: 0.5em; cursor: pointer' class="fa fa-th-list icon-theme"></i> Device Log</a>
<a href="#"
data-refreshpause="1"
data-staticsend="1"
data-channelId="<%= channels["advvfdipp.sync"].channelId %>"
data-techname="<%=channels["advvfdipp.sync"].techName %>"
data-name="<%= channels["advvfdipp.sync"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.sync"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.sync"].channelId %>"
class="btn btn-large btn-block btn-theme animated setstatic mqtt">
<i class="icon-repeat icon-white mqtt" ></i>Sync All Data</a>

View File

@@ -7,37 +7,42 @@ _ = None
plc_ip_address = "10.20.4.36"
class ScheduleHistoryRun:
class ScheduleRun:
"""Hold config for a schedule history run."""
def __init__(self, index_):
def __init__(self, index_, type_="Schedule"):
"""Initialize the class."""
self.index_ = index_
self.json = False
if type_ in ["Schedule", "History"]:
self.type_ = type_
else:
self.type_ = "Schedule"
print("SERIOUS ERROR! {} IS NOT A VALID TYPE FOR ScheduleRun with Index = {}".format(type_, index_))
self.channels = [
Channel(plc_ip_address, "sch_hist_id{}".format(self.index_),
"sch_RunHistory[{}].id".format(self.index_), "DINT", 0.5, 3600),
Channel(plc_ip_address, "sch_hist_controlmode{}".format(self.index_),
"sch_RunHistory[{}].controlmode".format(self.index_), "STRING", _, 3600, map_=maps['pid_controlmode']),
Channel(plc_ip_address, "sch_hist_controlsp{}".format(self.index_),
"sch_RunHistory[{}].controlSetpoint".format(self.index_), "REAL", 0.5, 3600),
Channel(plc_ip_address, "sch_hist_complparam{}".format(self.index_),
"sch_RunHistory[{}].completionParameter".format(self.index_), "STRING", _, 3600, map_=maps['completion_parameter']),
Channel(plc_ip_address, "sch_hist_complcomp{}".format(self.index_),
"sch_RunHistory[{}].completionComparison".format(self.index_), "STRING", _, 3600, map_=maps['completion_comparison']),
Channel(plc_ip_address, "sch_hist_compltarget{}".format(self.index_),
"sch_RunHistory[{}].completionValueTarget".format(self.index_), "REAL", 0.5, 3600),
Channel(plc_ip_address, "sch_hist_complactual{}".format(self.index_),
"sch_RunHistory[{}].completionValueCurrent".format(self.index_), "REAL", 10.0, 3600),
Channel(plc_ip_address, "sch_hist_bbltotal{}".format(self.index_),
"sch_RunHistory[{}].BBLTotal".format(self.index_), "REAL", 10.0, 3600)
Channel(plc_ip_address, "sch_{}_id{}".format(self.type_, self.index_),
"sch_Run{}[{}].id".format(self.type_, self.index_), "DINT", 0.5, 3600),
Channel(plc_ip_address, "sch_{}_controlmode{}".format(self.type_, self.index_),
"sch_Run{}[{}].controlmode".format(self.type_, self.index_), "STRING", _, 3600, map_=maps['pid_controlmode']),
Channel(plc_ip_address, "sch_{}_controlsp{}".format(self.type_, self.index_),
"sch_Run{}[{}].controlSetpoint".format(self.type_, self.index_), "REAL", 0.5, 3600),
Channel(plc_ip_address, "sch_{}_complparam{}".format(self.type_, self.index_),
"sch_Run{}[{}].completionParameter".format(self.type_, self.index_), "STRING", _, 3600, map_=maps['completion_parameter']),
Channel(plc_ip_address, "sch_{}_complcomp{}".format(self.type_, self.index_),
"sch_Run{}[{}].completionComparison".format(self.type_, self.index_), "STRING", _, 3600, map_=maps['completion_comparison']),
Channel(plc_ip_address, "sch_{}_compltarget{}".format(self.type_, self.index_),
"sch_Run{}[{}].completionValueTarget".format(self.type_, self.index_), "REAL", 0.5, 3600),
Channel(plc_ip_address, "sch_{}_complactual{}".format(self.type_, self.index_),
"sch_Run{}[{}].completionValueCurrent".format(self.type_, self.index_), "REAL", 10.0, 3600),
Channel(plc_ip_address, "sch_{}_bbltotal{}".format(self.type_, self.index_),
"sch_Run{}[{}].BBLTotal".format(self.type_, self.index_), "REAL", 10.0, 3600)
]
def read(self):
def read(self, force_send=False):
"""Read values of the schedule history from the PLC."""
new_value = False
for c in self.channels:
if c.read(force_send=False):
if c.read(force_send):
new_value = True
return new_value

View File

@@ -2,10 +2,11 @@
import threading
from device_base import deviceBase
from Channel import Channel
from Channel import Channel, write_tag
from Maps import adv_vfd_ipp_map as maps
from Scheduler import ScheduleHistoryRun
from Scheduler import ScheduleRun
import json
import time
try:
with open("persist.json", 'r') as persist_file:
@@ -22,6 +23,15 @@ _ = None
plc_ip_address = "10.20.4.36"
def reverse_map(value, map_):
"""Perform the opposite of mapping to an object."""
for x in map_:
if map_[x] == value:
return x
return None
channels = [
Channel(plc_ip_address, "flowrate", "val_Flowmeter", "REAL", 5.0, 3600),
Channel(plc_ip_address, "fluidlevel", "val_FluidLevel", "REAL", 10.0, 3600),
@@ -58,14 +68,21 @@ channels = [
Channel(plc_ip_address, "temperatureshutdownlimit", "AIn_IntakeTemperature.Val_HiLim", "REAL", 0.5, 14400),
Channel(plc_ip_address, "temperaturestartuplimit", "AIn_IntakeTemperature.Val_LoLim", "REAL", 0.5, 14400),
Channel(plc_ip_address, "sensorheight", "cfg_DHSensorDistToIntake", "REAL", 0.5, 14400),
Channel(plc_ip_address, "sch_enabled", "sch_enabled", "BOOL", _, 3600),
Channel(plc_ip_address, "sch_enabled", "sch_enabled", "BOOL", _, 3600)
]
scheduler_history = [
ScheduleHistoryRun(0), ScheduleHistoryRun(1), ScheduleHistoryRun(2),
ScheduleHistoryRun(3), ScheduleHistoryRun(4), ScheduleHistoryRun(5),
ScheduleHistoryRun(6), ScheduleHistoryRun(7), ScheduleHistoryRun(8),
ScheduleHistoryRun(9)
ScheduleRun(0, type_="History"), ScheduleRun(1, type_="History"), ScheduleRun(2, type_="History"),
ScheduleRun(3, type_="History"), ScheduleRun(4, type_="History"), ScheduleRun(5, type_="History"),
ScheduleRun(6, type_="History"), ScheduleRun(7, type_="History"), ScheduleRun(8, type_="History"),
ScheduleRun(9, type_="History")
]
scheduler_schedule = [
ScheduleRun(0, type_="Schedule"), ScheduleRun(1, type_="Schedule"), ScheduleRun(2, type_="Schedule"),
ScheduleRun(3, type_="Schedule"), ScheduleRun(4, type_="Schedule"), ScheduleRun(5, type_="Schedule"),
ScheduleRun(6, type_="Schedule"), ScheduleRun(7, type_="Schedule"), ScheduleRun(8, type_="Schedule"),
ScheduleRun(9, type_="Schedule")
]
@@ -87,11 +104,17 @@ class start(threading.Thread, deviceBase):
# about your device so it can be seen on the web
def register(self):
"""Register the driver."""
self.channels["status"]["last_value"] = ""
self.sendtodb("log", "BOOM! Booted.", 0)
def run(self):
"""Actually run the driver."""
global persist
wait_sec = 30
for i in range(0, wait_sec):
print("advvfdipp driver will start in {} seconds".format(wait_sec - i))
time.sleep(1)
print("BOOM! Starting advvfdipp driver...")
send_loops = 0
while True:
if self.forceSend:
print "FORCE SEND: TRUE"
@@ -105,16 +128,45 @@ class start(threading.Thread, deviceBase):
if this_sch_h['id'] > persist['last_schedule_history']['id']:
persist['last_schedule_history'] = this_sch_h
print(json.dumps(this_sch_h, indent=4))
self.sendtodbJSON("run_history", this_sch_h, this_sch_h['timestamp'])
self.sendtodbJSON("run_history", json.dumps(this_sch_h), this_sch_h['timestamp'])
with open("persist.json", 'w') as persist_file:
json.dump(persist, persist_file, indent=4)
for sch_s in scheduler_schedule:
if sch_s.read(self.forceSend):
self.sendtodbJSON("run_schedule", json.dumps(sch_s.jsonify()), 0)
print("advvfdipp driver still alive...")
if self.forceSend:
self.forceSend = False
if send_loops > 2:
print("Turning off forceSend")
self.forceSend = False
send_loops = 0
else:
send_loops += 1
def advvfdipp_sync(self, name, value):
"""Sync all data from the driver."""
self.forceSend = True
self.sendtodb("log", "synced", 0)
return True
def advvfdipp_addtoschedule(self, name, value):
"""Add an entry into the scheduler."""
new_sch = json.loads(value)
try:
id = int(new_sch['id'])
control_mode = {"tag": "sch_RunSchedule[{}].controlMode".format(id), "val": reverse_map(new_sch['control_mode'], maps['pid_controlmode'])}
control_setpoint = {"tag": "sch_RunSchedule[{}].controlSetpoint".format(id), "val": new_sch['control_setpoint']}
completion_parameter = {"tag": "sch_RunSchedule[{}].completionParameter".format(id), "val": reverse_map(new_sch['completion_parameter'], maps['completion_parameter'])}
completion_comparison = {"tag": "sch_RunSchedule[{}].completionComparison".format(id), "val": reverse_map(new_sch['completion_comparison'], maps['completion_comparison'])}
completion_value_target = {"tag": "sch_RunSchedule[{}].completionValueTarget".format(id), "val": new_sch['completion_value_target']}
ch_to_write = [id, control_mode, control_setpoint, completion_parameter, completion_comparison, completion_value_target]
for ch in ch_to_write:
w = write_tag(plc_ip_address, ch['tag'], ch['val'])
print(w)
return True
except KeyError:
print("part of the schedule entry is missing")
return False