From f439d171b5559b029a5dc5568677c0ba1a6f15a5 Mon Sep 17 00:00:00 2001 From: Michael Van Ryn Date: Thu, 15 Aug 2024 11:15:54 -0600 Subject: [PATCH] Updating with a few bug fixes and cleanup for AVEVA processing, updating Python deprecated functions. --- README.md | 7 +- input/tags-example.csv | 17 +++++ input/tags.csv | 141 ++++++++++++++++++++++++++++++++++++----- main.py | 34 ++++++---- setup.toml | 2 +- 5 files changed, 167 insertions(+), 34 deletions(-) create mode 100644 input/tags-example.csv diff --git a/README.md b/README.md index 06bec03..6091b1a 100644 --- a/README.md +++ b/README.md @@ -53,13 +53,14 @@ Each directory contains a Historic XXXXXX directory where XXXXX is the Unique ID These tools will conver the user start time and end time in a way that will only process the found and required HRD files at a time. This can *greatly* expand the amount of data in the system, it is strongly recommended to have a lot of free space left during queries. - ### Setup ClearSCADA Config Key Point: In the tags list file, the Source Name field is the unique identifier for the tag name to query. In VTScada this can be something like ```temp\old_value1```. In ClearSCADA, it will be the unique point ID, ex. ```005152```. The leading zeroes can be left out as the script will pad them in front of the integer to determine the correct path. ## AVEVA (Wonderware) Historian - InSQL -Prerequisite: Install the Microsoft ODBC Driver, and assign the correct name to the driver in the *setup.toml* file. +Prerequisite: Install the Microsoft ODBC Driver, and assign the correct name of the ODBC driver (visible in the ODBC Data Sources Windows application) to the code, if the default one is not detected. -Data can be queried from an AVEVA Historian through an ODBC connection. The Historian provides an interface to SQL, InSQL, which can be used to create data queries. \ No newline at end of file +Data can be queried from an AVEVA Historian through an ODBC connection. The Historian provides an interface to SQL, InSQL, which can be used to create data queries. + +Wonderware Historian queries are extermely slow, but in practice I have found splitting it up into time periods such as 6 months will scale to running at least dozens of queries at once. \ No newline at end of file diff --git a/input/tags-example.csv b/input/tags-example.csv new file mode 100644 index 0000000..70c87aa --- /dev/null +++ b/input/tags-example.csv @@ -0,0 +1,17 @@ +Source Name,Destination Name,Data Type,Scale Factor,Interval (s),Precision,Deadband +11959,temp\new_value1,real,1,20,2,0.01 +5153,temp\new_value2,integer,1,100,0,0 +5154,temp\new_value3,real,1,30,0,1 +5155,temp\new_value4,boolean,1,9,0,0 +5,temp\new_value5,real,1,20,2,0 +6,temp\new_value6,integer,10,100,0,0 +227,temp\new_value7,real,1.5,100,2,0 +8,temp\new_value8,boolean,1,9,0,0 +9,temp\new_value9,real,1,10,2,0 +10,temp\new_value10,integer,1,10,0,0 +011,temp\new_value11,real,1,10,4,0 +12,temp\new_value12,boolean,1,10,0,0 +1113,temp\new_value13,real,1,12,4,0 +14,temp\new_value14,integer,1,13,0,0 +1665,temp\new_value15,real,1,14,4,0 +16,temp\new_value16,boolean,1,15,0,0 diff --git a/input/tags.csv b/input/tags.csv index 70c87aa..d1b77ef 100644 --- a/input/tags.csv +++ b/input/tags.csv @@ -1,17 +1,124 @@ -Source Name,Destination Name,Data Type,Scale Factor,Interval (s),Precision,Deadband -11959,temp\new_value1,real,1,20,2,0.01 -5153,temp\new_value2,integer,1,100,0,0 -5154,temp\new_value3,real,1,30,0,1 -5155,temp\new_value4,boolean,1,9,0,0 -5,temp\new_value5,real,1,20,2,0 -6,temp\new_value6,integer,10,100,0,0 -227,temp\new_value7,real,1.5,100,2,0 -8,temp\new_value8,boolean,1,9,0,0 -9,temp\new_value9,real,1,10,2,0 -10,temp\new_value10,integer,1,10,0,0 -011,temp\new_value11,real,1,10,4,0 -12,temp\new_value12,boolean,1,10,0,0 -1113,temp\new_value13,real,1,12,4,0 -14,temp\new_value14,integer,1,13,0,0 -1665,temp\new_value15,real,1,14,4,0 -16,temp\new_value16,boolean,1,15,0,0 +Source Name,Destination Name,Data Type,Scale Factor,Interval (s),Precision,Deadband +AHU6_Z_SP_3000571.Value,_\BACNET_HVAC\AHU6\RM_TEMP_SP\CMD,integer,1,100,0,0 +Airport_Boost_Pump_002.Runtime,_\DRS\Airport_BS\P102\RUN_TIME\HOURS,real,1,60,1,0.1 +Airport_Boost_Pump_004.Runtime,_\DRS\Airport_BS\P104\RUN_TIME\HOURS,real,1,60,1,0.1 +Airport_Boost_Pump_001.Runtime,_\DRS\Airport_BS\P101\RUN_TIME\HOURS,real,1,60,1,0.1 +Airport_Boost_Pump_003.Runtime,_\DRS\Airport_BS\P103\RUN_TIME\HOURS,real,1,60,1,0.1 +AHU101_DA_TEMP_3000340.Value,_\BACNET_HVAC\AHU101\SA_TEMP\SCL,real,1,60,1,0.1 +AHU6_DA_TEMP_3000446.Value,_\BACNET_HVAC\AHU6\SA_TEMP\SCL,real,1,60,1,0.1 +Airport_Boost_Pump_001.Current_Demand,_\DRS\Airport_BS\CT_101\SCL,real,1,60,1,0.1 +Airport_Boost_Pump_002.Current_Demand,_\DRS\Airport_BS\CT_102\SCL,real,1,60,1,0.1 +Airport_Boost_Pump_003.Current_Demand,_\DRS\Airport_BS\CT_103\SCL,real,1,60,1,0.1 +Airport_Boost_Pump_004.Current_Demand,_\DRS\Airport_BS\CT_104\SCL,real,1,60,1,0.1 +Airport_System.Discharge_Flow,_\DRS\Airport_BS\FIT_101\SCL,real,1,60,1,0.1 +Airport_System.Total_Flow,_\DRS\Airport_BS\FIT_101\TOTALIZE,real,1,60,1,0.1 +Airport_Booster.P101_SPEED,_\DRS\Airport_BS\P101\YI,real,1,60,1,0.1 +Airport_Booster.P102_SPEED,_\DRS\Airport_BS\P102\YI,real,1,60,1,0.1 +Airport_Booster.P103_SPEED,_\DRS\Airport_BS\P103\YI,real,1,60,1,0.1 +Airport_Booster.P104_SPEED,_\DRS\Airport_BS\P104\YI,real,1,60,1,0.1 +Airport_System.Discharge_Pressure,_\DRS\Airport_BS\PIT_102\SCL,real,1,60,1,0.1 +Southlands_Lift.FIT_102,_\DRS\Southlands_LS\FIT_102\SCL,real,1,60,1,0.1 +Southlands_Lift.LT_127A,_\DRS\Southlands_LS\LT_127A\SCL,real,1,60,1,0.1 +Southridge_Res.LIT_219_mm,_\DRS\Southridge_Reservoir\LIT_219\SCL,real,1,60,1,0.1 +Southview_Res.Chlorine_Residual,_\DRS\Southview_Reservoir\AIT_101\SCL,real,1,60,1,0.1 +Southview_System.Chlorine_Residual,_\DRS\Southview_Reservoir\AIT_101\SCL,real,1,60,1,0.1 +Southview_Res.Pump_1_Speed_Hz,_\DRS\Southview_Reservoir\BP_101\YI,real,1,60,1,0.1 +Southview_Res.Pump_2_Speed_Hz,_\DRS\Southview_Reservoir\BP_102\YI,real,1,60,1,0.1 +Southview_Res.Pump_3_Speed_Hz,_\DRS\Southview_Reservoir\BP_103\YI,real,1,60,1,0.1 +Southview_Res.CT_101,_\DRS\Southview_Reservoir\CT_101\SCL,real,1,60,1,0.1 +Southview_Res.CT_102,_\DRS\Southview_Reservoir\CT_102\SCL,real,1,60,1,0.1 +Southview_Res.CT_103,_\DRS\Southview_Reservoir\CT_103\SCL,real,1,60,1,0.1 +Southview_Res.FIT_101,_\DRS\Southview_Reservoir\FIT_101\SCL,real,1,60,1,0.1 +Southview_System.Inlet_Flow,_\DRS\Southview_Reservoir\FIT_101\SCL,real,1,60,1,0.1 +Southview_Res.FIT_102,_\DRS\Southview_Reservoir\FIT_102\SCL,real,1,60,1,0.1 +Southview_System.Discharge_Flow,_\DRS\Southview_Reservoir\FIT_102\SCL,real,1,60,1,0.1 +Southview_Res.LT_101,_\DRS\Southview_Reservoir\LIT_101\SCL,real,1,60,1,0.1 +Southview_System.Level,_\DRS\Southview_Reservoir\LIT_101\SCL,real,1,60,1,0.1 +Southview_Res.LT_101_mm,_\DRS\Southview_Reservoir\LIT_101\SCL2,real,1,60,1,0.1 +Southview_System.Level_m,_\DRS\Southview_Reservoir\LIT_101\SCL2,real,1,60,1,0.1 +Southview_Res.PT_101,_\DRS\Southview_Reservoir\PIT_101\SCL,real,1,60,1,0.1 +Southview_System.Inlet_Pressure,_\DRS\Southview_Reservoir\PIT_101\SCL,real,1,60,1,0.1 +Southview_Res.PT_102,_\DRS\Southview_Reservoir\PIT_102\SCL,real,1,60,1,0.1 +Southview_System.Discharge_Pressure,_\DRS\Southview_Reservoir\PIT_102\SCL,real,1,60,1,0.1 +AIT_DU_8638.SCL,_\WTP\ChlorScrubber\AIT_DU_8638\SCL,real,1,60,1,0.1 +AIT_DU_8639.SCL,_\WTP\ChlorScrubber\AIT_DU_8639\SCL,real,1,60,1,0.1 +AIT_DU_8640.SCL,_\WTP\ChlorScrubber\AIT_DU_8640\SCL,real,1,60,1,0.1 +AIT_DU_8641.SCL,_\WTP\ChlorScrubber\AIT_DU_8641\SCL,real,1,60,1,0.1 +AIT_DU_8642.SCL,_\WTP\ChlorScrubber\AIT_DU_8642\SCL,real,1,60,1,0.1 +AIT_DU_8643.SCL,_\WTP\ChlorScrubber\AIT_DU_8643\SCL,real,1,60,1,0.1 +AIT_DU_8644.SCL,_\WTP\ChlorScrubber\AIT_DU_8644\SCL,real,1,60,1,0.1 +AIT_DU_8645.SCL,_\WTP\ChlorScrubber\AIT_DU_8645\SCL,real,1,60,1,0.1 +AIT8809.SCL,_\WTP\Dechlor\Tank_12\AIT8809\SCL,real,1,60,1,0.1 +AIT8811.SCL,_\WTP\Dechlor\Tank_12\AIT8811\SCL,real,1,60,1,0.1 +AIT8803.SCL,_\WTP\Dechlor\Tank_3\AIT8803\SCL,real,1,60,1,0.1 +AIT8805.SCL,_\WTP\Dechlor\Tank_3\AIT8805\SCL,real,1,60,1,0.1 +SCU_1.Effluent_Turbidity,_\WTP\SCU1\EFF_NTU\SCL,real,1,60,3,0.001 +SCU_1.Effluent_pH,_\WTP\SCU1\EFF_PH\SCL,real,1,60,2,0.01 +Act_Carb_Tank_001.Tank_Level_L,_\WTP\SCU1\LIT\SCL,real,1,60,1,0.1 +SCU_1.Level,_\WTP\SCU1\LIT\SCL,real,1,60,1,0.1 +SCU_1.Level_mm,_\WTP\SCU1\LIT\SCL2,real,1,60,1,0.1 +SCU_2.Effluent_Turbidity,_\WTP\SCU2\EFF_NTU\SCL,real,1,60,3,0.001 +SCU_2.Effluent_pH,_\WTP\SCU2\EFF_PH\SCL,real,1,60,2,0.01 +SCU_2.Level,_\WTP\SCU2\LIT\SCL,real,1,60,1,0.1 +SCU_2.Level_mm,_\WTP\SCU2\LIT\SCL2,real,1,60,1,0.1 +SCU_3.Effluent_Turbidity,_\WTP\SCU3\EFF_NTU\SCL,real,1,60,3,0.001 +SCU_3.Effluent_pH,_\WTP\SCU3\EFF_PH\SCL,real,1,60,2,0.01 +SCU_3.Level,_\WTP\SCU3\LIT\SCL,real,1,60,1,0.1 +SCU_3.Level_mm,_\WTP\SCU3\LIT\SCL2,real,1,60,1,0.1 +SCU_4.Effluent_Turbidity,_\WTP\SCU4\EFF_NTU\SCL,real,1,60,3,0.001 +SCU_4.Effluent_pH,_\WTP\SCU4\EFF_PH\SCL,real,1,60,2,0.01 +SCU_4.Level,_\WTP\SCU4\LIT\SCL,real,1,60,1,0.1 +SCU_4.Level_mm,_\WTP\SCU4\LIT\SCL2,real,1,60,1,0.1 +SCU_4.Raw_Turbidity_Max_SP,_\WTP\SCU4\RAW\AIT_RAW_NTU\AH\ALM_SP,real,1,60,3,0.001 +SCU_4.Raw_Turbidity,_\WTP\SCU4\RAW\AIT_RAW_NTU\SCL,real,1,60,3,0.001 +SCU_4.Raw_pH,_\WTP\SCU4\RAW\AIT_RAW_PH\SCL,real,1,60,2,0.01 +SCU_4.4_SCU_PIT_SCL,_\WTP\SCU4\RAW\PIT_RAW\SCL,real,1,60,1,0.1 +SCU_4.Raw_Temperature,_\WTP\SCU4\RAW\TIT_RAW\SCL,real,1,60,1,0.1 +SCU_5.Effluent_Turbidity,_\WTP\SCU5\EFF_NTU\SCL,real,1,60,3,0.001 +SCU_5.Effluent_pH,_\WTP\SCU5\EFF_PH\SCL,real,1,60,2,0.01 +SCU_5.Level,_\WTP\SCU5\LIT\SCL,real,1,60,1,0.1 +SCU_5.Sludge_Level,_\WTP\SCU5\LIT_SLUDGE\SCL,real,1,60,1,0.1 +SCU_5.Raw_Turbidity,_\WTP\SCU5\RAW\AIT_RAW_NTU\SCL,real,1,60,3,0.001 +SCU_5.Raw_pH,_\WTP\SCU5\RAW\AIT_RAW_PH\SCL,real,1,60,2,0.01 +SCU_5.5_SCU_PIT_SCL,_\WTP\SCU5\RAW\PIT_RAW\SCL,real,1,60,1,0.1 +SCU_5.Raw_Temperature,_\WTP\SCU5\RAW\TIT_RAW\SCL,real,1,60,1,0.1 +ALUM.P1_Spd_Feedback,_\WWTP\CP_100\FIL\ALUM\Pump_1\YI,real,1,60,1,0.1 +ALUM.P2_Spd_Feedback,_\WWTP\CP_100\FIL\ALUM\Pump_2\YI,real,1,60,1,0.1 +ALUM.P3_Spd_Feedback,_\WWTP\CP_100\FIL\ALUM\Pump_2\YI,real,1,60,1,0.1 +RSS_P1.CLARIFIER_SLUDGE_LVL,_\WWTP\CP_100\SEC_CLA\P1_Sludge_Level\SCL,real,1,60,1,0.1 +RSS_P3.CLARIFIER_SLUDGE_LVL,_\WWTP\CP_100\SEC_CLA\P3_Sludge_Level\SCL,real,1,60,1,0.1 +FEP_PIT_1.SCL,_\WWTP\FEP\FEP_PIT_1\SCL,real,1,60,1,0.1 +SCB_LT_1.SCL,_\WWTP\FEP\SCB_LT_1\SCL,real,1,60,1,0.1 +Airport_System.Suction_Pressure,_\DRS\Airport_BS\PIT_101\SCL,real,1,60,1,0.1 +Southlands_Lift.FIT_102_Total,_\DRS\Southlands_LS\FIT_102\TOTALIZE\TOTAL,integer,1,60,0,1 +Southview_Res.Start_Fill_SP,_\DRS\Southview_Reservoir\_SP\Start_Fill_SP\SP,real,1,60,1,0.1 +Southview_Res.Stop_Fill_SP,_\DRS\Southview_Reservoir\_SP\Stop_Fill_SP\SP,real,1,60,1,0.1 +Southview_Res.Pump_1_Runtime,_\DRS\Southview_Reservoir\BP_101\RUN_TIME\HOURS,integer,1,60,0,1 +Southview_Res.Pump_2_Runtime,_\DRS\Southview_Reservoir\BP_102\RUN_TIME\HOURS,integer,1,60,0,1 +Southview_Res.Pump_3_Runtime,_\DRS\Southview_Reservoir\BP_103\RUN_TIME\HOURS,integer,1,60,0,1 +Southview_Res.FCV_Position,_\DRS\Southview_Reservoir\FCV_Position\ZI,real,1,60,1,0.1 +Act_Carb_System.DSG_SCU1_SP,_\WTP\ActiveCarbon\_SP\DSG_SCU1_SP\SP,real,1,60,1,0.1 +Act_Carb_System.DSG_SCU2_SP,_\WTP\ActiveCarbon\_SP\DSG_SCU2_SP\SP,real,1,60,1,0.1 +Act_Carb_System.DSG_SCU3_SP,_\WTP\ActiveCarbon\_SP\DSG_SCU3_SP\SP,real,1,60,1,0.1 +Act_Carb_System.DSG_SCU4_SP,_\WTP\ActiveCarbon\_SP\DSG_SCU4_SP\SP,real,1,60,1,0.1 +Act_Carb_System.DSG_SCU5_SP,_\WTP\ActiveCarbon\_SP\DSG_SCU5_SP\SP,real,1,60,1,0.1 +Alum_System.Dosage_SCU2_SP,_\WTP\AlumSystem\_SP\Dosage\SCU2_DOSAGE_SP\SP,real,1,60,1,0.1 +Alum_System.Dosage_SCU3_SP,_\WTP\AlumSystem\_SP\Dosage\SCU3_DOSAGE_SP\SP,real,1,60,1,0.1 +Alum_System.Dosage_SCU4_SP,_\WTP\AlumSystem\_SP\Dosage\SCU4_DOSAGE_SP\SP,real,1,60,1,0.1 +Alum_System.Dosage_SCU5_SP,_\WTP\AlumSystem\_SP\Dosage\SCU5_DOSAGE_SP\SP,real,1,60,1,0.1 +Alum_System.Daily_Total,_\WTP\AlumSystem\FQIT\TOTAL_TODAY,integer,1,60,0,1 +Highlift_Pump_010.Discharge_Valve_Position,_\WTP\Distribution\HLPs\HIGH_LIFT_10\FCV_HLP\ZI,real,1,60,1,0.1 +Highlift_Pump_012.Discharge_Valve_Position,_\WTP\Distribution\HLPs\HIGH_LIFT_12\FCV_HLP\ZI,real,1,60,1,0.1 +SCU_1.Flow_Total,_\WTP\SCU1\FQIT\TOTAL,integer,1,60,0,1 +SCU_2.Flow_Total,_\WTP\SCU2\FQIT\TOTAL,integer,1,60,0,1 +SCU_3.Flow_Total,_\WTP\SCU3\FQIT\TOTAL,integer,1,60,0,1 +SCU_4.Flow_Total,_\WTP\SCU4\FQIT\TOTAL,integer,1,60,0,1 +SCU_4.Raw_pH_Max_SP,_\WTP\SCU4\RAW\AIT_RAW_PH\AH\ALM_SP,real,1,60,2,0.01 +SCU_4.Raw_pH_Min_SP,_\WTP\SCU4\RAW\AIT_RAW_PH\AL\ALM_SP,real,1,60,2,0.01 +RSS.RETURN_FLOW,_\WWTP\CP_100\FIL\RSS\RETURN_FLOW,real,1,60,1,0.1 +RSS_P1.RUNTIME_TOT_HOURS,_\WWTP\CP_100\FIL\RSS\RSS1\RUN_TIME\HOURS,integer,1,60,0,1 +RSS_P1.SC,_\WWTP\CP_100\FIL\RSS\RSS1\SC\AUTO,real,1,60,1,0.1 +RSS_P1.SC_OUT,_\WWTP\CP_100\FIL\RSS\RSS1\SC\CONTR,real,1,60,1,0.1 +RSS_P3.RUNTIME_TOT_HOURS,_\WWTP\CP_100\FIL\RSS\RSS3\RUN_TIME\HOURS,integer,1,60,0,1 +RSS_P3.SC,_\WWTP\CP_100\FIL\RSS\RSS3\SC\AUTO,real,1,60,1,0.1 +RSS_P3.SC_OUT,_\WWTP\CP_100\FIL\RSS\RSS3\SC\CONTR,real,1,60,1,0.1 diff --git a/main.py b/main.py index b98f55d..508084a 100644 --- a/main.py +++ b/main.py @@ -4,8 +4,10 @@ import sys import os import requests import pyodbc +import pytz import subprocess import time + from typing import List, Union from datetime import datetime, timezone, timedelta @@ -48,9 +50,8 @@ class HistoricalTag: # aveva_query() # ---------------------- -# def aveva_query(historical_tags: List[HistoricalTag], start_time: datetime, end_time: datetime): - + current_start_time = start_time current_end_time = start_time @@ -65,9 +66,12 @@ def aveva_query(historical_tags: List[HistoricalTag], start_time: datetime, end_ else: current_end_time = current_end_time + timedelta(days=92) - tag_mappings.append(aveva_query_date(historical_tags, current_start_time, current_end_time)) - current_start_time = current_start_time + timedelta(days=92) + query_mappings = aveva_query_date(historical_tags, current_start_time, current_end_time) + for mapping in query_mappings: + tag_mappings.append(mapping) + + current_start_time = current_start_time + timedelta(days=92) write_tagmapping_to_file(dir_path + "TagMapping.csv", tag_mappings) @@ -101,8 +105,8 @@ def aveva_query_date(historical_tags: List[HistoricalTag], start_time: datetime, ft_end_time = '"' + str(end_time.astimezone(timezone.utc)) + '"' ft_tag_str = '[' + str(tag.name_source) + ']' - query = f"SELECT * FROM OpenQuery(INSQL, 'SELECT DateTime, {ft_tag_str} FROM WideHistory WHERE DateTime >=" + \ - f"{ft_start_time} AND DateTime <= {ft_end_time} AND wwRetrievalMode = {retrieval_mode}" + \ + query = f"SELECT * FROM OpenQuery(INSQL, 'SELECT DateTime, {ft_tag_str} FROM WideHistory WHERE DateTime >= " + \ + f"{ft_start_time} AND DateTime <= {ft_end_time} AND wwRetrievalMode = {retrieval_mode} " + \ f"AND wwResolution = {str(tag.interval * 1000)}')" cursor = connection.cursor() @@ -406,7 +410,7 @@ def postprocess_values(values: List[Union[int, float, None]]): def prepare_file_for_tag(tag: HistoricalTag, values: List[Union[int, float, None]], dir_path: str, current_end_time: datetime, append=False) -> str: - if values is None: + if len(values) == 0: print("No values found") return "" else: @@ -468,6 +472,8 @@ def write_tagmapping_to_file(output_file: str, tag_mappings: List[str]): with open(output_file, mode='a', newline='', encoding='utf-8') as csvfile: csv_writer = csv.writer(csvfile) + print(len(tag_mappings)) + for mapping in tag_mappings: csv_writer.writerow(mapping) @@ -490,7 +496,7 @@ def write_values_to_file(output_file: str, values: List[Union[int, float, None]] for value_pair in values: timestamp, value = value_pair if value is not None: - utc_dt = datetime.utcfromtimestamp(timestamp) + utc_dt = datetime.fromtimestamp(timestamp, config_tz) formatted_timestamp = utc_dt.strftime( '%Y-%m-%d %H:%M:%S.%f')[:-3] csv_writer.writerow([formatted_timestamp, value]) @@ -504,9 +510,9 @@ def write_values_to_file(output_file: str, values: List[Union[int, float, None]] def weeks_since_date(timestamp, date=(1601, 1, 1)): - dt = datetime.utcfromtimestamp(timestamp) + utc_dt = datetime.fromtimestamp(timestamp, config_tz) start_date = datetime(*date) - delta = dt - start_date + delta = utc_dt - start_date weeks = delta.days // 7 return weeks @@ -528,7 +534,7 @@ config = toml.load("setup.toml") tags_path = config['system']['tags_path'] output_path = config['system']['output_path'] -system_timezone = config['system']['system_timezone'] +config_timezone = config['system']['system_timezone'] application_user = config['user']['application_user'] application_pass = config['user']['application_pass'] @@ -540,12 +546,14 @@ if len(sys.argv) == 4: year, month, day = map(int, str(sys.argv[3]).split("-")) end_time = datetime(year, month, day, 0, 0, 0) + config_tz = pytz.timezone(config_timezone) + print("") historical_tags = read_tags(tags_path) - for tag in historical_tags: - print(tag) + #for tag in historical_tags: + # print(tag) if query_type == "VTScada": print_text('VTScada Data Query') diff --git a/setup.toml b/setup.toml index ce60ded..75a1e5d 100644 --- a/setup.toml +++ b/setup.toml @@ -8,7 +8,7 @@ output_path = "output\\" system_timezone = "Canada/Mountain" [aveva] -server_name = "HIST002" +server_name = "192.168.1.41" database_name = "Runtime" [vtscada]