Updated totalizers

This commit is contained in:
2020-09-11 14:08:38 -05:00
parent f4fd410c7e
commit 1bddf77591
21 changed files with 2270 additions and 179 deletions

View File

@@ -10,40 +10,15 @@ tags = [
PLCChannel(PLC_IP_ADDRESS, "fm6_flowrate", "Val_FM6_FR", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "total_out_flowrate", "Val_FRTotalOut", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "total_in_flowrate", "Val_FRTotalIn", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm1_todays", "Flowmeter_Totals.Todays_Totalflow", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm2_todays", "Val_FM2_Todays", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm3_todays", "Val_FM3_Todays", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm4_todays", "Val_FM4_Todays", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm5_todays", "Val_FM5_Todays", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm6_todays", "Val_FM6_Todays", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "total_out_todays", "Val_TodaysTotalOut", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "total_in_todays", "Val_TodaysTotalIn", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm1_yesterdays", "Flowmeter_Totals.Yesterdays_Totalflow", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm2_yesterdays", "Val_FM2_Yesterdays", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm3_yesterdays", "Val_FM3_Yesterdays", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm4_yesterdays", "Val_FM4_Yesterdays", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm5_yesterdays", "Val_FM5_Yesterdays", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm6_yesterdays", "Val_FM6_Yesterdays", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "total_out_yesterdays", "Val_YesterdaysTotalOut", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "total_in_yesterdays", "Val_YesterdaysTotalIn", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm1_month", "Flowmeter_Totals.CurrentMonth_Totalflow", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm2_month", "Val_FM2_Months", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm3_month", "Val_FM3_Months", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm4_month", "Val_FM4_Months", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm5_month", "Val_FM5_Months", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm6_month", "Val_FM6_Months", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "total_out_months", "Val_MonthsTotalOut", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "total_in_months", "Val_MonthsTotalIn", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm1_lastmonths", "Flowmeter_Totals.LastMonth_Totalflow", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm2_lastmonths", "Val_FM2_LastMonths", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm3_lastmonths", "Val_FM3_LastMonths", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm4_lastmonths", "Val_FM4_LastMonths", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm5_lastmonths", "Val_FM5_LastMonths", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm6_lastmonths", "Val_FM6_LastMonths", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "total_out_lastmonths", "Val_LastMonthsTotalOut", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "total_in_lastmonths", "Val_LastMonthsTotalIn", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "pond_level","val_FluidLevel","REAL", 200, 3600, plc_type="CLX"),
PLCChannel(PLC_IP_ADDRESS, "pond_volume","val_PondVolume","REAL", 1000000, 3600, plc_type="CLX"),
PLCChannel(PLC_IP_ADDRESS, "fm1_lifetime", "Flowmeter_Totals.Flow_Totalizer", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm2_lifetime", "Val_FM2_T1", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm3_lifetime", "Val_FM3_T1", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm4_lifetime", "Val_FM4_T1", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm5_lifetime", "Val_FM5_T1", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm6_lifetime", "Val_FM6_T1", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "total_in_lifetime", "Total_In.Flow_Totalizer", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "pond_level","val_FluidLevel","REAL", 200, 3600, plc_type="CLX"),
#PLCChannel(PLC_IP_ADDRESS, "pond_volume","val_PondVolume","REAL", 1000000, 3600, plc_type="CLX"),
PLCChannel(PLC_IP_ADDRESS, "intake_pressure","val_IntakePressure","REAL", 100000, 3600, plc_type="CLX"),
PLCChannel(PLC_IP_ADDRESS, "intake_temperature","val_IntakeTemperature","REAL", 10000, 3600, plc_type="CLX"),
PLCChannel(PLC_IP_ADDRESS, "discharge_pressure","val_TubingPressure","REAL", 10000, 3600, plc_type="CLX"),
@@ -86,4 +61,38 @@ tags = [
PLCChannel(PLC_IP_ADDRESS, "total_out_net","in_HART_Flowmeter_Net","REAL", 1000000, 3600, plc_type="CLX"),
PLCChannel(PLC_IP_ADDRESS, "total_out_forward","in_HART_Flowmeter_Fwd","REAL", 1000000, 3600, plc_type="CLX"),
PLCChannel(PLC_IP_ADDRESS, "total_out_reverse","in_HART_Flowmeter_Rev","REAL", 1000000, 3600, plc_type="CLX")
]
]
""" PLCChannel(PLC_IP_ADDRESS, "fm1_todays", "Flowmeter_Totals.Today_Totalflow", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm2_todays", "Val_FM2_Todays", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm3_todays", "Val_FM3_Todays", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm4_todays", "Val_FM4_Todays", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm5_todays", "Val_FM5_Todays", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm6_todays", "Val_FM6_Todays", "REAL", 1000000, 3600, plc_type='CLX'),
#PLCChannel(PLC_IP_ADDRESS, "total_out_todays", "Val_TodaysTotalOut", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "total_in_todays", "Val_TodaysTotalIn", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm1_yesterdays", "Flowmeter_Totals.Yesterdays_Totalflow", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm2_yesterdays", "Val_FM2_Yesterdays", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm3_yesterdays", "Val_FM3_Yesterdays", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm4_yesterdays", "Val_FM4_Yesterdays", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm5_yesterdays", "Val_FM5_Yesterdays", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm6_yesterdays", "Val_FM6_Yesterdays", "REAL", 1000000, 3600, plc_type='CLX'),
#PLCChannel(PLC_IP_ADDRESS, "total_out_yesterdays", "Val_YesterdaysTotalOut", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "total_in_yesterdays", "Val_YesterdaysTotalIn", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm1_month", "Flowmeter_Totals.Monthlys_Totalflow", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm2_month", "Val_FM2_Months", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm3_month", "Val_FM3_Months", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm4_month", "Val_FM4_Months", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm5_month", "Val_FM5_Months", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm6_month", "Val_FM6_Months", "REAL", 1000000, 3600, plc_type='CLX'),
#PLCChannel(PLC_IP_ADDRESS, "total_out_months", "Val_MonthsTotalOut", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "total_in_months", "Val_MonthsTotalIn", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm1_lastmonths", "Flowmeter_Totals.PrevMonthlys_Totalflow", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm2_lastmonths", "Val_FM2_LastMonths", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm3_lastmonths", "Val_FM3_LastMonths", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm4_lastmonths", "Val_FM4_LastMonths", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm5_lastmonths", "Val_FM5_LastMonths", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "fm6_lastmonths", "Val_FM6_LastMonths", "REAL", 1000000, 3600, plc_type='CLX'),
#PLCChannel(PLC_IP_ADDRESS, "total_out_lastmonths", "Val_LastMonthsTotalOut", "REAL", 1000000, 3600, plc_type='CLX'),
PLCChannel(PLC_IP_ADDRESS, "total_in_lastmonths", "Val_LastMonthsTotalIn", "REAL", 1000000, 3600, plc_type='CLX'), """

View File

@@ -28,6 +28,7 @@ from Channel import PLCChannel, ModbusChannel,read_tag, write_tag, TAG_DATAERROR
from utilities import get_public_ip_address, get_private_ip_address, get_additional_tags, convert_int
from file_logger import filelogger as log
from Tags import tags
from datetime import datetime as dt
path = "/root/python_firmware/drivers/additional_tags.py"
@@ -53,6 +54,23 @@ IP_CHECK_PERIOD = 60
CHANNELS = tags + additional_tags
TOTALIZERS = persistence.load("totalizers.json")
if not TOTALIZERS:
TOTALIZERS = {}
for x in ['total_in','fm1', 'fm2', 'fm3', 'fm4', 'fm5', 'fm6']:
TOTALIZERS[x] = {
'Todays': 0,
'Yesterdays': 0,
'Current Months': 0,
'Previous Months': 0,
'Monthly Holding': 0,
'Daily Holding': 0,
'Lifetime': 0,
'Day': 0,
'Month': 0,
'Last Report': 0
}
persistence.store(TOTALIZERS, "totalizers.json")
class start(threading.Thread, deviceBase):
"""Start class required by Meshify."""
@@ -66,7 +84,7 @@ class start(threading.Thread, deviceBase):
mqtt=mqtt, Nodes=Nodes)
self.daemon = True
self.version = "1"
self.version = "2"
self.finished = threading.Event()
self.force_send = False
self.public_ip_address = ""
@@ -123,6 +141,8 @@ class start(threading.Thread, deviceBase):
if chan.plc_tag in convert_list:
converted_value = convert_int(chan.plc_tag, val)
self.sendtodbDev(1, chan.mesh_name, converted_value, 0, 'advvfdipppond')
elif "lifetime" in chan.mesh_name:
self.totalize(val,chan.mesh_name[:-9])
else:
self.sendtodbDev(1, chan.mesh_name, chan.value, 0, 'advvfdipppond')
#time.sleep(TAG_DATAERROR_SLEEPTIME) # sleep to allow Micro800 to handle ENET requests
@@ -211,4 +231,87 @@ class start(threading.Thread, deviceBase):
new_val = json.loads(str(value).replace("'", '"'))
PERSIST['flowmeter_units'] = new_val
persistence.store(PERSIST, "extra_data.json")
self.sendtodbDev(1, 'flowunits', PERSIST['flowmeter_units'], 0, 'advvfdipppond')
self.sendtodbDev(1, 'flowunits', PERSIST['flowmeter_units'], 0, 'advvfdipppond')
def totalize(self, val, totalizer):
right_now = dt.today()
month = right_now.month
day = right_now.day
#Totalize Today, Yesterday, Month, Last Month
#if the stored day is 0 then it's a fresh run of this should initalize values now
if TOTALIZERS[totalizer]['Day'] == 0:
TOTALIZERS[totalizer]['Day'] = day
TOTALIZERS[totalizer]['Month'] = month
TOTALIZERS[totalizer]['Daily Holding'] = val
TOTALIZERS[totalizer]['Monthly Holding'] = val
persistence.store(TOTALIZERS, 'totalizers.json')
#Communication error during initialization check if lifetime has reported properly and update holdings
if TOTALIZERS[totalizer]['Daily Holding'] == None and not(val == None):
TOTALIZERS[totalizer]['Daily Holding'] = val
TOTALIZERS[totalizer]['Monthly Holding'] = val
try:
if val - TOTALIZERS[totalizer]['Daily Holding'] - TOTALIZERS[totalizer]['Todays'] > 500 or time.time() - TOTALIZERS[totalizer]['Last Report'] > 3600 or self.force_send:
TOTALIZERS[totalizer]['Todays'] = val - TOTALIZERS[totalizer]['Daily Holding']
TOTALIZERS[totalizer]['Current Months'] = val - TOTALIZERS[totalizer]['Monthly Holding']
TOTALIZERS[totalizer]['Lifetime'] = val
self.sendtodbDev(1, '{}_todays'.format(totalizer), TOTALIZERS[totalizer]['Todays'], 0, 'advvfdipppond')
if totalizer == "total_in":
self.sendtodbDev(1, '{}_months'.format(totalizer), TOTALIZERS[totalizer]['Current Months'], 0, 'advvfdipppond')
else:
self.sendtodbDev(1, '{}_month'.format(totalizer), TOTALIZERS[totalizer]['Current Months'], 0, 'advvfdipppond')
self.sendtodbDev(1, '{}_yesterdays'.format(totalizer), TOTALIZERS[totalizer]['Yesterdays'], 0, 'advvfdipppond')
self.sendtodbDev(1, '{}_lifetime'.format(totalizer), TOTALIZERS[totalizer]['Lifetime'], 0, 'advvfdipppond')
if self.force_send:
self.sendtodbDev(1, '{}_lastmonths'.format(totalizer), TOTALIZERS[totalizer]['Previous Months'], 0, 'advvfdipppond')
TOTALIZERS[totalizer]['Last Report'] = time.time()
except:
if time.time() - TOTALIZERS[totalizer]['Last Report'] > 3600 or self.force_send:
self.sendtodbDev(1, '{}_todays'.format(totalizer), TOTALIZERS[totalizer]['Todays'], 0, 'advvfdipppond')
if totalizer == "total_in":
self.sendtodbDev(1, '{}_months'.format(totalizer), TOTALIZERS[totalizer]['Current Months'], 0, 'advvfdipppond')
else:
self.sendtodbDev(1, '{}_month'.format(totalizer), TOTALIZERS[totalizer]['Current Months'], 0, 'advvfdipppond')
self.sendtodbDev(1, '{}_yesterdays'.format(totalizer), TOTALIZERS[totalizer]['Yesterdays'], 0, 'advvfdipppond')
self.sendtodbDev(1, '{}_lifetime'.format(totalizer), TOTALIZERS[totalizer]['Lifetime'], 0, 'advvfdipppond')
if self.force_send:
self.sendtodbDev(1, '{}_lastmonths'.format(totalizer), TOTALIZERS[totalizer]['Previous Months'], 0, 'advvfdipppond')
TOTALIZERS[totalizer]['Last Report'] = time.time()
#If the current day doesn't equal the stored day roll the dailies over
if not(day == TOTALIZERS[totalizer]['Day']):
#if a comms error use the stored values else use the latested values
if val == None:
TOTALIZERS[totalizer]['Yesterdays'] = TOTALIZERS[totalizer]['Todays']
TOTALIZERS[totalizer]['Todays'] = 0
TOTALIZERS[totalizer]['Daily Holding'] = TOTALIZERS[totalizer]['Lifetime']
else:
TOTALIZERS[totalizer]['Yesterdays'] = val - TOTALIZERS[totalizer]['Daily Holding']
TOTALIZERS[totalizer]['Todays'] = 0
TOTALIZERS[totalizer]['Daily Holding'] = val
TOTALIZERS[totalizer]['Lifetime'] = val
TOTALIZERS[totalizer]['Day'] = day
self.sendtodbDev(1, '{}_todays'.format(totalizer), TOTALIZERS[totalizer]['Todays'], 0, 'advvfdipppond')
self.sendtodbDev(1, '{}_yesterdays'.format(totalizer), TOTALIZERS[totalizer]['Yesterdays'], 0, 'advvfdipppond')
self.sendtodbDev(1, '{}_lifetime'.format(totalizer), TOTALIZERS[totalizer]['Lifetime'], 0, 'advvfdipppond')
TOTALIZERS[totalizer]['Last Report'] = time.time()
#the day has rolled over if the month also rolls over
if not(month == TOTALIZERS[totalizer]['Month']):
#if a comms error use the stored values else use the latested values
if val == None:
TOTALIZERS[totalizer]['Previous Months'] = TOTALIZERS[totalizer]['Current Months']
TOTALIZERS[totalizer]['Current Months'] = 0
TOTALIZERS[totalizer]['Monthly Holding'] = TOTALIZERS[totalizer]['Lifetime']
else:
TOTALIZERS[totalizer]['Previous Months'] = val - TOTALIZERS[totalizer]['Monthly Holding']
TOTALIZERS[totalizer]['Current Months'] = 0
TOTALIZERS[totalizer]['Monthly Holding'] = val
TOTALIZERS[totalizer]['Month'] = month
if totalizer == "total_in":
self.sendtodbDev(1, '{}_months'.format(totalizer), TOTALIZERS[totalizer]['Current Months'], 0, 'advvfdipppond')
else:
self.sendtodbDev(1, '{}_month'.format(totalizer), TOTALIZERS[totalizer]['Current Months'], 0, 'advvfdipppond')
self.sendtodbDev(1, '{}_lastmonths'.format(totalizer), TOTALIZERS[totalizer]['Previous Months'], 0, 'advvfdipppond')
self.sendtodbDev(1, '{}_lifetime'.format(totalizer), TOTALIZERS[totalizer]['Lifetime'], 0, 'advvfdipppond')
TOTALIZERS[totalizer]['Last Report'] = time.time()
persistence.store(TOTALIZERS, 'totalizers.json')

View File

@@ -8,7 +8,7 @@
"file4": "Tags.py"
},
"deviceName": "advvfdipppond",
"releaseVersion": "1",
"releaseVersion": "2",
"driverFileName": "advvfdipppond.py",
"driverId": "0100"
}