Fixed live charts updarte in radar mode
This commit is contained in:
parent
5649360929
commit
7317e5e67e
87
well-api.py
87
well-api.py
@ -758,6 +758,30 @@ def GetDeviceDetailsSingle(device_id):
|
||||
|
||||
return device_record
|
||||
|
||||
def GetDeviceDetailsSingleFromMac(device_mac):
|
||||
|
||||
conn = get_db_connection()
|
||||
|
||||
sql = "SELECT column_name FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'devices';"
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(sql)
|
||||
columns_names = cur.fetchall()
|
||||
|
||||
sql = "SELECT * FROM public.devices WHERE device_mac = '" + device_mac + "'"
|
||||
|
||||
device_record = {}
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(sql)
|
||||
result = cur.fetchone() #cur.fetchall()
|
||||
if result != None:
|
||||
cnt = 0
|
||||
for field in columns_names:
|
||||
device_record[field[0]] = result[cnt]
|
||||
cnt += 1
|
||||
else:
|
||||
#device is not in DB so first lets find it in
|
||||
pass
|
||||
return device_record
|
||||
|
||||
def DeploymentDetails(deployment_id):
|
||||
|
||||
@ -1546,20 +1570,20 @@ def StoreDevice2DB(parameters, editing_device_id):
|
||||
description = '{CleanObject(parameters.get('description'))}',
|
||||
location = '{CleanObject(parameters.get('location'))}',
|
||||
close_to = '{CleanObject(parameters.get('close_to'))}',
|
||||
group_id = {CleanObject(parameters.get('group_id'))},
|
||||
radar_threshold = '{CleanObject(parameters.get('radar_threshold'))}',
|
||||
temperature_calib = '{CleanObject(parameters.get('temperature_calib'))}',
|
||||
humidity_calib = '{CleanObject(parameters.get('humidity_calib'))}'
|
||||
WHERE device_id = {editing_device_id};
|
||||
"""
|
||||
|
||||
else:
|
||||
sql = f"""
|
||||
INSERT INTO public.devices
|
||||
(device_mac, well_id, description, location, close_to, radar_threshold, temperature_calib, humidity_calib)
|
||||
(device_mac, well_id, description, location, close_to, radar_threshold, temperature_calib, humidity_calib, group_id)
|
||||
VALUES
|
||||
('{CleanObject(parameters.get('device_mac'))}', '{CleanObject(parameters.get('well_id'))}', '{CleanObject(parameters.get('description'))}',
|
||||
'{CleanObject(parameters.get('location'))}', '{CleanObject(parameters.get('close_to'))}', '{CleanObject(parameters.get('radar_threshold'))}',
|
||||
'{CleanObject(parameters.get('temperature_calib'))}', '{CleanObject(parameters.get('humidity_calib'))}');
|
||||
'{CleanObject(parameters.get('temperature_calib'))}', '{CleanObject(parameters.get('humidity_calib'))}', {CleanObject(parameters.get('group_id'))});
|
||||
"""
|
||||
logger.debug(f"sql= {sql}")
|
||||
# Execute update query
|
||||
@ -7718,7 +7742,7 @@ def CreateMapFast(map_file, devices_list, selected_date, bw, time_zone_s, radar_
|
||||
stripes = devices_c * sensors_c #2 for upper maxes, lower mins
|
||||
arr_source_template = np.full((stripes, minutes+4), -0.001, dtype=float)
|
||||
arr_stretched_template = np.zeros((int(stripes*stretch_by), minutes, 3), dtype=np.uint8) # 3 for RGB channels
|
||||
arr_source = fast_fill_array_from_timescale_single(day_data, time_from_str, devices_list[1], arr_source_template, s_table_temp[0], time_zone_s)
|
||||
arr_source = fast_fill_array_from_timescale(day_data, time_from_str, devices_list[1], arr_source_template, time_zone_s)
|
||||
arr_source = AddLimits_optimized(arr_source, devices_c, sensors_c, percentile=100)
|
||||
scaled_day = CalcExtremes(arr_source, minutes, stripes)
|
||||
arr_stretched, vocs_scaled = FillImage_optimized(scaled_day, devices_c, sensors_c, arr_stretched_template, group_by, bw)
|
||||
@ -13575,6 +13599,17 @@ def decode_state(b64_state):
|
||||
logger.error(f"Failed to decode client_state '{b64_state}': {e}")
|
||||
return []
|
||||
|
||||
def create_client_state(base_event, call_control_id, prefix):
|
||||
"""Create a base64 encoded client state string as required by Telnyx API"""
|
||||
# Create the plain text client state string
|
||||
plain_state = f"{prefix}_{base_event}_{call_control_id[:8]}" if call_control_id else f"{prefix}_{base_event}_unknownccid"
|
||||
|
||||
# Encode to base64 as required by Telnyx API
|
||||
base64_state = base64.b64encode(plain_state.encode('utf-8')).decode('ascii')
|
||||
|
||||
logger.debug(f"Client state created: '{plain_state}' -> base64: '{base64_state}'")
|
||||
return base64_state
|
||||
|
||||
def send_telnyx_command(action_path, params, api_key):
|
||||
"""
|
||||
Sends a command to the Telnyx Call Control API actions endpoint.
|
||||
@ -14614,6 +14649,35 @@ def AddLimits_optimized_filtered(arr_source, devices_c, sensors_c, filtered_s_ta
|
||||
arr_source[:, 1441] = max_vals
|
||||
|
||||
return arr_source
|
||||
|
||||
def GetNextWellId(min_well_id):
|
||||
|
||||
conn = get_db_connection()
|
||||
|
||||
sql = """
|
||||
SELECT COALESCE(MAX(well_id), 0) AS max_well_id
|
||||
FROM public.devices
|
||||
"""
|
||||
|
||||
try:
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(sql)
|
||||
result = cur.fetchone()
|
||||
if result == None:
|
||||
return min_well_id
|
||||
else:
|
||||
max_wel_id = result[0]
|
||||
if max_wel_id != None and min_well_id != None:
|
||||
if max_wel_id + 1 > min_well_id:
|
||||
return max_wel_id + 1
|
||||
else:
|
||||
return min_well_id
|
||||
else:
|
||||
if max_wel_id != None:
|
||||
return max_wel_id + 1
|
||||
|
||||
except Exception as e:
|
||||
return min_well_id
|
||||
#==================================== ADD FUNCTIONS BEFORE ============================================
|
||||
|
||||
# Main API class
|
||||
@ -15928,7 +15992,6 @@ class WellApi:
|
||||
if date_to == None:
|
||||
date_to = selected_date
|
||||
|
||||
|
||||
start_date = datetime.datetime.strptime(selected_date, '%Y-%m-%d')
|
||||
end_date = datetime.datetime.strptime(date_to, '%Y-%m-%d')
|
||||
|
||||
@ -16595,10 +16658,22 @@ class WellApi:
|
||||
|
||||
elif function == "get_device":
|
||||
device_id = form_data.get('device_id')
|
||||
device_mac = form_data.get('mac')
|
||||
min_well_id = form_data.get('min_well_id')
|
||||
|
||||
if device_mac != None:
|
||||
device_det = GetDeviceDetailsSingleFromMac(device_mac)
|
||||
print(device_det)
|
||||
dataa = {}
|
||||
dataa['Function'] = "device_details"
|
||||
dataa['device_details'] = device_det
|
||||
if device_det == {}:
|
||||
dataa['next_well_id'] = GetNextWellId(min_well_id)
|
||||
else:
|
||||
devices = GetVisibleDevices(privileges)
|
||||
dataa = {}
|
||||
dataa['Function'] = "device_details"
|
||||
dataa['device_details'] = []
|
||||
dataa['device_details'] = {}
|
||||
if privileges == "-1":
|
||||
#device_det = GetDeviceDetails(device_id)
|
||||
device_det = GetDeviceDetailsSingle(device_id)
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
<!--
|
||||
Written By: Robert Zmrzli robert@zmrinc.com
|
||||
deployment.html
|
||||
V3.0
|
||||
V3.01
|
||||
-->
|
||||
|
||||
|
||||
@ -1619,10 +1619,11 @@ function ProcessQueue() {
|
||||
vall = -1000000;
|
||||
switch(message["payload"]["mtype"]) {
|
||||
case "radar":
|
||||
case 16:
|
||||
|
||||
//lets charts dictate which sensors are to be displayed
|
||||
MAC = message["topic"].substring(1);
|
||||
|
||||
if(document.getElementById("map_type").value == 1){
|
||||
i = 4; //4=radar
|
||||
if (MAC+sensor_tablesn[i] in series_indexes){
|
||||
|
||||
@ -1714,8 +1715,104 @@ function ProcessQueue() {
|
||||
UniversalChart.draw();
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
for(i = 0; i<=18; i++){
|
||||
if (MAC+radar_tablesn[i] in series_indexes){
|
||||
|
||||
series_index = series_indexes[MAC+radar_tablesn[i]];
|
||||
series = UniversalChart.series.items[series_index];
|
||||
if (series.visible == true) {
|
||||
radar_part = document.getElementById("RadarPart").value;
|
||||
timee = message["payload"]["time"];
|
||||
switch(radar_part) {
|
||||
case "absent":
|
||||
vall = message["payload"]["radar"][0][1]/message["payload"]["radar"][0][0];
|
||||
break;
|
||||
case "moving":
|
||||
vall = message["payload"]["radar"][0][2]/message["payload"]["radar"][0][0];
|
||||
break;
|
||||
case "stationary":
|
||||
vall = message["payload"]["radar"][0][3]/message["payload"]["radar"][0][0];
|
||||
break;
|
||||
case "both":
|
||||
vall = message["payload"]["radar"][0][4]/message["payload"]["radar"][0][0];
|
||||
break;
|
||||
case "m0":
|
||||
vall = message["payload"]["radar"][0][5]/message["payload"]["radar"][0][0];
|
||||
break;
|
||||
case "m1":
|
||||
vall = message["payload"]["radar"][0][6]/message["payload"]["radar"][0][0];
|
||||
break;
|
||||
case "m2":
|
||||
vall = message["payload"]["radar"][0][7]/message["payload"]["radar"][0][0];
|
||||
break;
|
||||
case "m3":
|
||||
vall = message["payload"]["radar"][0][8]/message["payload"]["radar"][0][0];
|
||||
break;
|
||||
case "m4":
|
||||
vall = message["payload"]["radar"][0][9]/message["payload"]["radar"][0][0];
|
||||
break;
|
||||
case "m5":
|
||||
vall = message["payload"]["radar"][0][10]/message["payload"]["radar"][0][0];
|
||||
break;
|
||||
case "m6":
|
||||
vall = message["payload"]["radar"][0][11]/message["payload"]["radar"][0][0];
|
||||
break;
|
||||
case "m7":
|
||||
vall = message["payload"]["radar"][0][12]/message["payload"]["radar"][0][0];
|
||||
break;
|
||||
case "m8":
|
||||
vall = message["payload"]["radar"][0][13]/message["payload"]["radar"][0][0];
|
||||
break;
|
||||
case "s2":
|
||||
vall = message["payload"]["radar"][1][3]/message["payload"]["radar"][1][0];
|
||||
break;
|
||||
case "s3":
|
||||
vall = message["payload"]["radar"][1][4]/message["payload"]["radar"][1][0];
|
||||
break;
|
||||
case "s4":
|
||||
vall = message["payload"]["radar"][1][5]/message["payload"]["radar"][1][0];
|
||||
break;
|
||||
case "s5":
|
||||
vall = message["payload"]["radar"][1][6]/message["payload"]["radar"][1][0];
|
||||
break;
|
||||
case "s6":
|
||||
vall = message["payload"]["radar"][1][7]/message["payload"]["radar"][1][0];
|
||||
break;
|
||||
case "s7":
|
||||
vall = message["payload"]["radar"][1][8]/message["payload"]["radar"][1][0];
|
||||
break;
|
||||
case "s8":
|
||||
vall = message["payload"]["radar"][1][9]/message["payload"]["radar"][1][0];
|
||||
break;
|
||||
case "s28":
|
||||
vall = 0;
|
||||
for (i_=3; i_<=9; i_++){
|
||||
vall += message["payload"]["radar"][1][i_]
|
||||
}
|
||||
vall = vall/(7.0*message["payload"]["radar"][1][0]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (vall != -1000000) {
|
||||
epoch_ms = (timee+hours_delta * 3600) * 1000;
|
||||
series.data.x.push(new Date(epoch_ms));
|
||||
series.data.values.push(vall);
|
||||
//series.data.values.push(vall);
|
||||
//time_obj = new Date(epoch_ms);
|
||||
//series.data.x.push(time_obj);
|
||||
|
||||
UniversalChart.axes.bottom.labels.roundFirst = true;
|
||||
UniversalChart.axes.bottom.labels.dateFormat = "shortDateTime";
|
||||
UniversalChart.draw();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "sensors":
|
||||
case 17:
|
||||
//case "light":
|
||||
//message["payload"]["topic"]
|
||||
map_type = document.getElementById("map_type").value;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user