Completes MAXH2O-73 and MAXH2O-78
Adds scaling and GPM ignore limit. Increments version in S3 to 9
This commit is contained in:
@@ -1,3 +1,33 @@
|
|||||||
|
<div class="row row-flex box-me">
|
||||||
|
<div class="col-md-6 text-center">
|
||||||
|
<a href="#"
|
||||||
|
data-confirm-message="Are you sure you want to do this?"
|
||||||
|
data-refreshpause="1"
|
||||||
|
data-command=""
|
||||||
|
data-staticsend=1
|
||||||
|
data-channelId="<%= channels["flowmonitor.startcmd"].channelId %>"
|
||||||
|
data-techname="<%=channels["flowmonitor.startcmd"].techName %>"
|
||||||
|
data-name="<%= channels["flowmonitor.startcmd"].name%>"
|
||||||
|
data-nodechannelcurrentId="<%= channels["flowmonitor.startcmd"].nodechannelcurrentId %>"
|
||||||
|
id="<%= channels["flowmonitor.startcmd"].channelId %>"
|
||||||
|
class="btn btn-large btn-theme animated setstatic">Start</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6 text-center">
|
||||||
|
<a href="#"
|
||||||
|
data-confirm-message="Are you sure you want to do this?"
|
||||||
|
data-refreshpause="1"
|
||||||
|
data-command=""
|
||||||
|
data-staticsend=1
|
||||||
|
data-channelId="<%= channels["flowmonitor.stopcmd"].channelId %>"
|
||||||
|
data-techname="<%=channels["flowmonitor.stopcmd"].techName %>"
|
||||||
|
data-name="<%= channels["flowmonitor.stopcmd"].name%>"
|
||||||
|
data-nodechannelcurrentId="<%= channels["flowmonitor.stopcmd"].nodechannelcurrentId %>"
|
||||||
|
id="<%= channels["flowmonitor.stopcmd"].channelId %>"
|
||||||
|
class="btn btn-large btn-theme animated setstatic">Stop</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row row-flex box-me">
|
<div class="row row-flex box-me">
|
||||||
<div class='col-xs-6 text-center box-me'>
|
<div class='col-xs-6 text-center box-me'>
|
||||||
<h2>GPM Flow</h2>
|
<h2>GPM Flow</h2>
|
||||||
@@ -109,3 +139,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
|
||||||
|
.text-center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -134,7 +134,41 @@
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6 box-me entry-top-level" id="setgpmignorelimit">
|
||||||
|
<div style="margin-left:15px;">
|
||||||
|
<h2>GPM Ignore Limit</h2>
|
||||||
|
<form class="form-inline">
|
||||||
|
<div class="form-group" style="margin-bottom:15px;">
|
||||||
|
<label
|
||||||
|
class="sr-only"
|
||||||
|
for="<%= channels["flowmonitor.setgpmignorelimit"].channelId %>">GPM Max Value</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input
|
||||||
|
class="form-control channel_value"
|
||||||
|
type="number"
|
||||||
|
step="any"
|
||||||
|
value="<%=channels['flowmonitor.setgpmignorelimit'].value %>">
|
||||||
|
<div class="input-group-addon">GPM</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<hr />
|
||||||
|
<a
|
||||||
|
href="#"
|
||||||
|
data-confirm-message="Are you sure you want to do this?"
|
||||||
|
data-refreshpause="1"
|
||||||
|
data-command=""
|
||||||
|
data-staticsend=1.0
|
||||||
|
data-channelId="<%= channels["flowmonitor.setgpmignorelimit"].channelId %>"
|
||||||
|
data-techname="<%=channels["flowmonitor.setgpmignorelimit"].techName %>"
|
||||||
|
data-name="<%= channels["flowmonitor.setgpmignorelimit"].name%>"
|
||||||
|
data-nodechannelcurrentId="<%= channels["flowmonitor.setgpmignorelimit"].nodechannelcurrentId %>"
|
||||||
|
id="<%= channels["flowmonitor.setgpmignorelimit"].channelId %>"
|
||||||
|
class="btn btn-large btn-theme animated setstatic material-icons">send</a>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
@@ -149,4 +183,4 @@ $('.channel_value').each(function(topLevel){
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
19
config.txt
19
config.txt
@@ -1,10 +1,11 @@
|
|||||||
{
|
{
|
||||||
|
"files": {
|
||||||
"driverFileName":"flow-monitor.py",
|
"file3": "persistence.py",
|
||||||
"deviceName":"flowmonitor",
|
"file2": "utilities.py",
|
||||||
"driverId":"0140",
|
"file1": "flow-monitor.py"
|
||||||
"releaseVersion":"8",
|
},
|
||||||
"files": {
|
"deviceName": "flowmonitor",
|
||||||
"file1":"flow-monitor.py",
|
"driverId": "0180",
|
||||||
"file2":"utilities.py"}
|
"releaseVersion": "9",
|
||||||
}
|
"driverFileName": "flow-monitor.py"
|
||||||
|
}
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
{
|
{
|
||||||
"name": "flowmonitor",
|
"s3BucketName": "flow-monitor",
|
||||||
"driverFilename": "flow-monitor.py",
|
|
||||||
"additionalDriverFiles": [
|
"additionalDriverFiles": [
|
||||||
"utilities.py"
|
"utilities.py",
|
||||||
|
"persistence.py"
|
||||||
],
|
],
|
||||||
"version": 8,
|
"name": "flowmonitor",
|
||||||
"s3BucketName": "flow-monitor"
|
"version": 9,
|
||||||
|
"driverFilename": "flow-monitor.py"
|
||||||
}
|
}
|
||||||
@@ -4,6 +4,7 @@ import time
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
import sqlite3
|
import sqlite3
|
||||||
from device_base import deviceBase
|
from device_base import deviceBase
|
||||||
|
import persistence
|
||||||
from utilities import get_public_ip_address
|
from utilities import get_public_ip_address
|
||||||
|
|
||||||
CREATE_FLOWDATA_TABLE = """CREATE TABLE flow_data (
|
CREATE_FLOWDATA_TABLE = """CREATE TABLE flow_data (
|
||||||
@@ -16,26 +17,26 @@ CREATE_FLOWDATA_TABLE = """CREATE TABLE flow_data (
|
|||||||
);"""
|
);"""
|
||||||
|
|
||||||
INSERT_BLANK_FLOWDATA = """INSERT INTO flow_data (
|
INSERT_BLANK_FLOWDATA = """INSERT INTO flow_data (
|
||||||
id,
|
id,
|
||||||
gal_totalizer_value,
|
gal_totalizer_value,
|
||||||
bbl_totalizer_value,
|
bbl_totalizer_value,
|
||||||
gal_monthly_totalizer,
|
gal_monthly_totalizer,
|
||||||
bbl_monthly_totalizer,
|
bbl_monthly_totalizer,
|
||||||
last_measured_timestamp)
|
last_measured_timestamp)
|
||||||
VALUES (1, 0.0, 0.0, 0.0, 0.0, 0);"""
|
VALUES (1, 0.0, 0.0, 0.0, 0.0, 0);"""
|
||||||
|
|
||||||
CLEAR_FLOWDATA = """UPDATE flow_data SET
|
CLEAR_FLOWDATA = """UPDATE flow_data SET
|
||||||
gal_totalizer_value=0.0,
|
gal_totalizer_value=0.0,
|
||||||
bbl_totalizer_value=0.0,
|
bbl_totalizer_value=0.0,
|
||||||
gal_monthly_totalizer=0.0,
|
gal_monthly_totalizer=0.0,
|
||||||
bbl_monthly_totalizer=0.0,
|
bbl_monthly_totalizer=0.0,
|
||||||
last_measured_timestamp=0 WHERE id=1;"""
|
last_measured_timestamp=0 WHERE id=1;"""
|
||||||
|
|
||||||
UPDATE_FLOWDATA = """UPDATE flow_data SET
|
UPDATE_FLOWDATA = """UPDATE flow_data SET
|
||||||
gal_totalizer_value=?,
|
gal_totalizer_value=?,
|
||||||
bbl_totalizer_value=?,
|
bbl_totalizer_value=?,
|
||||||
gal_monthly_totalizer=?,
|
gal_monthly_totalizer=?,
|
||||||
bbl_monthly_totalizer=?,
|
bbl_monthly_totalizer=?,
|
||||||
last_measured_timestamp=? WHERE id=1"""
|
last_measured_timestamp=? WHERE id=1"""
|
||||||
|
|
||||||
CREATE_SCALINGDATA_TABLE = """CREATE TABLE scaling_data (
|
CREATE_SCALINGDATA_TABLE = """CREATE TABLE scaling_data (
|
||||||
@@ -47,18 +48,19 @@ CREATE_SCALINGDATA_TABLE = """CREATE TABLE scaling_data (
|
|||||||
);"""
|
);"""
|
||||||
|
|
||||||
INSERT_SCALINGDATA = """INSERT INTO scaling_data (
|
INSERT_SCALINGDATA = """INSERT INTO scaling_data (
|
||||||
id,
|
id,
|
||||||
raw_min,
|
raw_min,
|
||||||
raw_max,
|
raw_max,
|
||||||
gpm_min,
|
gpm_min,
|
||||||
gpm_max) VALUES (1, ?, ?, ?, ?);"""
|
gpm_max) VALUES (1, ?, ?, ?, ?);"""
|
||||||
|
|
||||||
UPDATE_SCALINGDATA = """UPDATE scaling_data SET
|
UPDATE_SCALINGDATA = """UPDATE scaling_data SET
|
||||||
raw_min=?,
|
raw_min=?,
|
||||||
raw_max=?,
|
raw_max=?,
|
||||||
gpm_min=?,
|
gpm_min=?,
|
||||||
gpm_max=? WHERE id=1;"""
|
gpm_max=? WHERE id=1;"""
|
||||||
|
|
||||||
|
PERSIST = persistence.load()
|
||||||
|
|
||||||
|
|
||||||
class ChannelSimple(object):
|
class ChannelSimple(object):
|
||||||
@@ -128,6 +130,7 @@ class start(threading.Thread, deviceBase):
|
|||||||
self.RAW_MAX = 19.54
|
self.RAW_MAX = 19.54
|
||||||
self.GPM_MIN = 0.0
|
self.GPM_MIN = 0.0
|
||||||
self.GPM_MAX = 100.0
|
self.GPM_MAX = 100.0
|
||||||
|
self.GPM_IGNORE_LIMIT = 1.0
|
||||||
|
|
||||||
self.daemon = True
|
self.daemon = True
|
||||||
self.version = "8"
|
self.version = "8"
|
||||||
@@ -168,16 +171,16 @@ class start(threading.Thread, deviceBase):
|
|||||||
bpdflow_ch = ChannelSimple('bpd_flow', gpmflow_ch.senddelta_value * 34.2857, flow_time_store_delta)
|
bpdflow_ch = ChannelSimple('bpd_flow', gpmflow_ch.senddelta_value * 34.2857, flow_time_store_delta)
|
||||||
runstatus_ch = ChannelSimple('run_status', 0.5, 600)
|
runstatus_ch = ChannelSimple('run_status', 0.5, 600)
|
||||||
|
|
||||||
# Startup timer.
|
# Startup timer.
|
||||||
# Waits for connection to Meshify before attempting to send data
|
# Waits for connection to Meshify before attempting to send data
|
||||||
wait_loops = 0
|
wait_loops = 0
|
||||||
while wait_loops < startup_wait_seconds:
|
while wait_loops < startup_wait_seconds:
|
||||||
print("Waiting to start driver in {} seconds".format(startup_wait_seconds - wait_loops))
|
print("Waiting to start flowmonitor driver in {} seconds".format(startup_wait_seconds - wait_loops))
|
||||||
wait_loops += 1
|
wait_loops += 1
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
##############################################
|
##############################################
|
||||||
# THIS IS THE ACTUAL DRIVER CODE
|
# THIS IS THE ACTUAL DRIVER CODE
|
||||||
# (executes after waiting for startup timer to complete)
|
# (executes after waiting for startup timer to complete)
|
||||||
##############################################
|
##############################################
|
||||||
|
|
||||||
@@ -185,7 +188,7 @@ class start(threading.Thread, deviceBase):
|
|||||||
public_ip_address = get_public_ip_address()
|
public_ip_address = get_public_ip_address()
|
||||||
self.sendtodb('public_ip_address', public_ip_address, 0)
|
self.sendtodb('public_ip_address', public_ip_address, 0)
|
||||||
ip_checked_time = time.time()
|
ip_checked_time = time.time()
|
||||||
|
|
||||||
# Attempt to retrieve data stored in the database
|
# Attempt to retrieve data stored in the database
|
||||||
last_measured_timestamp = time.time()
|
last_measured_timestamp = time.time()
|
||||||
conn = sqlite3.connect('/root/python_firmware/drivers/flow-monitor.db')
|
conn = sqlite3.connect('/root/python_firmware/drivers/flow-monitor.db')
|
||||||
@@ -230,6 +233,11 @@ class start(threading.Thread, deviceBase):
|
|||||||
self.sendtodb("setgpmmax", self.GPM_MAX, 0)
|
self.sendtodb("setgpmmax", self.GPM_MAX, 0)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.GPM_IGNORE_LIMIT = PERSIST['gpm_ignore_limit']
|
||||||
|
except KeyError:
|
||||||
|
print("no persisted GPM Ignore Limit. Using default of {}".format(self.GPM_IGNORE_LIMIT))
|
||||||
|
|
||||||
# on bootup, if the day has changed, clear the totalizers.
|
# on bootup, if the day has changed, clear the totalizers.
|
||||||
# this would happen if the device is off when the time changes to Midnight.
|
# this would happen if the device is off when the time changes to Midnight.
|
||||||
if not is_today(last_measured_timestamp):
|
if not is_today(last_measured_timestamp):
|
||||||
@@ -237,7 +245,6 @@ class start(threading.Thread, deviceBase):
|
|||||||
bbl_totalizer_value = 0.0
|
bbl_totalizer_value = 0.0
|
||||||
last_measured_timestamp = time.time()
|
last_measured_timestamp = time.time()
|
||||||
|
|
||||||
|
|
||||||
# DRIVER LOOP
|
# DRIVER LOOP
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
@@ -245,13 +252,9 @@ class start(threading.Thread, deviceBase):
|
|||||||
cloop_val = float(mcu_status['cloop'])
|
cloop_val = float(mcu_status['cloop'])
|
||||||
|
|
||||||
din1_val = 1 if mcu_status['din1'] == 'On' else 0 # Check DIGITAL INPUT 1 for run status
|
din1_val = 1 if mcu_status['din1'] == 'On' else 0 # Check DIGITAL INPUT 1 for run status
|
||||||
if din1_val == 1:
|
gpm_val = scale(cloop_val, self.RAW_MIN, self.RAW_MAX, self.GPM_MIN, self.GPM_MAX)
|
||||||
gpm_val = scale(cloop_val, self.RAW_MIN, self.RAW_MAX, self.GPM_MIN, self.GPM_MAX)
|
if gpm_val < GPM_IGNORE_LIMIT:
|
||||||
if gpm_val < 0:
|
gpm_val = 0
|
||||||
gpm_val = 0
|
|
||||||
else:
|
|
||||||
# If the well is not running, drive the flow rate to 0.
|
|
||||||
gpm_val = 0.0
|
|
||||||
|
|
||||||
bpd_val = (gpm_val / gal_per_bbl) * 60.0 * 24.0 # Computes BPD from GPM
|
bpd_val = (gpm_val / gal_per_bbl) * 60.0 * 24.0 # Computes BPD from GPM
|
||||||
|
|
||||||
@@ -313,7 +316,7 @@ class start(threading.Thread, deviceBase):
|
|||||||
self.sendtodb('bbl_total_yesterday', bbl_totalizer_value, 0)
|
self.sendtodb('bbl_total_yesterday', bbl_totalizer_value, 0)
|
||||||
gal_totalizer_value = 0.0
|
gal_totalizer_value = 0.0
|
||||||
bbl_totalizer_value = 0.0
|
bbl_totalizer_value = 0.0
|
||||||
|
|
||||||
# Update the database with cleared values
|
# Update the database with cleared values
|
||||||
cursor.execute(UPDATE_FLOWDATA, (gal_totalizer_value, bbl_totalizer_value, gal_monthly_totalizer, bbl_monthly_totalizer, last_measured_timestamp))
|
cursor.execute(UPDATE_FLOWDATA, (gal_totalizer_value, bbl_totalizer_value, gal_monthly_totalizer, bbl_monthly_totalizer, last_measured_timestamp))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
@@ -347,9 +350,25 @@ class start(threading.Thread, deviceBase):
|
|||||||
public_ip_address = test_public_ip
|
public_ip_address = test_public_ip
|
||||||
ip_checked_time = now
|
ip_checked_time = now
|
||||||
|
|
||||||
|
if mcu_status['din2'] == 'On':
|
||||||
|
self.flowmonitor_startcmd(None, None)
|
||||||
|
|
||||||
|
if mcu_status['din1'] == 'Off' and mcu_status['relay1'] == "On":
|
||||||
|
self.flowmonitor_stopcmd(None, None)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("problem in the driver: {}".format(e))
|
print("problem in the driver: {}".format(e))
|
||||||
time.sleep(5)
|
time.sleep(2)
|
||||||
|
|
||||||
|
def flowmonitor_startcmd(self, name, value):
|
||||||
|
"""Start the well."""
|
||||||
|
self.mcu.relay1(str(1))
|
||||||
|
return True
|
||||||
|
|
||||||
|
def flowmonitor_stopcmd(self, name, value):
|
||||||
|
"""Stop the well."""
|
||||||
|
self.mcu.relay1(str(0))
|
||||||
|
return True
|
||||||
|
|
||||||
def flowmonitor_resetdatabase(self, name, value):
|
def flowmonitor_resetdatabase(self, name, value):
|
||||||
"""Reset the database back to blank."""
|
"""Reset the database back to blank."""
|
||||||
@@ -431,4 +450,14 @@ class start(threading.Thread, deviceBase):
|
|||||||
cursor.execute(CREATE_SCALINGDATA_TABLE)
|
cursor.execute(CREATE_SCALINGDATA_TABLE)
|
||||||
cursor.execute(INSERT_SCALINGDATA, (self.RAW_MIN, self.RAW_MAX, self.GPM_MIN, self.GPM_MAX))
|
cursor.execute(INSERT_SCALINGDATA, (self.RAW_MIN, self.RAW_MAX, self.GPM_MIN, self.GPM_MAX))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
return(True)
|
return(True)
|
||||||
|
|
||||||
|
def flowmonitor_setgpmignorelimit(self, name, value):
|
||||||
|
"""Set the GPM Ignore Limit."""
|
||||||
|
try:
|
||||||
|
self.GPM_IGNORE_LIMIT = float(value)
|
||||||
|
self.sendtodb("setgpmignorelimit", self.GPM_IGNORE_LIMIT, 0)
|
||||||
|
return True
|
||||||
|
except Exception as e:
|
||||||
|
print("Error during flowmonitor_setgpmignorelimit: {}".format(e))
|
||||||
|
return False
|
||||||
|
|||||||
21
persistence.py
Normal file
21
persistence.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
"""Data persistance functions."""
|
||||||
|
# if more advanced persistence is needed, use a sqlite database
|
||||||
|
import json
|
||||||
|
|
||||||
|
|
||||||
|
def load(filename="persist.json"):
|
||||||
|
"""Load persisted settings from the specified file."""
|
||||||
|
try:
|
||||||
|
with open(filename, 'r') as persist_file:
|
||||||
|
return json.load(persist_file)
|
||||||
|
except Exception:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def store(persist_obj, filename="persist.json"):
|
||||||
|
"""Store the persisting settings into the specified file."""
|
||||||
|
try:
|
||||||
|
with open(filename, 'w') as persist_file:
|
||||||
|
return json.dump(persist_obj, persist_file)
|
||||||
|
except Exception:
|
||||||
|
return False
|
||||||
Reference in New Issue
Block a user