diff --git a/docs/Module/Pypower.md b/docs/Module/Pypower.md index db0be749e..4d150eb29 100644 --- a/docs/Module/Pypower.md +++ b/docs/Module/Pypower.md @@ -5,19 +5,28 @@ GLM: ~~~ -module pypower +module pypower { - set {QUIET=65536, WARNING=131072, DEBUG=262144, VERBOSE=524288} message_flags; // module message control flags - int32 version; // Version of pypower used (default is 2) - enumeration {NR=1, FD_XB=2, FD_BX=3, GS=4} solver_method; // PyPower solver method to use - int32 maximum_timestep; // Maximum timestep allowed between solutions (default is 0, meaning no maximum timestep) - double baseMVA[MVA]; // Base MVA value (default is 100 MVA) - bool enable_opf; // Flag to enable solving optimal powerflow problem instead of just powerflow (default is FALSE) - bool stop_on_failure; // Flag to stop simulation on solver failure (default is FALSE) - bool save_case; // Flag to enable saving case data and results (default is FALSE) - char1024 controllers; // Python module containing controller functions - double solver_update_resolution; // Minimum difference before a value is considered changed - enumeration {INIT=0, SUCCESS=1, FAILED=2} solver_status; // Result of the last pypower solver run + set {QUIET=65536, WARNING=131072, DEBUG=262144, VERBOSE=524288} message_flags; // module message control flags + char256 timestamp_format; // Format for weather file timestamps ('' is RFC822/ISO8601) + int32 version; // Version of pypower used + enumeration {NR=1, FD_XB=2, FD_BX=3, GS=4} solver_method; // PyPower solver method to use + int32 maximum_timestep; // Maximum timestep allowed between solutions + double baseMVA[MVA]; // Base MVA value + bool enable_opf; // Flag to enable optimal powerflow (OPF) solver + bool stop_on_failure; // Flag to stop simulation on solver failure + bool save_case; // Flag to save pypower case data and results + char1024 controllers_path; // Path to find module containing controller functions + char1024 controllers; // Python module containing controller functions + double solver_update_resolution; // Minimum difference before a value is considered changed + int32 maximum_iterations; // Maximum iterations (0 defaults to pypower default for solver_method) + double solution_tolerance; // Solver convergence error tolerante (0 defaults to pypower default) + enumeration {FAILED=2, SUCCESS=1, INIT=0} solver_status; // Result of the last pypower solver run + bool enforce_q_limits; // Enable enforcement of reactive power limits + bool use_dc_powerflow; // Enable use of DC powerflow solution + enumeration {PY=2, JSON=1, CSV=0} save_format; // Save case format + double total_loss[MW]; // System-wide line losses + double generation_shortfall[MW]; // System-wide generation shortfall } ~~~ @@ -206,9 +215,24 @@ If the `on_init` function is defined in the Python `controllers` module, it will be called when the simulation is initialized. Note that many `gridlabd` module functions are not available until after initialization is completed. +In addition, the following event handlers are supported: + +* `on_precommit(dict:data) --> int`: Called when the clock advances before + the main solver is called. + +* `on_sync(dict:data) --> int`: Called each time the main solver is called. + +* `on_commit(dict:data) --> int`: Called after the last time the main solver + is called. + +* `on_term() --> None`: Called when the simulation is done. + Any `load`, `powerplant`, and `relay` object may specify a `controller` property. When this property is defined, the corresponding controller -function will be called if it is defined in the `controllers` module. +function will be called if it is defined in the `controllers` module. The +return value is a unix timestamp in seconds of epoch indicating the time of +the next event, if any. Otherwise, it should return `gridlabd.NEVER` or +`gridlabd.INVALID` to indicate an error. Controller functions use the following call/return prototype @@ -222,6 +246,13 @@ is any valid property of the calling object. A special return name `t` is used to specify the time at which the controller is to be called again, specify in second of the Unix epoch. +When the controller module is loaded, the built-in `gridlabd` module is added +to the globals to provide access to the main instance of `gridlabd` and its +support methods. You do not need to import `gridlabd`. + +For more information on the `gridlabd` main module, see [[/Module/Python]] and +[[/Module/Python/Property]]. + ## SCADA The `scada` object is used to access properties of objects in the @@ -232,6 +263,17 @@ will copy back values that have changed. If the `record` property is `TRUE`, the `controllers` module will have a global `historian` which records are past values of the `scada` global. +## Geodata + +The `geodata` object is used to map a panel of location-based data to +variables across a number of objects or classes based on the objects' +locations. Each `geodata` CSV file corresponds to a single object property, +and is organized a locations in columns and time-series in rows. + +## Weather + +The `weather` object is used to read weather data from a weather file. + # See also * [PyPower documentation](https://pypi.org/project/PYPOWER/) @@ -241,6 +283,9 @@ past values of the `scada` global. * [[/Module/Pypower/Powerplant]] * [[/Module/Pypower/Relay]] * [[/Module/Pypower/Scada]] +* [[/Module/Pypower/Weather]] * [[/Module/Pypower/Transformer]] +* [[/Module/Python]] +* [[/Module/Python/Property]] * [[/Converters/Import/Pypower_cases]] * [[/Converters/Import/Psse_models]] diff --git a/docs/Module/Pypower/Powerplant.md b/docs/Module/Pypower/Powerplant.md index 14f139b54..6a2d749d4 100644 --- a/docs/Module/Pypower/Powerplant.md +++ b/docs/Module/Pypower/Powerplant.md @@ -40,6 +40,17 @@ are applied to the object, and the next update is schedule at the time `t` returned by the controller. Note that unlike the `load` object, `powerplant` objects do force iteration if no value of `t` is returned. +Note the following: + +1. `gen` objects are dispatchable -- the values of `Pg` and `Qg` may be +updated after the powerflow solution is updated. As a result, only +dispatchable resources should use a `gen` parent object. + +2. `bus` objects are non-dispatchable -- the values of `Pd` and `Qd` +will not be changed following the powerflow solution. As a result, only +non-dispatchable resources should use a `bus` parent object. The applies +particularly to wind, solar, and batteries. + # Example The following example implements a 10 kW generator turn turns on only in the diff --git a/docs/Module/Pypower/Weather.md b/docs/Module/Pypower/Weather.md new file mode 100644 index 000000000..420ecf24a --- /dev/null +++ b/docs/Module/Pypower/Weather.md @@ -0,0 +1,47 @@ +[[/Module/Pypower/Weather]] -- PyPower weather object + +# Synopsis + +~~~ +class weather { + char1024 file; // Source object for weather data + char1024 variables; // Weather variable column names (col1,col2,...) + double resolution[s]; // Weather time downsampling resolution (s) + double Sn[W/m^2]; // Solar direct normal irradiance (W/m^2) + double Sh[W/m^2]; // Solar horizontal irradiance (W/m^2) + double Sg[W/m^2]; // Solar global irradiance (W/m^2) + double Wd[deg]; // Wind direction (deg) + double Ws[m/2]; // Wind speed (m/2) + double Td[degC]; // Dry-bulb air temperature (degC) + double Tw[degC]; // Wet-bulb air temperature (degC) + double RH[%]; // Relative humidity (%) + double PW[in]; // Precipitable_water (in) + double HI[degF]; // Heat index (degF) +} +~~~ + +# Description + +The `weather` object reads data from a weather CSV file. The columns +in the CSV file are mapped according to the `variables` property. + +The `bus` object includes the `weather` file properties, which allows +individual busses to read weather data directly. + +# Example + +The following example reads weather data in bus 1 of the IEEE 14 bus model. + +~~~ +module pypower +{ + solver_method NR; +} +#input "case14.py" -t pypower +modify pp_bus_1.weather_file ${DIR:-.}/case14_bus1_weather.csv; +modify pp_bus_1.weather_variables Sh,Sn,Sg,Wd,Ws,Td,Tw,RH,PW; +~~~ + +# See also + +- [[/Module/Pypower]] diff --git a/module/pypower/autotest/controllers.py b/module/pypower/autotest/controllers.py index 6af565eaa..81d9b6f10 100644 --- a/module/pypower/autotest/controllers.py +++ b/module/pypower/autotest/controllers.py @@ -12,26 +12,35 @@ def on_sync(data): def load_control(obj,**kwargs): # print(f"load_control({obj})",kwargs,file=sys.stderr) if kwargs['t']%3600 < 1800 and kwargs['P'] != 0: # turn off load in first half-hour - return dict(P=0) + return dict(t=(int(kwargs['t']/1800)+1)*1800,P=0) elif kwargs['t']%3600 >= 1800 and kwargs['P'] == 0: # turn on load in second half-hour - return dict(P=10) + return dict(t=(int(kwargs['t']/1800)+1)*1800,P=10) else: # no change -- advance to next 1/2 hour when a change is anticipated return dict(t=(int(kwargs['t']/1800)+1)*1800) def powerplant_control(obj,**kwargs): # print(f"powerplant_control({obj})",kwargs,file=sys.stderr) - if kwargs['t']%3600 < 1800 and kwargs['S'].real != 0: # turn off plant in first half-hour - return dict(S=(0j)) - elif kwargs['t']%3600 >= 1800 and kwargs['S'].real == 0: # turn on plant in second half-hour - return dict(S=(10+0j)) + if kwargs['t']%3600 < 1800: # turn off plant in first half-hour + return dict(t=(int(kwargs['t']/1800)+1)*1800,S=(0j)) + elif kwargs['t']%3600 >= 1800: # turn on plant in second half-hour + return dict(t=(int(kwargs['t']/1800)+1)*1800,S=(10+0j)) + else: # no change -- advance to next 1/2 hour when a change is anticipated + return dict(t=(int(kwargs['t']/1800)+1)*1800) + +def storage_control(obj,**kwargs): + # print(f"powerplant_control({obj})",kwargs,file=sys.stderr) + if kwargs['t']%3600 < 1800: # discharge in first half-hour + return dict(t=(int(kwargs['t']/1800)+1)*1800,S=(-0.001+0j)) + elif kwargs['t']%3600 >= 1800: # charge in second half-hour + return dict(t=(int(kwargs['t']/1800)+1)*1800,S=(0.01+0j)) else: # no change -- advance to next 1/2 hour when a change is anticipated return dict(t=(int(kwargs['t']/1800)+1)*1800) def relay_control(obj,**kwargs): # print(f"relay_control({obj})",kwargs,file=sys.stderr) if kwargs['t']%3600 < 1800 and kwargs['status'] != 0: # open the relay in first half-hour - return dict(status=0) + return dict(t=(int(kwargs['t']/1800)+1)*1800,status=0) elif kwargs['t']%3600 >= 1800 and kwargs['status'] == 0: # close the relay in second half-hour - return dict(status=1) + return dict(t=(int(kwargs['t']/1800)+1)*1800,status=1) else: # no change -- advance to next 1/2 hour when a change is anticipated return dict(t=(int(kwargs['t']/1800)+1)*1800) diff --git a/module/pypower/autotest/test_case14_storage.glm b/module/pypower/autotest/test_case14_storage.glm new file mode 100644 index 000000000..95cc35bd9 --- /dev/null +++ b/module/pypower/autotest/test_case14_storage.glm @@ -0,0 +1,35 @@ +#define CASE=14 +#ifexists "../case.glm" +#define DIR=.. +#endif + +//#option debug + +module pypower +{ +#ifdef DIR + controllers_path "${DIR}"; +#endif + controllers "controllers"; +} + +module tape +{ + csv_header_type NAME; +} +object pypower.powerplant +{ + parent pp_bus_2; + status ONLINE; + controller "storage_control"; + charging_capacity 15 kW; + storage_capacity 10 MWh; + storage_efficiency 0.95; + object recorder + { + file "${modelname/.glm/_record.csv}"; + property S,state_of_charge; + }; +} + +#include "${DIR:-.}/case.glm" diff --git a/module/pypower/autotest/test_case14_storage_record.csv b/module/pypower/autotest/test_case14_storage_record.csv new file mode 100644 index 000000000..401e9895d --- /dev/null +++ b/module/pypower/autotest/test_case14_storage_record.csv @@ -0,0 +1,1490 @@ +timestamp,S,state_of_charge +2020-01-01 00:00:00 PST,-0.001+0j,+0 +2020-01-01 00:30:00 PST,+0.01+0j,+0 +2020-01-01 01:00:00 PST,-0.001+0j,+0.000475 +2020-01-01 01:30:00 PST,+0.01+0j,+0.0004275 +2020-01-01 02:00:00 PST,-0.001+0j,+0.0009025 +2020-01-01 02:30:00 PST,+0.01+0j,+0.000855 +2020-01-01 03:00:00 PST,-0.001+0j,+0.00133 +2020-01-01 03:30:00 PST,+0.01+0j,+0.0012825 +2020-01-01 04:00:00 PST,-0.001+0j,+0.0017575 +2020-01-01 04:30:00 PST,+0.01+0j,+0.00171 +2020-01-01 05:00:00 PST,-0.001+0j,+0.002185 +2020-01-01 05:30:00 PST,+0.01+0j,+0.0021375 +2020-01-01 06:00:00 PST,-0.001+0j,+0.0026125 +2020-01-01 06:30:00 PST,+0.01+0j,+0.002565 +2020-01-01 07:00:00 PST,-0.001+0j,+0.00304 +2020-01-01 07:30:00 PST,+0.01+0j,+0.0029925 +2020-01-01 08:00:00 PST,-0.001+0j,+0.0034675 +2020-01-01 08:30:00 PST,+0.01+0j,+0.00342 +2020-01-01 09:00:00 PST,-0.001+0j,+0.003895 +2020-01-01 09:30:00 PST,+0.01+0j,+0.0038475 +2020-01-01 10:00:00 PST,-0.001+0j,+0.0043225 +2020-01-01 10:30:00 PST,+0.01+0j,+0.004275 +2020-01-01 11:00:00 PST,-0.001+0j,+0.00475 +2020-01-01 11:30:00 PST,+0.01+0j,+0.0047025 +2020-01-01 12:00:00 PST,-0.001+0j,+0.0051775 +2020-01-01 12:30:00 PST,+0.01+0j,+0.00513 +2020-01-01 13:00:00 PST,-0.001+0j,+0.005605 +2020-01-01 13:30:00 PST,+0.01+0j,+0.0055575 +2020-01-01 14:00:00 PST,-0.001+0j,+0.0060325 +2020-01-01 14:30:00 PST,+0.01+0j,+0.005985 +2020-01-01 15:00:00 PST,-0.001+0j,+0.00646 +2020-01-01 15:30:00 PST,+0.01+0j,+0.0064125 +2020-01-01 16:00:00 PST,-0.001+0j,+0.0068875 +2020-01-01 16:30:00 PST,+0.01+0j,+0.00684 +2020-01-01 17:00:00 PST,-0.001+0j,+0.007315 +2020-01-01 17:30:00 PST,+0.01+0j,+0.0072675 +2020-01-01 18:00:00 PST,-0.001+0j,+0.0077425 +2020-01-01 18:30:00 PST,+0.01+0j,+0.007695 +2020-01-01 19:00:00 PST,-0.001+0j,+0.00817 +2020-01-01 19:30:00 PST,+0.01+0j,+0.0081225 +2020-01-01 20:00:00 PST,-0.001+0j,+0.0085975 +2020-01-01 20:30:00 PST,+0.01+0j,+0.00855 +2020-01-01 21:00:00 PST,-0.001+0j,+0.009025 +2020-01-01 21:30:00 PST,+0.01+0j,+0.0089775 +2020-01-01 22:00:00 PST,-0.001+0j,+0.0094525 +2020-01-01 22:30:00 PST,+0.01+0j,+0.009405 +2020-01-01 23:00:00 PST,-0.001+0j,+0.00988 +2020-01-01 23:30:00 PST,+0.01+0j,+0.0098325 +2020-01-02 00:00:00 PST,-0.001+0j,+0.0103075 +2020-01-02 00:30:00 PST,+0.01+0j,+0.01026 +2020-01-02 01:00:00 PST,-0.001+0j,+0.010735 +2020-01-02 01:30:00 PST,+0.01+0j,+0.0106875 +2020-01-02 02:00:00 PST,-0.001+0j,+0.0111625 +2020-01-02 02:30:00 PST,+0.01+0j,+0.011115 +2020-01-02 03:00:00 PST,-0.001+0j,+0.01159 +2020-01-02 03:30:00 PST,+0.01+0j,+0.0115425 +2020-01-02 04:00:00 PST,-0.001+0j,+0.0120175 +2020-01-02 04:30:00 PST,+0.01+0j,+0.01197 +2020-01-02 05:00:00 PST,-0.001+0j,+0.012445 +2020-01-02 05:30:00 PST,+0.01+0j,+0.0123975 +2020-01-02 06:00:00 PST,-0.001+0j,+0.0128725 +2020-01-02 06:30:00 PST,+0.01+0j,+0.012825 +2020-01-02 07:00:00 PST,-0.001+0j,+0.0133 +2020-01-02 07:30:00 PST,+0.01+0j,+0.0132525 +2020-01-02 08:00:00 PST,-0.001+0j,+0.0137275 +2020-01-02 08:30:00 PST,+0.01+0j,+0.01368 +2020-01-02 09:00:00 PST,-0.001+0j,+0.014155 +2020-01-02 09:30:00 PST,+0.01+0j,+0.0141075 +2020-01-02 10:00:00 PST,-0.001+0j,+0.0145825 +2020-01-02 10:30:00 PST,+0.01+0j,+0.014535 +2020-01-02 11:00:00 PST,-0.001+0j,+0.01501 +2020-01-02 11:30:00 PST,+0.01+0j,+0.0149625 +2020-01-02 12:00:00 PST,-0.001+0j,+0.0154375 +2020-01-02 12:30:00 PST,+0.01+0j,+0.01539 +2020-01-02 13:00:00 PST,-0.001+0j,+0.015865 +2020-01-02 13:30:00 PST,+0.01+0j,+0.0158175 +2020-01-02 14:00:00 PST,-0.001+0j,+0.0162925 +2020-01-02 14:30:00 PST,+0.01+0j,+0.016245 +2020-01-02 15:00:00 PST,-0.001+0j,+0.01672 +2020-01-02 15:30:00 PST,+0.01+0j,+0.0166725 +2020-01-02 16:00:00 PST,-0.001+0j,+0.0171475 +2020-01-02 16:30:00 PST,+0.01+0j,+0.0171 +2020-01-02 17:00:00 PST,-0.001+0j,+0.017575 +2020-01-02 17:30:00 PST,+0.01+0j,+0.0175275 +2020-01-02 18:00:00 PST,-0.001+0j,+0.0180025 +2020-01-02 18:30:00 PST,+0.01+0j,+0.017955 +2020-01-02 19:00:00 PST,-0.001+0j,+0.01843 +2020-01-02 19:30:00 PST,+0.01+0j,+0.0183825 +2020-01-02 20:00:00 PST,-0.001+0j,+0.0188575 +2020-01-02 20:30:00 PST,+0.01+0j,+0.01881 +2020-01-02 21:00:00 PST,-0.001+0j,+0.019285 +2020-01-02 21:30:00 PST,+0.01+0j,+0.0192375 +2020-01-02 22:00:00 PST,-0.001+0j,+0.0197125 +2020-01-02 22:30:00 PST,+0.01+0j,+0.019665 +2020-01-02 23:00:00 PST,-0.001+0j,+0.02014 +2020-01-02 23:30:00 PST,+0.01+0j,+0.0200925 +2020-01-03 00:00:00 PST,-0.001+0j,+0.0205675 +2020-01-03 00:30:00 PST,+0.01+0j,+0.02052 +2020-01-03 01:00:00 PST,-0.001+0j,+0.020995 +2020-01-03 01:30:00 PST,+0.01+0j,+0.0209475 +2020-01-03 02:00:00 PST,-0.001+0j,+0.0214225 +2020-01-03 02:30:00 PST,+0.01+0j,+0.021375 +2020-01-03 03:00:00 PST,-0.001+0j,+0.02185 +2020-01-03 03:30:00 PST,+0.01+0j,+0.0218025 +2020-01-03 04:00:00 PST,-0.001+0j,+0.0222775 +2020-01-03 04:30:00 PST,+0.01+0j,+0.02223 +2020-01-03 05:00:00 PST,-0.001+0j,+0.022705 +2020-01-03 05:30:00 PST,+0.01+0j,+0.0226575 +2020-01-03 06:00:00 PST,-0.001+0j,+0.0231325 +2020-01-03 06:30:00 PST,+0.01+0j,+0.023085 +2020-01-03 07:00:00 PST,-0.001+0j,+0.02356 +2020-01-03 07:30:00 PST,+0.01+0j,+0.0235125 +2020-01-03 08:00:00 PST,-0.001+0j,+0.0239875 +2020-01-03 08:30:00 PST,+0.01+0j,+0.02394 +2020-01-03 09:00:00 PST,-0.001+0j,+0.024415 +2020-01-03 09:30:00 PST,+0.01+0j,+0.0243675 +2020-01-03 10:00:00 PST,-0.001+0j,+0.0248425 +2020-01-03 10:30:00 PST,+0.01+0j,+0.024795 +2020-01-03 11:00:00 PST,-0.001+0j,+0.02527 +2020-01-03 11:30:00 PST,+0.01+0j,+0.0252225 +2020-01-03 12:00:00 PST,-0.001+0j,+0.0256975 +2020-01-03 12:30:00 PST,+0.01+0j,+0.02565 +2020-01-03 13:00:00 PST,-0.001+0j,+0.026125 +2020-01-03 13:30:00 PST,+0.01+0j,+0.0260775 +2020-01-03 14:00:00 PST,-0.001+0j,+0.0265525 +2020-01-03 14:30:00 PST,+0.01+0j,+0.026505 +2020-01-03 15:00:00 PST,-0.001+0j,+0.02698 +2020-01-03 15:30:00 PST,+0.01+0j,+0.0269325 +2020-01-03 16:00:00 PST,-0.001+0j,+0.0274075 +2020-01-03 16:30:00 PST,+0.01+0j,+0.02736 +2020-01-03 17:00:00 PST,-0.001+0j,+0.027835 +2020-01-03 17:30:00 PST,+0.01+0j,+0.0277875 +2020-01-03 18:00:00 PST,-0.001+0j,+0.0282625 +2020-01-03 18:30:00 PST,+0.01+0j,+0.028215 +2020-01-03 19:00:00 PST,-0.001+0j,+0.02869 +2020-01-03 19:30:00 PST,+0.01+0j,+0.0286425 +2020-01-03 20:00:00 PST,-0.001+0j,+0.0291175 +2020-01-03 20:30:00 PST,+0.01+0j,+0.02907 +2020-01-03 21:00:00 PST,-0.001+0j,+0.029545 +2020-01-03 21:30:00 PST,+0.01+0j,+0.0294975 +2020-01-03 22:00:00 PST,-0.001+0j,+0.0299725 +2020-01-03 22:30:00 PST,+0.01+0j,+0.029925 +2020-01-03 23:00:00 PST,-0.001+0j,+0.0304 +2020-01-03 23:30:00 PST,+0.01+0j,+0.0303525 +2020-01-04 00:00:00 PST,-0.001+0j,+0.0308275 +2020-01-04 00:30:00 PST,+0.01+0j,+0.03078 +2020-01-04 01:00:00 PST,-0.001+0j,+0.031255 +2020-01-04 01:30:00 PST,+0.01+0j,+0.0312075 +2020-01-04 02:00:00 PST,-0.001+0j,+0.0316825 +2020-01-04 02:30:00 PST,+0.01+0j,+0.031635 +2020-01-04 03:00:00 PST,-0.001+0j,+0.03211 +2020-01-04 03:30:00 PST,+0.01+0j,+0.0320625 +2020-01-04 04:00:00 PST,-0.001+0j,+0.0325375 +2020-01-04 04:30:00 PST,+0.01+0j,+0.03249 +2020-01-04 05:00:00 PST,-0.001+0j,+0.032965 +2020-01-04 05:30:00 PST,+0.01+0j,+0.0329175 +2020-01-04 06:00:00 PST,-0.001+0j,+0.0333925 +2020-01-04 06:30:00 PST,+0.01+0j,+0.033345 +2020-01-04 07:00:00 PST,-0.001+0j,+0.03382 +2020-01-04 07:30:00 PST,+0.01+0j,+0.0337725 +2020-01-04 08:00:00 PST,-0.001+0j,+0.0342475 +2020-01-04 08:30:00 PST,+0.01+0j,+0.0342 +2020-01-04 09:00:00 PST,-0.001+0j,+0.034675 +2020-01-04 09:30:00 PST,+0.01+0j,+0.0346275 +2020-01-04 10:00:00 PST,-0.001+0j,+0.0351025 +2020-01-04 10:30:00 PST,+0.01+0j,+0.035055 +2020-01-04 11:00:00 PST,-0.001+0j,+0.03553 +2020-01-04 11:30:00 PST,+0.01+0j,+0.0354825 +2020-01-04 12:00:00 PST,-0.001+0j,+0.0359575 +2020-01-04 12:30:00 PST,+0.01+0j,+0.03591 +2020-01-04 13:00:00 PST,-0.001+0j,+0.036385 +2020-01-04 13:30:00 PST,+0.01+0j,+0.0363375 +2020-01-04 14:00:00 PST,-0.001+0j,+0.0368125 +2020-01-04 14:30:00 PST,+0.01+0j,+0.036765 +2020-01-04 15:00:00 PST,-0.001+0j,+0.03724 +2020-01-04 15:30:00 PST,+0.01+0j,+0.0371925 +2020-01-04 16:00:00 PST,-0.001+0j,+0.0376675 +2020-01-04 16:30:00 PST,+0.01+0j,+0.03762 +2020-01-04 17:00:00 PST,-0.001+0j,+0.038095 +2020-01-04 17:30:00 PST,+0.01+0j,+0.0380475 +2020-01-04 18:00:00 PST,-0.001+0j,+0.0385225 +2020-01-04 18:30:00 PST,+0.01+0j,+0.038475 +2020-01-04 19:00:00 PST,-0.001+0j,+0.03895 +2020-01-04 19:30:00 PST,+0.01+0j,+0.0389025 +2020-01-04 20:00:00 PST,-0.001+0j,+0.0393775 +2020-01-04 20:30:00 PST,+0.01+0j,+0.03933 +2020-01-04 21:00:00 PST,-0.001+0j,+0.039805 +2020-01-04 21:30:00 PST,+0.01+0j,+0.0397575 +2020-01-04 22:00:00 PST,-0.001+0j,+0.0402325 +2020-01-04 22:30:00 PST,+0.01+0j,+0.040185 +2020-01-04 23:00:00 PST,-0.001+0j,+0.04066 +2020-01-04 23:30:00 PST,+0.01+0j,+0.0406125 +2020-01-05 00:00:00 PST,-0.001+0j,+0.0410875 +2020-01-05 00:30:00 PST,+0.01+0j,+0.04104 +2020-01-05 01:00:00 PST,-0.001+0j,+0.041515 +2020-01-05 01:30:00 PST,+0.01+0j,+0.0414675 +2020-01-05 02:00:00 PST,-0.001+0j,+0.0419425 +2020-01-05 02:30:00 PST,+0.01+0j,+0.041895 +2020-01-05 03:00:00 PST,-0.001+0j,+0.04237 +2020-01-05 03:30:00 PST,+0.01+0j,+0.0423225 +2020-01-05 04:00:00 PST,-0.001+0j,+0.0427975 +2020-01-05 04:30:00 PST,+0.01+0j,+0.04275 +2020-01-05 05:00:00 PST,-0.001+0j,+0.043225 +2020-01-05 05:30:00 PST,+0.01+0j,+0.0431775 +2020-01-05 06:00:00 PST,-0.001+0j,+0.0436525 +2020-01-05 06:30:00 PST,+0.01+0j,+0.043605 +2020-01-05 07:00:00 PST,-0.001+0j,+0.04408 +2020-01-05 07:30:00 PST,+0.01+0j,+0.0440325 +2020-01-05 08:00:00 PST,-0.001+0j,+0.0445075 +2020-01-05 08:30:00 PST,+0.01+0j,+0.04446 +2020-01-05 09:00:00 PST,-0.001+0j,+0.044935 +2020-01-05 09:30:00 PST,+0.01+0j,+0.0448875 +2020-01-05 10:00:00 PST,-0.001+0j,+0.0453625 +2020-01-05 10:30:00 PST,+0.01+0j,+0.045315 +2020-01-05 11:00:00 PST,-0.001+0j,+0.04579 +2020-01-05 11:30:00 PST,+0.01+0j,+0.0457425 +2020-01-05 12:00:00 PST,-0.001+0j,+0.0462175 +2020-01-05 12:30:00 PST,+0.01+0j,+0.04617 +2020-01-05 13:00:00 PST,-0.001+0j,+0.046645 +2020-01-05 13:30:00 PST,+0.01+0j,+0.0465975 +2020-01-05 14:00:00 PST,-0.001+0j,+0.0470725 +2020-01-05 14:30:00 PST,+0.01+0j,+0.047025 +2020-01-05 15:00:00 PST,-0.001+0j,+0.0475 +2020-01-05 15:30:00 PST,+0.01+0j,+0.0474525 +2020-01-05 16:00:00 PST,-0.001+0j,+0.0479275 +2020-01-05 16:30:00 PST,+0.01+0j,+0.04788 +2020-01-05 17:00:00 PST,-0.001+0j,+0.048355 +2020-01-05 17:30:00 PST,+0.01+0j,+0.0483075 +2020-01-05 18:00:00 PST,-0.001+0j,+0.0487825 +2020-01-05 18:30:00 PST,+0.01+0j,+0.048735 +2020-01-05 19:00:00 PST,-0.001+0j,+0.04921 +2020-01-05 19:30:00 PST,+0.01+0j,+0.0491625 +2020-01-05 20:00:00 PST,-0.001+0j,+0.0496375 +2020-01-05 20:30:00 PST,+0.01+0j,+0.04959 +2020-01-05 21:00:00 PST,-0.001+0j,+0.050065 +2020-01-05 21:30:00 PST,+0.01+0j,+0.0500175 +2020-01-05 22:00:00 PST,-0.001+0j,+0.0504925 +2020-01-05 22:30:00 PST,+0.01+0j,+0.050445 +2020-01-05 23:00:00 PST,-0.001+0j,+0.05092 +2020-01-05 23:30:00 PST,+0.01+0j,+0.0508725 +2020-01-06 00:00:00 PST,-0.001+0j,+0.0513475 +2020-01-06 00:30:00 PST,+0.01+0j,+0.0513 +2020-01-06 01:00:00 PST,-0.001+0j,+0.051775 +2020-01-06 01:30:00 PST,+0.01+0j,+0.0517275 +2020-01-06 02:00:00 PST,-0.001+0j,+0.0522025 +2020-01-06 02:30:00 PST,+0.01+0j,+0.052155 +2020-01-06 03:00:00 PST,-0.001+0j,+0.05263 +2020-01-06 03:30:00 PST,+0.01+0j,+0.0525825 +2020-01-06 04:00:00 PST,-0.001+0j,+0.0530575 +2020-01-06 04:30:00 PST,+0.01+0j,+0.05301 +2020-01-06 05:00:00 PST,-0.001+0j,+0.053485 +2020-01-06 05:30:00 PST,+0.01+0j,+0.0534375 +2020-01-06 06:00:00 PST,-0.001+0j,+0.0539125 +2020-01-06 06:30:00 PST,+0.01+0j,+0.053865 +2020-01-06 07:00:00 PST,-0.001+0j,+0.05434 +2020-01-06 07:30:00 PST,+0.01+0j,+0.0542925 +2020-01-06 08:00:00 PST,-0.001+0j,+0.0547675 +2020-01-06 08:30:00 PST,+0.01+0j,+0.05472 +2020-01-06 09:00:00 PST,-0.001+0j,+0.055195 +2020-01-06 09:30:00 PST,+0.01+0j,+0.0551475 +2020-01-06 10:00:00 PST,-0.001+0j,+0.0556225 +2020-01-06 10:30:00 PST,+0.01+0j,+0.055575 +2020-01-06 11:00:00 PST,-0.001+0j,+0.05605 +2020-01-06 11:30:00 PST,+0.01+0j,+0.0560025 +2020-01-06 12:00:00 PST,-0.001+0j,+0.0564775 +2020-01-06 12:30:00 PST,+0.01+0j,+0.05643 +2020-01-06 13:00:00 PST,-0.001+0j,+0.056905 +2020-01-06 13:30:00 PST,+0.01+0j,+0.0568575 +2020-01-06 14:00:00 PST,-0.001+0j,+0.0573325 +2020-01-06 14:30:00 PST,+0.01+0j,+0.057285 +2020-01-06 15:00:00 PST,-0.001+0j,+0.05776 +2020-01-06 15:30:00 PST,+0.01+0j,+0.0577125 +2020-01-06 16:00:00 PST,-0.001+0j,+0.0581875 +2020-01-06 16:30:00 PST,+0.01+0j,+0.05814 +2020-01-06 17:00:00 PST,-0.001+0j,+0.058615 +2020-01-06 17:30:00 PST,+0.01+0j,+0.0585675 +2020-01-06 18:00:00 PST,-0.001+0j,+0.0590425 +2020-01-06 18:30:00 PST,+0.01+0j,+0.058995 +2020-01-06 19:00:00 PST,-0.001+0j,+0.05947 +2020-01-06 19:30:00 PST,+0.01+0j,+0.0594225 +2020-01-06 20:00:00 PST,-0.001+0j,+0.0598975 +2020-01-06 20:30:00 PST,+0.01+0j,+0.05985 +2020-01-06 21:00:00 PST,-0.001+0j,+0.060325 +2020-01-06 21:30:00 PST,+0.01+0j,+0.0602775 +2020-01-06 22:00:00 PST,-0.001+0j,+0.0607525 +2020-01-06 22:30:00 PST,+0.01+0j,+0.060705 +2020-01-06 23:00:00 PST,-0.001+0j,+0.06118 +2020-01-06 23:30:00 PST,+0.01+0j,+0.0611325 +2020-01-07 00:00:00 PST,-0.001+0j,+0.0616075 +2020-01-07 00:30:00 PST,+0.01+0j,+0.06156 +2020-01-07 01:00:00 PST,-0.001+0j,+0.062035 +2020-01-07 01:30:00 PST,+0.01+0j,+0.0619875 +2020-01-07 02:00:00 PST,-0.001+0j,+0.0624625 +2020-01-07 02:30:00 PST,+0.01+0j,+0.062415 +2020-01-07 03:00:00 PST,-0.001+0j,+0.06289 +2020-01-07 03:30:00 PST,+0.01+0j,+0.0628425 +2020-01-07 04:00:00 PST,-0.001+0j,+0.0633175 +2020-01-07 04:30:00 PST,+0.01+0j,+0.06327 +2020-01-07 05:00:00 PST,-0.001+0j,+0.063745 +2020-01-07 05:30:00 PST,+0.01+0j,+0.0636975 +2020-01-07 06:00:00 PST,-0.001+0j,+0.0641725 +2020-01-07 06:30:00 PST,+0.01+0j,+0.064125 +2020-01-07 07:00:00 PST,-0.001+0j,+0.0646 +2020-01-07 07:30:00 PST,+0.01+0j,+0.0645525 +2020-01-07 08:00:00 PST,-0.001+0j,+0.0650275 +2020-01-07 08:30:00 PST,+0.01+0j,+0.06498 +2020-01-07 09:00:00 PST,-0.001+0j,+0.065455 +2020-01-07 09:30:00 PST,+0.01+0j,+0.0654075 +2020-01-07 10:00:00 PST,-0.001+0j,+0.0658825 +2020-01-07 10:30:00 PST,+0.01+0j,+0.065835 +2020-01-07 11:00:00 PST,-0.001+0j,+0.06631 +2020-01-07 11:30:00 PST,+0.01+0j,+0.0662625 +2020-01-07 12:00:00 PST,-0.001+0j,+0.0667375 +2020-01-07 12:30:00 PST,+0.01+0j,+0.06669 +2020-01-07 13:00:00 PST,-0.001+0j,+0.067165 +2020-01-07 13:30:00 PST,+0.01+0j,+0.0671175 +2020-01-07 14:00:00 PST,-0.001+0j,+0.0675925 +2020-01-07 14:30:00 PST,+0.01+0j,+0.067545 +2020-01-07 15:00:00 PST,-0.001+0j,+0.06802 +2020-01-07 15:30:00 PST,+0.01+0j,+0.0679725 +2020-01-07 16:00:00 PST,-0.001+0j,+0.0684475 +2020-01-07 16:30:00 PST,+0.01+0j,+0.0684 +2020-01-07 17:00:00 PST,-0.001+0j,+0.068875 +2020-01-07 17:30:00 PST,+0.01+0j,+0.0688275 +2020-01-07 18:00:00 PST,-0.001+0j,+0.0693025 +2020-01-07 18:30:00 PST,+0.01+0j,+0.069255 +2020-01-07 19:00:00 PST,-0.001+0j,+0.06973 +2020-01-07 19:30:00 PST,+0.01+0j,+0.0696825 +2020-01-07 20:00:00 PST,-0.001+0j,+0.0701575 +2020-01-07 20:30:00 PST,+0.01+0j,+0.07011 +2020-01-07 21:00:00 PST,-0.001+0j,+0.070585 +2020-01-07 21:30:00 PST,+0.01+0j,+0.0705375 +2020-01-07 22:00:00 PST,-0.001+0j,+0.0710125 +2020-01-07 22:30:00 PST,+0.01+0j,+0.070965 +2020-01-07 23:00:00 PST,-0.001+0j,+0.07144 +2020-01-07 23:30:00 PST,+0.01+0j,+0.0713925 +2020-01-08 00:00:00 PST,-0.001+0j,+0.0718675 +2020-01-08 00:30:00 PST,+0.01+0j,+0.07182 +2020-01-08 01:00:00 PST,-0.001+0j,+0.072295 +2020-01-08 01:30:00 PST,+0.01+0j,+0.0722475 +2020-01-08 02:00:00 PST,-0.001+0j,+0.0727225 +2020-01-08 02:30:00 PST,+0.01+0j,+0.072675 +2020-01-08 03:00:00 PST,-0.001+0j,+0.07315 +2020-01-08 03:30:00 PST,+0.01+0j,+0.0731025 +2020-01-08 04:00:00 PST,-0.001+0j,+0.0735775 +2020-01-08 04:30:00 PST,+0.01+0j,+0.07353 +2020-01-08 05:00:00 PST,-0.001+0j,+0.074005 +2020-01-08 05:30:00 PST,+0.01+0j,+0.0739575 +2020-01-08 06:00:00 PST,-0.001+0j,+0.0744325 +2020-01-08 06:30:00 PST,+0.01+0j,+0.074385 +2020-01-08 07:00:00 PST,-0.001+0j,+0.07486 +2020-01-08 07:30:00 PST,+0.01+0j,+0.0748125 +2020-01-08 08:00:00 PST,-0.001+0j,+0.0752875 +2020-01-08 08:30:00 PST,+0.01+0j,+0.07524 +2020-01-08 09:00:00 PST,-0.001+0j,+0.075715 +2020-01-08 09:30:00 PST,+0.01+0j,+0.0756675 +2020-01-08 10:00:00 PST,-0.001+0j,+0.0761425 +2020-01-08 10:30:00 PST,+0.01+0j,+0.076095 +2020-01-08 11:00:00 PST,-0.001+0j,+0.07657 +2020-01-08 11:30:00 PST,+0.01+0j,+0.0765225 +2020-01-08 12:00:00 PST,-0.001+0j,+0.0769975 +2020-01-08 12:30:00 PST,+0.01+0j,+0.07695 +2020-01-08 13:00:00 PST,-0.001+0j,+0.077425 +2020-01-08 13:30:00 PST,+0.01+0j,+0.0773775 +2020-01-08 14:00:00 PST,-0.001+0j,+0.0778525 +2020-01-08 14:30:00 PST,+0.01+0j,+0.077805 +2020-01-08 15:00:00 PST,-0.001+0j,+0.07828 +2020-01-08 15:30:00 PST,+0.01+0j,+0.0782325 +2020-01-08 16:00:00 PST,-0.001+0j,+0.0787075 +2020-01-08 16:30:00 PST,+0.01+0j,+0.07866 +2020-01-08 17:00:00 PST,-0.001+0j,+0.079135 +2020-01-08 17:30:00 PST,+0.01+0j,+0.0790875 +2020-01-08 18:00:00 PST,-0.001+0j,+0.0795625 +2020-01-08 18:30:00 PST,+0.01+0j,+0.079515 +2020-01-08 19:00:00 PST,-0.001+0j,+0.07999 +2020-01-08 19:30:00 PST,+0.01+0j,+0.0799425 +2020-01-08 20:00:00 PST,-0.001+0j,+0.0804175 +2020-01-08 20:30:00 PST,+0.01+0j,+0.08037 +2020-01-08 21:00:00 PST,-0.001+0j,+0.080845 +2020-01-08 21:30:00 PST,+0.01+0j,+0.0807975 +2020-01-08 22:00:00 PST,-0.001+0j,+0.0812725 +2020-01-08 22:30:00 PST,+0.01+0j,+0.081225 +2020-01-08 23:00:00 PST,-0.001+0j,+0.0817 +2020-01-08 23:30:00 PST,+0.01+0j,+0.0816525 +2020-01-09 00:00:00 PST,-0.001+0j,+0.0821275 +2020-01-09 00:30:00 PST,+0.01+0j,+0.08208 +2020-01-09 01:00:00 PST,-0.001+0j,+0.082555 +2020-01-09 01:30:00 PST,+0.01+0j,+0.0825075 +2020-01-09 02:00:00 PST,-0.001+0j,+0.0829825 +2020-01-09 02:30:00 PST,+0.01+0j,+0.082935 +2020-01-09 03:00:00 PST,-0.001+0j,+0.08341 +2020-01-09 03:30:00 PST,+0.01+0j,+0.0833625 +2020-01-09 04:00:00 PST,-0.001+0j,+0.0838375 +2020-01-09 04:30:00 PST,+0.01+0j,+0.08379 +2020-01-09 05:00:00 PST,-0.001+0j,+0.084265 +2020-01-09 05:30:00 PST,+0.01+0j,+0.0842175 +2020-01-09 06:00:00 PST,-0.001+0j,+0.0846925 +2020-01-09 06:30:00 PST,+0.01+0j,+0.084645 +2020-01-09 07:00:00 PST,-0.001+0j,+0.08512 +2020-01-09 07:30:00 PST,+0.01+0j,+0.0850725 +2020-01-09 08:00:00 PST,-0.001+0j,+0.0855475 +2020-01-09 08:30:00 PST,+0.01+0j,+0.0855 +2020-01-09 09:00:00 PST,-0.001+0j,+0.085975 +2020-01-09 09:30:00 PST,+0.01+0j,+0.0859275 +2020-01-09 10:00:00 PST,-0.001+0j,+0.0864025 +2020-01-09 10:30:00 PST,+0.01+0j,+0.086355 +2020-01-09 11:00:00 PST,-0.001+0j,+0.08683 +2020-01-09 11:30:00 PST,+0.01+0j,+0.0867825 +2020-01-09 12:00:00 PST,-0.001+0j,+0.0872575 +2020-01-09 12:30:00 PST,+0.01+0j,+0.08721 +2020-01-09 13:00:00 PST,-0.001+0j,+0.087685 +2020-01-09 13:30:00 PST,+0.01+0j,+0.0876375 +2020-01-09 14:00:00 PST,-0.001+0j,+0.0881125 +2020-01-09 14:30:00 PST,+0.01+0j,+0.088065 +2020-01-09 15:00:00 PST,-0.001+0j,+0.08854 +2020-01-09 15:30:00 PST,+0.01+0j,+0.0884925 +2020-01-09 16:00:00 PST,-0.001+0j,+0.0889675 +2020-01-09 16:30:00 PST,+0.01+0j,+0.08892 +2020-01-09 17:00:00 PST,-0.001+0j,+0.089395 +2020-01-09 17:30:00 PST,+0.01+0j,+0.0893475 +2020-01-09 18:00:00 PST,-0.001+0j,+0.0898225 +2020-01-09 18:30:00 PST,+0.01+0j,+0.089775 +2020-01-09 19:00:00 PST,-0.001+0j,+0.09025 +2020-01-09 19:30:00 PST,+0.01+0j,+0.0902025 +2020-01-09 20:00:00 PST,-0.001+0j,+0.0906775 +2020-01-09 20:30:00 PST,+0.01+0j,+0.09063 +2020-01-09 21:00:00 PST,-0.001+0j,+0.091105 +2020-01-09 21:30:00 PST,+0.01+0j,+0.0910575 +2020-01-09 22:00:00 PST,-0.001+0j,+0.0915325 +2020-01-09 22:30:00 PST,+0.01+0j,+0.091485 +2020-01-09 23:00:00 PST,-0.001+0j,+0.09196 +2020-01-09 23:30:00 PST,+0.01+0j,+0.0919125 +2020-01-10 00:00:00 PST,-0.001+0j,+0.0923875 +2020-01-10 00:30:00 PST,+0.01+0j,+0.09234 +2020-01-10 01:00:00 PST,-0.001+0j,+0.092815 +2020-01-10 01:30:00 PST,+0.01+0j,+0.0927675 +2020-01-10 02:00:00 PST,-0.001+0j,+0.0932425 +2020-01-10 02:30:00 PST,+0.01+0j,+0.093195 +2020-01-10 03:00:00 PST,-0.001+0j,+0.09367 +2020-01-10 03:30:00 PST,+0.01+0j,+0.0936225 +2020-01-10 04:00:00 PST,-0.001+0j,+0.0940975 +2020-01-10 04:30:00 PST,+0.01+0j,+0.09405 +2020-01-10 05:00:00 PST,-0.001+0j,+0.094525 +2020-01-10 05:30:00 PST,+0.01+0j,+0.0944775 +2020-01-10 06:00:00 PST,-0.001+0j,+0.0949525 +2020-01-10 06:30:00 PST,+0.01+0j,+0.094905 +2020-01-10 07:00:00 PST,-0.001+0j,+0.09538 +2020-01-10 07:30:00 PST,+0.01+0j,+0.0953325 +2020-01-10 08:00:00 PST,-0.001+0j,+0.0958075 +2020-01-10 08:30:00 PST,+0.01+0j,+0.09576 +2020-01-10 09:00:00 PST,-0.001+0j,+0.096235 +2020-01-10 09:30:00 PST,+0.01+0j,+0.0961875 +2020-01-10 10:00:00 PST,-0.001+0j,+0.0966625 +2020-01-10 10:30:00 PST,+0.01+0j,+0.096615 +2020-01-10 11:00:00 PST,-0.001+0j,+0.09709 +2020-01-10 11:30:00 PST,+0.01+0j,+0.0970425 +2020-01-10 12:00:00 PST,-0.001+0j,+0.0975175 +2020-01-10 12:30:00 PST,+0.01+0j,+0.09747 +2020-01-10 13:00:00 PST,-0.001+0j,+0.097945 +2020-01-10 13:30:00 PST,+0.01+0j,+0.0978975 +2020-01-10 14:00:00 PST,-0.001+0j,+0.0983725 +2020-01-10 14:30:00 PST,+0.01+0j,+0.098325 +2020-01-10 15:00:00 PST,-0.001+0j,+0.0988 +2020-01-10 15:30:00 PST,+0.01+0j,+0.0987525 +2020-01-10 16:00:00 PST,-0.001+0j,+0.0992275 +2020-01-10 16:30:00 PST,+0.01+0j,+0.09918 +2020-01-10 17:00:00 PST,-0.001+0j,+0.099655 +2020-01-10 17:30:00 PST,+0.01+0j,+0.0996075 +2020-01-10 18:00:00 PST,-0.001+0j,+0.100083 +2020-01-10 18:30:00 PST,+0.01+0j,+0.100035 +2020-01-10 19:00:00 PST,-0.001+0j,+0.10051 +2020-01-10 19:30:00 PST,+0.01+0j,+0.100463 +2020-01-10 20:00:00 PST,-0.001+0j,+0.100938 +2020-01-10 20:30:00 PST,+0.01+0j,+0.10089 +2020-01-10 21:00:00 PST,-0.001+0j,+0.101365 +2020-01-10 21:30:00 PST,+0.01+0j,+0.101318 +2020-01-10 22:00:00 PST,-0.001+0j,+0.101793 +2020-01-10 22:30:00 PST,+0.01+0j,+0.101745 +2020-01-10 23:00:00 PST,-0.001+0j,+0.10222 +2020-01-10 23:30:00 PST,+0.01+0j,+0.102173 +2020-01-11 00:00:00 PST,-0.001+0j,+0.102648 +2020-01-11 00:30:00 PST,+0.01+0j,+0.1026 +2020-01-11 01:00:00 PST,-0.001+0j,+0.103075 +2020-01-11 01:30:00 PST,+0.01+0j,+0.103028 +2020-01-11 02:00:00 PST,-0.001+0j,+0.103503 +2020-01-11 02:30:00 PST,+0.01+0j,+0.103455 +2020-01-11 03:00:00 PST,-0.001+0j,+0.10393 +2020-01-11 03:30:00 PST,+0.01+0j,+0.103883 +2020-01-11 04:00:00 PST,-0.001+0j,+0.104358 +2020-01-11 04:30:00 PST,+0.01+0j,+0.10431 +2020-01-11 05:00:00 PST,-0.001+0j,+0.104785 +2020-01-11 05:30:00 PST,+0.01+0j,+0.104738 +2020-01-11 06:00:00 PST,-0.001+0j,+0.105213 +2020-01-11 06:30:00 PST,+0.01+0j,+0.105165 +2020-01-11 07:00:00 PST,-0.001+0j,+0.10564 +2020-01-11 07:30:00 PST,+0.01+0j,+0.105593 +2020-01-11 08:00:00 PST,-0.001+0j,+0.106068 +2020-01-11 08:30:00 PST,+0.01+0j,+0.10602 +2020-01-11 09:00:00 PST,-0.001+0j,+0.106495 +2020-01-11 09:30:00 PST,+0.01+0j,+0.106448 +2020-01-11 10:00:00 PST,-0.001+0j,+0.106923 +2020-01-11 10:30:00 PST,+0.01+0j,+0.106875 +2020-01-11 11:00:00 PST,-0.001+0j,+0.10735 +2020-01-11 11:30:00 PST,+0.01+0j,+0.107303 +2020-01-11 12:00:00 PST,-0.001+0j,+0.107778 +2020-01-11 12:30:00 PST,+0.01+0j,+0.10773 +2020-01-11 13:00:00 PST,-0.001+0j,+0.108205 +2020-01-11 13:30:00 PST,+0.01+0j,+0.108158 +2020-01-11 14:00:00 PST,-0.001+0j,+0.108633 +2020-01-11 14:30:00 PST,+0.01+0j,+0.108585 +2020-01-11 15:00:00 PST,-0.001+0j,+0.10906 +2020-01-11 15:30:00 PST,+0.01+0j,+0.109013 +2020-01-11 16:00:00 PST,-0.001+0j,+0.109488 +2020-01-11 16:30:00 PST,+0.01+0j,+0.10944 +2020-01-11 17:00:00 PST,-0.001+0j,+0.109915 +2020-01-11 17:30:00 PST,+0.01+0j,+0.109868 +2020-01-11 18:00:00 PST,-0.001+0j,+0.110343 +2020-01-11 18:30:00 PST,+0.01+0j,+0.110295 +2020-01-11 19:00:00 PST,-0.001+0j,+0.11077 +2020-01-11 19:30:00 PST,+0.01+0j,+0.110723 +2020-01-11 20:00:00 PST,-0.001+0j,+0.111198 +2020-01-11 20:30:00 PST,+0.01+0j,+0.11115 +2020-01-11 21:00:00 PST,-0.001+0j,+0.111625 +2020-01-11 21:30:00 PST,+0.01+0j,+0.111578 +2020-01-11 22:00:00 PST,-0.001+0j,+0.112053 +2020-01-11 22:30:00 PST,+0.01+0j,+0.112005 +2020-01-11 23:00:00 PST,-0.001+0j,+0.11248 +2020-01-11 23:30:00 PST,+0.01+0j,+0.112433 +2020-01-12 00:00:00 PST,-0.001+0j,+0.112908 +2020-01-12 00:30:00 PST,+0.01+0j,+0.11286 +2020-01-12 01:00:00 PST,-0.001+0j,+0.113335 +2020-01-12 01:30:00 PST,+0.01+0j,+0.113288 +2020-01-12 02:00:00 PST,-0.001+0j,+0.113763 +2020-01-12 02:30:00 PST,+0.01+0j,+0.113715 +2020-01-12 03:00:00 PST,-0.001+0j,+0.11419 +2020-01-12 03:30:00 PST,+0.01+0j,+0.114143 +2020-01-12 04:00:00 PST,-0.001+0j,+0.114618 +2020-01-12 04:30:00 PST,+0.01+0j,+0.11457 +2020-01-12 05:00:00 PST,-0.001+0j,+0.115045 +2020-01-12 05:30:00 PST,+0.01+0j,+0.114998 +2020-01-12 06:00:00 PST,-0.001+0j,+0.115473 +2020-01-12 06:30:00 PST,+0.01+0j,+0.115425 +2020-01-12 07:00:00 PST,-0.001+0j,+0.1159 +2020-01-12 07:30:00 PST,+0.01+0j,+0.115853 +2020-01-12 08:00:00 PST,-0.001+0j,+0.116328 +2020-01-12 08:30:00 PST,+0.01+0j,+0.11628 +2020-01-12 09:00:00 PST,-0.001+0j,+0.116755 +2020-01-12 09:30:00 PST,+0.01+0j,+0.116708 +2020-01-12 10:00:00 PST,-0.001+0j,+0.117183 +2020-01-12 10:30:00 PST,+0.01+0j,+0.117135 +2020-01-12 11:00:00 PST,-0.001+0j,+0.11761 +2020-01-12 11:30:00 PST,+0.01+0j,+0.117563 +2020-01-12 12:00:00 PST,-0.001+0j,+0.118038 +2020-01-12 12:30:00 PST,+0.01+0j,+0.11799 +2020-01-12 13:00:00 PST,-0.001+0j,+0.118465 +2020-01-12 13:30:00 PST,+0.01+0j,+0.118418 +2020-01-12 14:00:00 PST,-0.001+0j,+0.118893 +2020-01-12 14:30:00 PST,+0.01+0j,+0.118845 +2020-01-12 15:00:00 PST,-0.001+0j,+0.11932 +2020-01-12 15:30:00 PST,+0.01+0j,+0.119273 +2020-01-12 16:00:00 PST,-0.001+0j,+0.119748 +2020-01-12 16:30:00 PST,+0.01+0j,+0.1197 +2020-01-12 17:00:00 PST,-0.001+0j,+0.120175 +2020-01-12 17:30:00 PST,+0.01+0j,+0.120128 +2020-01-12 18:00:00 PST,-0.001+0j,+0.120603 +2020-01-12 18:30:00 PST,+0.01+0j,+0.120555 +2020-01-12 19:00:00 PST,-0.001+0j,+0.12103 +2020-01-12 19:30:00 PST,+0.01+0j,+0.120983 +2020-01-12 20:00:00 PST,-0.001+0j,+0.121458 +2020-01-12 20:30:00 PST,+0.01+0j,+0.12141 +2020-01-12 21:00:00 PST,-0.001+0j,+0.121885 +2020-01-12 21:30:00 PST,+0.01+0j,+0.121838 +2020-01-12 22:00:00 PST,-0.001+0j,+0.122313 +2020-01-12 22:30:00 PST,+0.01+0j,+0.122265 +2020-01-12 23:00:00 PST,-0.001+0j,+0.12274 +2020-01-12 23:30:00 PST,+0.01+0j,+0.122693 +2020-01-13 00:00:00 PST,-0.001+0j,+0.123168 +2020-01-13 00:30:00 PST,+0.01+0j,+0.12312 +2020-01-13 01:00:00 PST,-0.001+0j,+0.123595 +2020-01-13 01:30:00 PST,+0.01+0j,+0.123548 +2020-01-13 02:00:00 PST,-0.001+0j,+0.124023 +2020-01-13 02:30:00 PST,+0.01+0j,+0.123975 +2020-01-13 03:00:00 PST,-0.001+0j,+0.12445 +2020-01-13 03:30:00 PST,+0.01+0j,+0.124403 +2020-01-13 04:00:00 PST,-0.001+0j,+0.124878 +2020-01-13 04:30:00 PST,+0.01+0j,+0.12483 +2020-01-13 05:00:00 PST,-0.001+0j,+0.125305 +2020-01-13 05:30:00 PST,+0.01+0j,+0.125258 +2020-01-13 06:00:00 PST,-0.001+0j,+0.125733 +2020-01-13 06:30:00 PST,+0.01+0j,+0.125685 +2020-01-13 07:00:00 PST,-0.001+0j,+0.12616 +2020-01-13 07:30:00 PST,+0.01+0j,+0.126113 +2020-01-13 08:00:00 PST,-0.001+0j,+0.126588 +2020-01-13 08:30:00 PST,+0.01+0j,+0.12654 +2020-01-13 09:00:00 PST,-0.001+0j,+0.127015 +2020-01-13 09:30:00 PST,+0.01+0j,+0.126968 +2020-01-13 10:00:00 PST,-0.001+0j,+0.127443 +2020-01-13 10:30:00 PST,+0.01+0j,+0.127395 +2020-01-13 11:00:00 PST,-0.001+0j,+0.12787 +2020-01-13 11:30:00 PST,+0.01+0j,+0.127823 +2020-01-13 12:00:00 PST,-0.001+0j,+0.128298 +2020-01-13 12:30:00 PST,+0.01+0j,+0.12825 +2020-01-13 13:00:00 PST,-0.001+0j,+0.128725 +2020-01-13 13:30:00 PST,+0.01+0j,+0.128678 +2020-01-13 14:00:00 PST,-0.001+0j,+0.129153 +2020-01-13 14:30:00 PST,+0.01+0j,+0.129105 +2020-01-13 15:00:00 PST,-0.001+0j,+0.12958 +2020-01-13 15:30:00 PST,+0.01+0j,+0.129533 +2020-01-13 16:00:00 PST,-0.001+0j,+0.130008 +2020-01-13 16:30:00 PST,+0.01+0j,+0.12996 +2020-01-13 17:00:00 PST,-0.001+0j,+0.130435 +2020-01-13 17:30:00 PST,+0.01+0j,+0.130388 +2020-01-13 18:00:00 PST,-0.001+0j,+0.130863 +2020-01-13 18:30:00 PST,+0.01+0j,+0.130815 +2020-01-13 19:00:00 PST,-0.001+0j,+0.13129 +2020-01-13 19:30:00 PST,+0.01+0j,+0.131243 +2020-01-13 20:00:00 PST,-0.001+0j,+0.131718 +2020-01-13 20:30:00 PST,+0.01+0j,+0.13167 +2020-01-13 21:00:00 PST,-0.001+0j,+0.132145 +2020-01-13 21:30:00 PST,+0.01+0j,+0.132098 +2020-01-13 22:00:00 PST,-0.001+0j,+0.132573 +2020-01-13 22:30:00 PST,+0.01+0j,+0.132525 +2020-01-13 23:00:00 PST,-0.001+0j,+0.133 +2020-01-13 23:30:00 PST,+0.01+0j,+0.132953 +2020-01-14 00:00:00 PST,-0.001+0j,+0.133428 +2020-01-14 00:30:00 PST,+0.01+0j,+0.13338 +2020-01-14 01:00:00 PST,-0.001+0j,+0.133855 +2020-01-14 01:30:00 PST,+0.01+0j,+0.133808 +2020-01-14 02:00:00 PST,-0.001+0j,+0.134283 +2020-01-14 02:30:00 PST,+0.01+0j,+0.134235 +2020-01-14 03:00:00 PST,-0.001+0j,+0.13471 +2020-01-14 03:30:00 PST,+0.01+0j,+0.134663 +2020-01-14 04:00:00 PST,-0.001+0j,+0.135138 +2020-01-14 04:30:00 PST,+0.01+0j,+0.13509 +2020-01-14 05:00:00 PST,-0.001+0j,+0.135565 +2020-01-14 05:30:00 PST,+0.01+0j,+0.135518 +2020-01-14 06:00:00 PST,-0.001+0j,+0.135993 +2020-01-14 06:30:00 PST,+0.01+0j,+0.135945 +2020-01-14 07:00:00 PST,-0.001+0j,+0.13642 +2020-01-14 07:30:00 PST,+0.01+0j,+0.136373 +2020-01-14 08:00:00 PST,-0.001+0j,+0.136848 +2020-01-14 08:30:00 PST,+0.01+0j,+0.1368 +2020-01-14 09:00:00 PST,-0.001+0j,+0.137275 +2020-01-14 09:30:00 PST,+0.01+0j,+0.137228 +2020-01-14 10:00:00 PST,-0.001+0j,+0.137703 +2020-01-14 10:30:00 PST,+0.01+0j,+0.137655 +2020-01-14 11:00:00 PST,-0.001+0j,+0.13813 +2020-01-14 11:30:00 PST,+0.01+0j,+0.138083 +2020-01-14 12:00:00 PST,-0.001+0j,+0.138558 +2020-01-14 12:30:00 PST,+0.01+0j,+0.13851 +2020-01-14 13:00:00 PST,-0.001+0j,+0.138985 +2020-01-14 13:30:00 PST,+0.01+0j,+0.138938 +2020-01-14 14:00:00 PST,-0.001+0j,+0.139413 +2020-01-14 14:30:00 PST,+0.01+0j,+0.139365 +2020-01-14 15:00:00 PST,-0.001+0j,+0.13984 +2020-01-14 15:30:00 PST,+0.01+0j,+0.139793 +2020-01-14 16:00:00 PST,-0.001+0j,+0.140268 +2020-01-14 16:30:00 PST,+0.01+0j,+0.14022 +2020-01-14 17:00:00 PST,-0.001+0j,+0.140695 +2020-01-14 17:30:00 PST,+0.01+0j,+0.140648 +2020-01-14 18:00:00 PST,-0.001+0j,+0.141123 +2020-01-14 18:30:00 PST,+0.01+0j,+0.141075 +2020-01-14 19:00:00 PST,-0.001+0j,+0.14155 +2020-01-14 19:30:00 PST,+0.01+0j,+0.141503 +2020-01-14 20:00:00 PST,-0.001+0j,+0.141978 +2020-01-14 20:30:00 PST,+0.01+0j,+0.14193 +2020-01-14 21:00:00 PST,-0.001+0j,+0.142405 +2020-01-14 21:30:00 PST,+0.01+0j,+0.142358 +2020-01-14 22:00:00 PST,-0.001+0j,+0.142833 +2020-01-14 22:30:00 PST,+0.01+0j,+0.142785 +2020-01-14 23:00:00 PST,-0.001+0j,+0.14326 +2020-01-14 23:30:00 PST,+0.01+0j,+0.143213 +2020-01-15 00:00:00 PST,-0.001+0j,+0.143688 +2020-01-15 00:30:00 PST,+0.01+0j,+0.14364 +2020-01-15 01:00:00 PST,-0.001+0j,+0.144115 +2020-01-15 01:30:00 PST,+0.01+0j,+0.144068 +2020-01-15 02:00:00 PST,-0.001+0j,+0.144543 +2020-01-15 02:30:00 PST,+0.01+0j,+0.144495 +2020-01-15 03:00:00 PST,-0.001+0j,+0.14497 +2020-01-15 03:30:00 PST,+0.01+0j,+0.144923 +2020-01-15 04:00:00 PST,-0.001+0j,+0.145398 +2020-01-15 04:30:00 PST,+0.01+0j,+0.14535 +2020-01-15 05:00:00 PST,-0.001+0j,+0.145825 +2020-01-15 05:30:00 PST,+0.01+0j,+0.145778 +2020-01-15 06:00:00 PST,-0.001+0j,+0.146253 +2020-01-15 06:30:00 PST,+0.01+0j,+0.146205 +2020-01-15 07:00:00 PST,-0.001+0j,+0.14668 +2020-01-15 07:30:00 PST,+0.01+0j,+0.146633 +2020-01-15 08:00:00 PST,-0.001+0j,+0.147108 +2020-01-15 08:30:00 PST,+0.01+0j,+0.14706 +2020-01-15 09:00:00 PST,-0.001+0j,+0.147535 +2020-01-15 09:30:00 PST,+0.01+0j,+0.147488 +2020-01-15 10:00:00 PST,-0.001+0j,+0.147963 +2020-01-15 10:30:00 PST,+0.01+0j,+0.147915 +2020-01-15 11:00:00 PST,-0.001+0j,+0.14839 +2020-01-15 11:30:00 PST,+0.01+0j,+0.148343 +2020-01-15 12:00:00 PST,-0.001+0j,+0.148818 +2020-01-15 12:30:00 PST,+0.01+0j,+0.14877 +2020-01-15 13:00:00 PST,-0.001+0j,+0.149245 +2020-01-15 13:30:00 PST,+0.01+0j,+0.149198 +2020-01-15 14:00:00 PST,-0.001+0j,+0.149673 +2020-01-15 14:30:00 PST,+0.01+0j,+0.149625 +2020-01-15 15:00:00 PST,-0.001+0j,+0.1501 +2020-01-15 15:30:00 PST,+0.01+0j,+0.150053 +2020-01-15 16:00:00 PST,-0.001+0j,+0.150528 +2020-01-15 16:30:00 PST,+0.01+0j,+0.15048 +2020-01-15 17:00:00 PST,-0.001+0j,+0.150955 +2020-01-15 17:30:00 PST,+0.01+0j,+0.150908 +2020-01-15 18:00:00 PST,-0.001+0j,+0.151383 +2020-01-15 18:30:00 PST,+0.01+0j,+0.151335 +2020-01-15 19:00:00 PST,-0.001+0j,+0.15181 +2020-01-15 19:30:00 PST,+0.01+0j,+0.151763 +2020-01-15 20:00:00 PST,-0.001+0j,+0.152238 +2020-01-15 20:30:00 PST,+0.01+0j,+0.15219 +2020-01-15 21:00:00 PST,-0.001+0j,+0.152665 +2020-01-15 21:30:00 PST,+0.01+0j,+0.152618 +2020-01-15 22:00:00 PST,-0.001+0j,+0.153093 +2020-01-15 22:30:00 PST,+0.01+0j,+0.153045 +2020-01-15 23:00:00 PST,-0.001+0j,+0.15352 +2020-01-15 23:30:00 PST,+0.01+0j,+0.153473 +2020-01-16 00:00:00 PST,-0.001+0j,+0.153948 +2020-01-16 00:30:00 PST,+0.01+0j,+0.1539 +2020-01-16 01:00:00 PST,-0.001+0j,+0.154375 +2020-01-16 01:30:00 PST,+0.01+0j,+0.154328 +2020-01-16 02:00:00 PST,-0.001+0j,+0.154803 +2020-01-16 02:30:00 PST,+0.01+0j,+0.154755 +2020-01-16 03:00:00 PST,-0.001+0j,+0.15523 +2020-01-16 03:30:00 PST,+0.01+0j,+0.155183 +2020-01-16 04:00:00 PST,-0.001+0j,+0.155658 +2020-01-16 04:30:00 PST,+0.01+0j,+0.15561 +2020-01-16 05:00:00 PST,-0.001+0j,+0.156085 +2020-01-16 05:30:00 PST,+0.01+0j,+0.156038 +2020-01-16 06:00:00 PST,-0.001+0j,+0.156513 +2020-01-16 06:30:00 PST,+0.01+0j,+0.156465 +2020-01-16 07:00:00 PST,-0.001+0j,+0.15694 +2020-01-16 07:30:00 PST,+0.01+0j,+0.156893 +2020-01-16 08:00:00 PST,-0.001+0j,+0.157368 +2020-01-16 08:30:00 PST,+0.01+0j,+0.15732 +2020-01-16 09:00:00 PST,-0.001+0j,+0.157795 +2020-01-16 09:30:00 PST,+0.01+0j,+0.157748 +2020-01-16 10:00:00 PST,-0.001+0j,+0.158223 +2020-01-16 10:30:00 PST,+0.01+0j,+0.158175 +2020-01-16 11:00:00 PST,-0.001+0j,+0.15865 +2020-01-16 11:30:00 PST,+0.01+0j,+0.158603 +2020-01-16 12:00:00 PST,-0.001+0j,+0.159078 +2020-01-16 12:30:00 PST,+0.01+0j,+0.15903 +2020-01-16 13:00:00 PST,-0.001+0j,+0.159505 +2020-01-16 13:30:00 PST,+0.01+0j,+0.159458 +2020-01-16 14:00:00 PST,-0.001+0j,+0.159933 +2020-01-16 14:30:00 PST,+0.01+0j,+0.159885 +2020-01-16 15:00:00 PST,-0.001+0j,+0.16036 +2020-01-16 15:30:00 PST,+0.01+0j,+0.160313 +2020-01-16 16:00:00 PST,-0.001+0j,+0.160788 +2020-01-16 16:30:00 PST,+0.01+0j,+0.16074 +2020-01-16 17:00:00 PST,-0.001+0j,+0.161215 +2020-01-16 17:30:00 PST,+0.01+0j,+0.161168 +2020-01-16 18:00:00 PST,-0.001+0j,+0.161643 +2020-01-16 18:30:00 PST,+0.01+0j,+0.161595 +2020-01-16 19:00:00 PST,-0.001+0j,+0.16207 +2020-01-16 19:30:00 PST,+0.01+0j,+0.162023 +2020-01-16 20:00:00 PST,-0.001+0j,+0.162498 +2020-01-16 20:30:00 PST,+0.01+0j,+0.16245 +2020-01-16 21:00:00 PST,-0.001+0j,+0.162925 +2020-01-16 21:30:00 PST,+0.01+0j,+0.162878 +2020-01-16 22:00:00 PST,-0.001+0j,+0.163353 +2020-01-16 22:30:00 PST,+0.01+0j,+0.163305 +2020-01-16 23:00:00 PST,-0.001+0j,+0.16378 +2020-01-16 23:30:00 PST,+0.01+0j,+0.163733 +2020-01-17 00:00:00 PST,-0.001+0j,+0.164208 +2020-01-17 00:30:00 PST,+0.01+0j,+0.16416 +2020-01-17 01:00:00 PST,-0.001+0j,+0.164635 +2020-01-17 01:30:00 PST,+0.01+0j,+0.164588 +2020-01-17 02:00:00 PST,-0.001+0j,+0.165063 +2020-01-17 02:30:00 PST,+0.01+0j,+0.165015 +2020-01-17 03:00:00 PST,-0.001+0j,+0.16549 +2020-01-17 03:30:00 PST,+0.01+0j,+0.165443 +2020-01-17 04:00:00 PST,-0.001+0j,+0.165918 +2020-01-17 04:30:00 PST,+0.01+0j,+0.16587 +2020-01-17 05:00:00 PST,-0.001+0j,+0.166345 +2020-01-17 05:30:00 PST,+0.01+0j,+0.166298 +2020-01-17 06:00:00 PST,-0.001+0j,+0.166773 +2020-01-17 06:30:00 PST,+0.01+0j,+0.166725 +2020-01-17 07:00:00 PST,-0.001+0j,+0.1672 +2020-01-17 07:30:00 PST,+0.01+0j,+0.167153 +2020-01-17 08:00:00 PST,-0.001+0j,+0.167628 +2020-01-17 08:30:00 PST,+0.01+0j,+0.16758 +2020-01-17 09:00:00 PST,-0.001+0j,+0.168055 +2020-01-17 09:30:00 PST,+0.01+0j,+0.168008 +2020-01-17 10:00:00 PST,-0.001+0j,+0.168483 +2020-01-17 10:30:00 PST,+0.01+0j,+0.168435 +2020-01-17 11:00:00 PST,-0.001+0j,+0.16891 +2020-01-17 11:30:00 PST,+0.01+0j,+0.168863 +2020-01-17 12:00:00 PST,-0.001+0j,+0.169338 +2020-01-17 12:30:00 PST,+0.01+0j,+0.16929 +2020-01-17 13:00:00 PST,-0.001+0j,+0.169765 +2020-01-17 13:30:00 PST,+0.01+0j,+0.169718 +2020-01-17 14:00:00 PST,-0.001+0j,+0.170193 +2020-01-17 14:30:00 PST,+0.01+0j,+0.170145 +2020-01-17 15:00:00 PST,-0.001+0j,+0.17062 +2020-01-17 15:30:00 PST,+0.01+0j,+0.170573 +2020-01-17 16:00:00 PST,-0.001+0j,+0.171048 +2020-01-17 16:30:00 PST,+0.01+0j,+0.171 +2020-01-17 17:00:00 PST,-0.001+0j,+0.171475 +2020-01-17 17:30:00 PST,+0.01+0j,+0.171428 +2020-01-17 18:00:00 PST,-0.001+0j,+0.171903 +2020-01-17 18:30:00 PST,+0.01+0j,+0.171855 +2020-01-17 19:00:00 PST,-0.001+0j,+0.17233 +2020-01-17 19:30:00 PST,+0.01+0j,+0.172283 +2020-01-17 20:00:00 PST,-0.001+0j,+0.172758 +2020-01-17 20:30:00 PST,+0.01+0j,+0.17271 +2020-01-17 21:00:00 PST,-0.001+0j,+0.173185 +2020-01-17 21:30:00 PST,+0.01+0j,+0.173138 +2020-01-17 22:00:00 PST,-0.001+0j,+0.173613 +2020-01-17 22:30:00 PST,+0.01+0j,+0.173565 +2020-01-17 23:00:00 PST,-0.001+0j,+0.17404 +2020-01-17 23:30:00 PST,+0.01+0j,+0.173993 +2020-01-18 00:00:00 PST,-0.001+0j,+0.174468 +2020-01-18 00:30:00 PST,+0.01+0j,+0.17442 +2020-01-18 01:00:00 PST,-0.001+0j,+0.174895 +2020-01-18 01:30:00 PST,+0.01+0j,+0.174848 +2020-01-18 02:00:00 PST,-0.001+0j,+0.175323 +2020-01-18 02:30:00 PST,+0.01+0j,+0.175275 +2020-01-18 03:00:00 PST,-0.001+0j,+0.17575 +2020-01-18 03:30:00 PST,+0.01+0j,+0.175703 +2020-01-18 04:00:00 PST,-0.001+0j,+0.176178 +2020-01-18 04:30:00 PST,+0.01+0j,+0.17613 +2020-01-18 05:00:00 PST,-0.001+0j,+0.176605 +2020-01-18 05:30:00 PST,+0.01+0j,+0.176558 +2020-01-18 06:00:00 PST,-0.001+0j,+0.177033 +2020-01-18 06:30:00 PST,+0.01+0j,+0.176985 +2020-01-18 07:00:00 PST,-0.001+0j,+0.17746 +2020-01-18 07:30:00 PST,+0.01+0j,+0.177413 +2020-01-18 08:00:00 PST,-0.001+0j,+0.177888 +2020-01-18 08:30:00 PST,+0.01+0j,+0.17784 +2020-01-18 09:00:00 PST,-0.001+0j,+0.178315 +2020-01-18 09:30:00 PST,+0.01+0j,+0.178268 +2020-01-18 10:00:00 PST,-0.001+0j,+0.178743 +2020-01-18 10:30:00 PST,+0.01+0j,+0.178695 +2020-01-18 11:00:00 PST,-0.001+0j,+0.17917 +2020-01-18 11:30:00 PST,+0.01+0j,+0.179123 +2020-01-18 12:00:00 PST,-0.001+0j,+0.179598 +2020-01-18 12:30:00 PST,+0.01+0j,+0.17955 +2020-01-18 13:00:00 PST,-0.001+0j,+0.180025 +2020-01-18 13:30:00 PST,+0.01+0j,+0.179978 +2020-01-18 14:00:00 PST,-0.001+0j,+0.180453 +2020-01-18 14:30:00 PST,+0.01+0j,+0.180405 +2020-01-18 15:00:00 PST,-0.001+0j,+0.18088 +2020-01-18 15:30:00 PST,+0.01+0j,+0.180833 +2020-01-18 16:00:00 PST,-0.001+0j,+0.181308 +2020-01-18 16:30:00 PST,+0.01+0j,+0.18126 +2020-01-18 17:00:00 PST,-0.001+0j,+0.181735 +2020-01-18 17:30:00 PST,+0.01+0j,+0.181688 +2020-01-18 18:00:00 PST,-0.001+0j,+0.182163 +2020-01-18 18:30:00 PST,+0.01+0j,+0.182115 +2020-01-18 19:00:00 PST,-0.001+0j,+0.18259 +2020-01-18 19:30:00 PST,+0.01+0j,+0.182543 +2020-01-18 20:00:00 PST,-0.001+0j,+0.183018 +2020-01-18 20:30:00 PST,+0.01+0j,+0.18297 +2020-01-18 21:00:00 PST,-0.001+0j,+0.183445 +2020-01-18 21:30:00 PST,+0.01+0j,+0.183398 +2020-01-18 22:00:00 PST,-0.001+0j,+0.183873 +2020-01-18 22:30:00 PST,+0.01+0j,+0.183825 +2020-01-18 23:00:00 PST,-0.001+0j,+0.1843 +2020-01-18 23:30:00 PST,+0.01+0j,+0.184253 +2020-01-19 00:00:00 PST,-0.001+0j,+0.184728 +2020-01-19 00:30:00 PST,+0.01+0j,+0.18468 +2020-01-19 01:00:00 PST,-0.001+0j,+0.185155 +2020-01-19 01:30:00 PST,+0.01+0j,+0.185108 +2020-01-19 02:00:00 PST,-0.001+0j,+0.185583 +2020-01-19 02:30:00 PST,+0.01+0j,+0.185535 +2020-01-19 03:00:00 PST,-0.001+0j,+0.18601 +2020-01-19 03:30:00 PST,+0.01+0j,+0.185963 +2020-01-19 04:00:00 PST,-0.001+0j,+0.186438 +2020-01-19 04:30:00 PST,+0.01+0j,+0.18639 +2020-01-19 05:00:00 PST,-0.001+0j,+0.186865 +2020-01-19 05:30:00 PST,+0.01+0j,+0.186818 +2020-01-19 06:00:00 PST,-0.001+0j,+0.187293 +2020-01-19 06:30:00 PST,+0.01+0j,+0.187245 +2020-01-19 07:00:00 PST,-0.001+0j,+0.18772 +2020-01-19 07:30:00 PST,+0.01+0j,+0.187673 +2020-01-19 08:00:00 PST,-0.001+0j,+0.188148 +2020-01-19 08:30:00 PST,+0.01+0j,+0.1881 +2020-01-19 09:00:00 PST,-0.001+0j,+0.188575 +2020-01-19 09:30:00 PST,+0.01+0j,+0.188528 +2020-01-19 10:00:00 PST,-0.001+0j,+0.189003 +2020-01-19 10:30:00 PST,+0.01+0j,+0.188955 +2020-01-19 11:00:00 PST,-0.001+0j,+0.18943 +2020-01-19 11:30:00 PST,+0.01+0j,+0.189383 +2020-01-19 12:00:00 PST,-0.001+0j,+0.189858 +2020-01-19 12:30:00 PST,+0.01+0j,+0.18981 +2020-01-19 13:00:00 PST,-0.001+0j,+0.190285 +2020-01-19 13:30:00 PST,+0.01+0j,+0.190238 +2020-01-19 14:00:00 PST,-0.001+0j,+0.190713 +2020-01-19 14:30:00 PST,+0.01+0j,+0.190665 +2020-01-19 15:00:00 PST,-0.001+0j,+0.19114 +2020-01-19 15:30:00 PST,+0.01+0j,+0.191093 +2020-01-19 16:00:00 PST,-0.001+0j,+0.191568 +2020-01-19 16:30:00 PST,+0.01+0j,+0.19152 +2020-01-19 17:00:00 PST,-0.001+0j,+0.191995 +2020-01-19 17:30:00 PST,+0.01+0j,+0.191948 +2020-01-19 18:00:00 PST,-0.001+0j,+0.192423 +2020-01-19 18:30:00 PST,+0.01+0j,+0.192375 +2020-01-19 19:00:00 PST,-0.001+0j,+0.19285 +2020-01-19 19:30:00 PST,+0.01+0j,+0.192803 +2020-01-19 20:00:00 PST,-0.001+0j,+0.193278 +2020-01-19 20:30:00 PST,+0.01+0j,+0.19323 +2020-01-19 21:00:00 PST,-0.001+0j,+0.193705 +2020-01-19 21:30:00 PST,+0.01+0j,+0.193658 +2020-01-19 22:00:00 PST,-0.001+0j,+0.194133 +2020-01-19 22:30:00 PST,+0.01+0j,+0.194085 +2020-01-19 23:00:00 PST,-0.001+0j,+0.19456 +2020-01-19 23:30:00 PST,+0.01+0j,+0.194513 +2020-01-20 00:00:00 PST,-0.001+0j,+0.194988 +2020-01-20 00:30:00 PST,+0.01+0j,+0.19494 +2020-01-20 01:00:00 PST,-0.001+0j,+0.195415 +2020-01-20 01:30:00 PST,+0.01+0j,+0.195368 +2020-01-20 02:00:00 PST,-0.001+0j,+0.195843 +2020-01-20 02:30:00 PST,+0.01+0j,+0.195795 +2020-01-20 03:00:00 PST,-0.001+0j,+0.19627 +2020-01-20 03:30:00 PST,+0.01+0j,+0.196223 +2020-01-20 04:00:00 PST,-0.001+0j,+0.196698 +2020-01-20 04:30:00 PST,+0.01+0j,+0.19665 +2020-01-20 05:00:00 PST,-0.001+0j,+0.197125 +2020-01-20 05:30:00 PST,+0.01+0j,+0.197078 +2020-01-20 06:00:00 PST,-0.001+0j,+0.197553 +2020-01-20 06:30:00 PST,+0.01+0j,+0.197505 +2020-01-20 07:00:00 PST,-0.001+0j,+0.19798 +2020-01-20 07:30:00 PST,+0.01+0j,+0.197933 +2020-01-20 08:00:00 PST,-0.001+0j,+0.198408 +2020-01-20 08:30:00 PST,+0.01+0j,+0.19836 +2020-01-20 09:00:00 PST,-0.001+0j,+0.198835 +2020-01-20 09:30:00 PST,+0.01+0j,+0.198788 +2020-01-20 10:00:00 PST,-0.001+0j,+0.199263 +2020-01-20 10:30:00 PST,+0.01+0j,+0.199215 +2020-01-20 11:00:00 PST,-0.001+0j,+0.19969 +2020-01-20 11:30:00 PST,+0.01+0j,+0.199643 +2020-01-20 12:00:00 PST,-0.001+0j,+0.200118 +2020-01-20 12:30:00 PST,+0.01+0j,+0.20007 +2020-01-20 13:00:00 PST,-0.001+0j,+0.200545 +2020-01-20 13:30:00 PST,+0.01+0j,+0.200498 +2020-01-20 14:00:00 PST,-0.001+0j,+0.200973 +2020-01-20 14:30:00 PST,+0.01+0j,+0.200925 +2020-01-20 15:00:00 PST,-0.001+0j,+0.2014 +2020-01-20 15:30:00 PST,+0.01+0j,+0.201353 +2020-01-20 16:00:00 PST,-0.001+0j,+0.201828 +2020-01-20 16:30:00 PST,+0.01+0j,+0.20178 +2020-01-20 17:00:00 PST,-0.001+0j,+0.202255 +2020-01-20 17:30:00 PST,+0.01+0j,+0.202208 +2020-01-20 18:00:00 PST,-0.001+0j,+0.202683 +2020-01-20 18:30:00 PST,+0.01+0j,+0.202635 +2020-01-20 19:00:00 PST,-0.001+0j,+0.20311 +2020-01-20 19:30:00 PST,+0.01+0j,+0.203063 +2020-01-20 20:00:00 PST,-0.001+0j,+0.203538 +2020-01-20 20:30:00 PST,+0.01+0j,+0.20349 +2020-01-20 21:00:00 PST,-0.001+0j,+0.203965 +2020-01-20 21:30:00 PST,+0.01+0j,+0.203918 +2020-01-20 22:00:00 PST,-0.001+0j,+0.204393 +2020-01-20 22:30:00 PST,+0.01+0j,+0.204345 +2020-01-20 23:00:00 PST,-0.001+0j,+0.20482 +2020-01-20 23:30:00 PST,+0.01+0j,+0.204773 +2020-01-21 00:00:00 PST,-0.001+0j,+0.205248 +2020-01-21 00:30:00 PST,+0.01+0j,+0.2052 +2020-01-21 01:00:00 PST,-0.001+0j,+0.205675 +2020-01-21 01:30:00 PST,+0.01+0j,+0.205628 +2020-01-21 02:00:00 PST,-0.001+0j,+0.206103 +2020-01-21 02:30:00 PST,+0.01+0j,+0.206055 +2020-01-21 03:00:00 PST,-0.001+0j,+0.20653 +2020-01-21 03:30:00 PST,+0.01+0j,+0.206483 +2020-01-21 04:00:00 PST,-0.001+0j,+0.206958 +2020-01-21 04:30:00 PST,+0.01+0j,+0.20691 +2020-01-21 05:00:00 PST,-0.001+0j,+0.207385 +2020-01-21 05:30:00 PST,+0.01+0j,+0.207338 +2020-01-21 06:00:00 PST,-0.001+0j,+0.207813 +2020-01-21 06:30:00 PST,+0.01+0j,+0.207765 +2020-01-21 07:00:00 PST,-0.001+0j,+0.20824 +2020-01-21 07:30:00 PST,+0.01+0j,+0.208193 +2020-01-21 08:00:00 PST,-0.001+0j,+0.208668 +2020-01-21 08:30:00 PST,+0.01+0j,+0.20862 +2020-01-21 09:00:00 PST,-0.001+0j,+0.209095 +2020-01-21 09:30:00 PST,+0.01+0j,+0.209048 +2020-01-21 10:00:00 PST,-0.001+0j,+0.209523 +2020-01-21 10:30:00 PST,+0.01+0j,+0.209475 +2020-01-21 11:00:00 PST,-0.001+0j,+0.20995 +2020-01-21 11:30:00 PST,+0.01+0j,+0.209903 +2020-01-21 12:00:00 PST,-0.001+0j,+0.210378 +2020-01-21 12:30:00 PST,+0.01+0j,+0.21033 +2020-01-21 13:00:00 PST,-0.001+0j,+0.210805 +2020-01-21 13:30:00 PST,+0.01+0j,+0.210758 +2020-01-21 14:00:00 PST,-0.001+0j,+0.211233 +2020-01-21 14:30:00 PST,+0.01+0j,+0.211185 +2020-01-21 15:00:00 PST,-0.001+0j,+0.21166 +2020-01-21 15:30:00 PST,+0.01+0j,+0.211613 +2020-01-21 16:00:00 PST,-0.001+0j,+0.212088 +2020-01-21 16:30:00 PST,+0.01+0j,+0.21204 +2020-01-21 17:00:00 PST,-0.001+0j,+0.212515 +2020-01-21 17:30:00 PST,+0.01+0j,+0.212468 +2020-01-21 18:00:00 PST,-0.001+0j,+0.212943 +2020-01-21 18:30:00 PST,+0.01+0j,+0.212895 +2020-01-21 19:00:00 PST,-0.001+0j,+0.21337 +2020-01-21 19:30:00 PST,+0.01+0j,+0.213323 +2020-01-21 20:00:00 PST,-0.001+0j,+0.213798 +2020-01-21 20:30:00 PST,+0.01+0j,+0.21375 +2020-01-21 21:00:00 PST,-0.001+0j,+0.214225 +2020-01-21 21:30:00 PST,+0.01+0j,+0.214178 +2020-01-21 22:00:00 PST,-0.001+0j,+0.214653 +2020-01-21 22:30:00 PST,+0.01+0j,+0.214605 +2020-01-21 23:00:00 PST,-0.001+0j,+0.21508 +2020-01-21 23:30:00 PST,+0.01+0j,+0.215033 +2020-01-22 00:00:00 PST,-0.001+0j,+0.215508 +2020-01-22 00:30:00 PST,+0.01+0j,+0.21546 +2020-01-22 01:00:00 PST,-0.001+0j,+0.215935 +2020-01-22 01:30:00 PST,+0.01+0j,+0.215888 +2020-01-22 02:00:00 PST,-0.001+0j,+0.216363 +2020-01-22 02:30:00 PST,+0.01+0j,+0.216315 +2020-01-22 03:00:00 PST,-0.001+0j,+0.21679 +2020-01-22 03:30:00 PST,+0.01+0j,+0.216743 +2020-01-22 04:00:00 PST,-0.001+0j,+0.217218 +2020-01-22 04:30:00 PST,+0.01+0j,+0.21717 +2020-01-22 05:00:00 PST,-0.001+0j,+0.217645 +2020-01-22 05:30:00 PST,+0.01+0j,+0.217598 +2020-01-22 06:00:00 PST,-0.001+0j,+0.218073 +2020-01-22 06:30:00 PST,+0.01+0j,+0.218025 +2020-01-22 07:00:00 PST,-0.001+0j,+0.2185 +2020-01-22 07:30:00 PST,+0.01+0j,+0.218453 +2020-01-22 08:00:00 PST,-0.001+0j,+0.218928 +2020-01-22 08:30:00 PST,+0.01+0j,+0.21888 +2020-01-22 09:00:00 PST,-0.001+0j,+0.219355 +2020-01-22 09:30:00 PST,+0.01+0j,+0.219308 +2020-01-22 10:00:00 PST,-0.001+0j,+0.219783 +2020-01-22 10:30:00 PST,+0.01+0j,+0.219735 +2020-01-22 11:00:00 PST,-0.001+0j,+0.22021 +2020-01-22 11:30:00 PST,+0.01+0j,+0.220163 +2020-01-22 12:00:00 PST,-0.001+0j,+0.220638 +2020-01-22 12:30:00 PST,+0.01+0j,+0.22059 +2020-01-22 13:00:00 PST,-0.001+0j,+0.221065 +2020-01-22 13:30:00 PST,+0.01+0j,+0.221018 +2020-01-22 14:00:00 PST,-0.001+0j,+0.221493 +2020-01-22 14:30:00 PST,+0.01+0j,+0.221445 +2020-01-22 15:00:00 PST,-0.001+0j,+0.22192 +2020-01-22 15:30:00 PST,+0.01+0j,+0.221873 +2020-01-22 16:00:00 PST,-0.001+0j,+0.222348 +2020-01-22 16:30:00 PST,+0.01+0j,+0.2223 +2020-01-22 17:00:00 PST,-0.001+0j,+0.222775 +2020-01-22 17:30:00 PST,+0.01+0j,+0.222728 +2020-01-22 18:00:00 PST,-0.001+0j,+0.223203 +2020-01-22 18:30:00 PST,+0.01+0j,+0.223155 +2020-01-22 19:00:00 PST,-0.001+0j,+0.22363 +2020-01-22 19:30:00 PST,+0.01+0j,+0.223583 +2020-01-22 20:00:00 PST,-0.001+0j,+0.224058 +2020-01-22 20:30:00 PST,+0.01+0j,+0.22401 +2020-01-22 21:00:00 PST,-0.001+0j,+0.224485 +2020-01-22 21:30:00 PST,+0.01+0j,+0.224438 +2020-01-22 22:00:00 PST,-0.001+0j,+0.224913 +2020-01-22 22:30:00 PST,+0.01+0j,+0.224865 +2020-01-22 23:00:00 PST,-0.001+0j,+0.22534 +2020-01-22 23:30:00 PST,+0.01+0j,+0.225293 +2020-01-23 00:00:00 PST,-0.001+0j,+0.225768 +2020-01-23 00:30:00 PST,+0.01+0j,+0.22572 +2020-01-23 01:00:00 PST,-0.001+0j,+0.226195 +2020-01-23 01:30:00 PST,+0.01+0j,+0.226148 +2020-01-23 02:00:00 PST,-0.001+0j,+0.226623 +2020-01-23 02:30:00 PST,+0.01+0j,+0.226575 +2020-01-23 03:00:00 PST,-0.001+0j,+0.22705 +2020-01-23 03:30:00 PST,+0.01+0j,+0.227003 +2020-01-23 04:00:00 PST,-0.001+0j,+0.227478 +2020-01-23 04:30:00 PST,+0.01+0j,+0.22743 +2020-01-23 05:00:00 PST,-0.001+0j,+0.227905 +2020-01-23 05:30:00 PST,+0.01+0j,+0.227858 +2020-01-23 06:00:00 PST,-0.001+0j,+0.228333 +2020-01-23 06:30:00 PST,+0.01+0j,+0.228285 +2020-01-23 07:00:00 PST,-0.001+0j,+0.22876 +2020-01-23 07:30:00 PST,+0.01+0j,+0.228713 +2020-01-23 08:00:00 PST,-0.001+0j,+0.229188 +2020-01-23 08:30:00 PST,+0.01+0j,+0.22914 +2020-01-23 09:00:00 PST,-0.001+0j,+0.229615 +2020-01-23 09:30:00 PST,+0.01+0j,+0.229568 +2020-01-23 10:00:00 PST,-0.001+0j,+0.230043 +2020-01-23 10:30:00 PST,+0.01+0j,+0.229995 +2020-01-23 11:00:00 PST,-0.001+0j,+0.23047 +2020-01-23 11:30:00 PST,+0.01+0j,+0.230423 +2020-01-23 12:00:00 PST,-0.001+0j,+0.230898 +2020-01-23 12:30:00 PST,+0.01+0j,+0.23085 +2020-01-23 13:00:00 PST,-0.001+0j,+0.231325 +2020-01-23 13:30:00 PST,+0.01+0j,+0.231278 +2020-01-23 14:00:00 PST,-0.001+0j,+0.231753 +2020-01-23 14:30:00 PST,+0.01+0j,+0.231705 +2020-01-23 15:00:00 PST,-0.001+0j,+0.23218 +2020-01-23 15:30:00 PST,+0.01+0j,+0.232133 +2020-01-23 16:00:00 PST,-0.001+0j,+0.232608 +2020-01-23 16:30:00 PST,+0.01+0j,+0.23256 +2020-01-23 17:00:00 PST,-0.001+0j,+0.233035 +2020-01-23 17:30:00 PST,+0.01+0j,+0.232988 +2020-01-23 18:00:00 PST,-0.001+0j,+0.233463 +2020-01-23 18:30:00 PST,+0.01+0j,+0.233415 +2020-01-23 19:00:00 PST,-0.001+0j,+0.23389 +2020-01-23 19:30:00 PST,+0.01+0j,+0.233843 +2020-01-23 20:00:00 PST,-0.001+0j,+0.234318 +2020-01-23 20:30:00 PST,+0.01+0j,+0.23427 +2020-01-23 21:00:00 PST,-0.001+0j,+0.234745 +2020-01-23 21:30:00 PST,+0.01+0j,+0.234698 +2020-01-23 22:00:00 PST,-0.001+0j,+0.235173 +2020-01-23 22:30:00 PST,+0.01+0j,+0.235125 +2020-01-23 23:00:00 PST,-0.001+0j,+0.2356 +2020-01-23 23:30:00 PST,+0.01+0j,+0.235553 +2020-01-24 00:00:00 PST,-0.001+0j,+0.236028 +2020-01-24 00:30:00 PST,+0.01+0j,+0.23598 +2020-01-24 01:00:00 PST,-0.001+0j,+0.236455 +2020-01-24 01:30:00 PST,+0.01+0j,+0.236408 +2020-01-24 02:00:00 PST,-0.001+0j,+0.236883 +2020-01-24 02:30:00 PST,+0.01+0j,+0.236835 +2020-01-24 03:00:00 PST,-0.001+0j,+0.23731 +2020-01-24 03:30:00 PST,+0.01+0j,+0.237263 +2020-01-24 04:00:00 PST,-0.001+0j,+0.237738 +2020-01-24 04:30:00 PST,+0.01+0j,+0.23769 +2020-01-24 05:00:00 PST,-0.001+0j,+0.238165 +2020-01-24 05:30:00 PST,+0.01+0j,+0.238118 +2020-01-24 06:00:00 PST,-0.001+0j,+0.238593 +2020-01-24 06:30:00 PST,+0.01+0j,+0.238545 +2020-01-24 07:00:00 PST,-0.001+0j,+0.23902 +2020-01-24 07:30:00 PST,+0.01+0j,+0.238973 +2020-01-24 08:00:00 PST,-0.001+0j,+0.239448 +2020-01-24 08:30:00 PST,+0.01+0j,+0.2394 +2020-01-24 09:00:00 PST,-0.001+0j,+0.239875 +2020-01-24 09:30:00 PST,+0.01+0j,+0.239828 +2020-01-24 10:00:00 PST,-0.001+0j,+0.240303 +2020-01-24 10:30:00 PST,+0.01+0j,+0.240255 +2020-01-24 11:00:00 PST,-0.001+0j,+0.24073 +2020-01-24 11:30:00 PST,+0.01+0j,+0.240683 +2020-01-24 12:00:00 PST,-0.001+0j,+0.241158 +2020-01-24 12:30:00 PST,+0.01+0j,+0.24111 +2020-01-24 13:00:00 PST,-0.001+0j,+0.241585 +2020-01-24 13:30:00 PST,+0.01+0j,+0.241538 +2020-01-24 14:00:00 PST,-0.001+0j,+0.242013 +2020-01-24 14:30:00 PST,+0.01+0j,+0.241965 +2020-01-24 15:00:00 PST,-0.001+0j,+0.24244 +2020-01-24 15:30:00 PST,+0.01+0j,+0.242393 +2020-01-24 16:00:00 PST,-0.001+0j,+0.242868 +2020-01-24 16:30:00 PST,+0.01+0j,+0.24282 +2020-01-24 17:00:00 PST,-0.001+0j,+0.243295 +2020-01-24 17:30:00 PST,+0.01+0j,+0.243248 +2020-01-24 18:00:00 PST,-0.001+0j,+0.243723 +2020-01-24 18:30:00 PST,+0.01+0j,+0.243675 +2020-01-24 19:00:00 PST,-0.001+0j,+0.24415 +2020-01-24 19:30:00 PST,+0.01+0j,+0.244103 +2020-01-24 20:00:00 PST,-0.001+0j,+0.244578 +2020-01-24 20:30:00 PST,+0.01+0j,+0.24453 +2020-01-24 21:00:00 PST,-0.001+0j,+0.245005 +2020-01-24 21:30:00 PST,+0.01+0j,+0.244958 +2020-01-24 22:00:00 PST,-0.001+0j,+0.245433 +2020-01-24 22:30:00 PST,+0.01+0j,+0.245385 +2020-01-24 23:00:00 PST,-0.001+0j,+0.24586 +2020-01-24 23:30:00 PST,+0.01+0j,+0.245813 +2020-01-25 00:00:00 PST,-0.001+0j,+0.246288 +2020-01-25 00:30:00 PST,+0.01+0j,+0.24624 +2020-01-25 01:00:00 PST,-0.001+0j,+0.246715 +2020-01-25 01:30:00 PST,+0.01+0j,+0.246668 +2020-01-25 02:00:00 PST,-0.001+0j,+0.247143 +2020-01-25 02:30:00 PST,+0.01+0j,+0.247095 +2020-01-25 03:00:00 PST,-0.001+0j,+0.24757 +2020-01-25 03:30:00 PST,+0.01+0j,+0.247523 +2020-01-25 04:00:00 PST,-0.001+0j,+0.247998 +2020-01-25 04:30:00 PST,+0.01+0j,+0.24795 +2020-01-25 05:00:00 PST,-0.001+0j,+0.248425 +2020-01-25 05:30:00 PST,+0.01+0j,+0.248378 +2020-01-25 06:00:00 PST,-0.001+0j,+0.248853 +2020-01-25 06:30:00 PST,+0.01+0j,+0.248805 +2020-01-25 07:00:00 PST,-0.001+0j,+0.24928 +2020-01-25 07:30:00 PST,+0.01+0j,+0.249233 +2020-01-25 08:00:00 PST,-0.001+0j,+0.249708 +2020-01-25 08:30:00 PST,+0.01+0j,+0.24966 +2020-01-25 09:00:00 PST,-0.001+0j,+0.250135 +2020-01-25 09:30:00 PST,+0.01+0j,+0.250088 +2020-01-25 10:00:00 PST,-0.001+0j,+0.250563 +2020-01-25 10:30:00 PST,+0.01+0j,+0.250515 +2020-01-25 11:00:00 PST,-0.001+0j,+0.25099 +2020-01-25 11:30:00 PST,+0.01+0j,+0.250943 +2020-01-25 12:00:00 PST,-0.001+0j,+0.251418 +2020-01-25 12:30:00 PST,+0.01+0j,+0.25137 +2020-01-25 13:00:00 PST,-0.001+0j,+0.251845 +2020-01-25 13:30:00 PST,+0.01+0j,+0.251798 +2020-01-25 14:00:00 PST,-0.001+0j,+0.252273 +2020-01-25 14:30:00 PST,+0.01+0j,+0.252225 +2020-01-25 15:00:00 PST,-0.001+0j,+0.2527 +2020-01-25 15:30:00 PST,+0.01+0j,+0.252653 +2020-01-25 16:00:00 PST,-0.001+0j,+0.253128 +2020-01-25 16:30:00 PST,+0.01+0j,+0.25308 +2020-01-25 17:00:00 PST,-0.001+0j,+0.253555 +2020-01-25 17:30:00 PST,+0.01+0j,+0.253508 +2020-01-25 18:00:00 PST,-0.001+0j,+0.253983 +2020-01-25 18:30:00 PST,+0.01+0j,+0.253935 +2020-01-25 19:00:00 PST,-0.001+0j,+0.25441 +2020-01-25 19:30:00 PST,+0.01+0j,+0.254363 +2020-01-25 20:00:00 PST,-0.001+0j,+0.254838 +2020-01-25 20:30:00 PST,+0.01+0j,+0.25479 +2020-01-25 21:00:00 PST,-0.001+0j,+0.255265 +2020-01-25 21:30:00 PST,+0.01+0j,+0.255218 +2020-01-25 22:00:00 PST,-0.001+0j,+0.255693 +2020-01-25 22:30:00 PST,+0.01+0j,+0.255645 +2020-01-25 23:00:00 PST,-0.001+0j,+0.25612 +2020-01-25 23:30:00 PST,+0.01+0j,+0.256073 +2020-01-26 00:00:00 PST,-0.001+0j,+0.256548 +2020-01-26 00:30:00 PST,+0.01+0j,+0.2565 +2020-01-26 01:00:00 PST,-0.001+0j,+0.256975 +2020-01-26 01:30:00 PST,+0.01+0j,+0.256928 +2020-01-26 02:00:00 PST,-0.001+0j,+0.257403 +2020-01-26 02:30:00 PST,+0.01+0j,+0.257355 +2020-01-26 03:00:00 PST,-0.001+0j,+0.25783 +2020-01-26 03:30:00 PST,+0.01+0j,+0.257783 +2020-01-26 04:00:00 PST,-0.001+0j,+0.258258 +2020-01-26 04:30:00 PST,+0.01+0j,+0.25821 +2020-01-26 05:00:00 PST,-0.001+0j,+0.258685 +2020-01-26 05:30:00 PST,+0.01+0j,+0.258638 +2020-01-26 06:00:00 PST,-0.001+0j,+0.259113 +2020-01-26 06:30:00 PST,+0.01+0j,+0.259065 +2020-01-26 07:00:00 PST,-0.001+0j,+0.25954 +2020-01-26 07:30:00 PST,+0.01+0j,+0.259493 +2020-01-26 08:00:00 PST,-0.001+0j,+0.259968 +2020-01-26 08:30:00 PST,+0.01+0j,+0.25992 +2020-01-26 09:00:00 PST,-0.001+0j,+0.260395 +2020-01-26 09:30:00 PST,+0.01+0j,+0.260348 +2020-01-26 10:00:00 PST,-0.001+0j,+0.260823 +2020-01-26 10:30:00 PST,+0.01+0j,+0.260775 +2020-01-26 11:00:00 PST,-0.001+0j,+0.26125 +2020-01-26 11:30:00 PST,+0.01+0j,+0.261203 +2020-01-26 12:00:00 PST,-0.001+0j,+0.261678 +2020-01-26 12:30:00 PST,+0.01+0j,+0.26163 +2020-01-26 13:00:00 PST,-0.001+0j,+0.262105 +2020-01-26 13:30:00 PST,+0.01+0j,+0.262058 +2020-01-26 14:00:00 PST,-0.001+0j,+0.262533 +2020-01-26 14:30:00 PST,+0.01+0j,+0.262485 +2020-01-26 15:00:00 PST,-0.001+0j,+0.26296 +2020-01-26 15:30:00 PST,+0.01+0j,+0.262913 +2020-01-26 16:00:00 PST,-0.001+0j,+0.263388 +2020-01-26 16:30:00 PST,+0.01+0j,+0.26334 +2020-01-26 17:00:00 PST,-0.001+0j,+0.263815 +2020-01-26 17:30:00 PST,+0.01+0j,+0.263768 +2020-01-26 18:00:00 PST,-0.001+0j,+0.264243 +2020-01-26 18:30:00 PST,+0.01+0j,+0.264195 +2020-01-26 19:00:00 PST,-0.001+0j,+0.26467 +2020-01-26 19:30:00 PST,+0.01+0j,+0.264623 +2020-01-26 20:00:00 PST,-0.001+0j,+0.265098 +2020-01-26 20:30:00 PST,+0.01+0j,+0.26505 +2020-01-26 21:00:00 PST,-0.001+0j,+0.265525 +2020-01-26 21:30:00 PST,+0.01+0j,+0.265478 +2020-01-26 22:00:00 PST,-0.001+0j,+0.265953 +2020-01-26 22:30:00 PST,+0.01+0j,+0.265905 +2020-01-26 23:00:00 PST,-0.001+0j,+0.26638 +2020-01-26 23:30:00 PST,+0.01+0j,+0.266333 +2020-01-27 00:00:00 PST,-0.001+0j,+0.266808 +2020-01-27 00:30:00 PST,+0.01+0j,+0.26676 +2020-01-27 01:00:00 PST,-0.001+0j,+0.267235 +2020-01-27 01:30:00 PST,+0.01+0j,+0.267188 +2020-01-27 02:00:00 PST,-0.001+0j,+0.267663 +2020-01-27 02:30:00 PST,+0.01+0j,+0.267615 +2020-01-27 03:00:00 PST,-0.001+0j,+0.26809 +2020-01-27 03:30:00 PST,+0.01+0j,+0.268043 +2020-01-27 04:00:00 PST,-0.001+0j,+0.268518 +2020-01-27 04:30:00 PST,+0.01+0j,+0.26847 +2020-01-27 05:00:00 PST,-0.001+0j,+0.268945 +2020-01-27 05:30:00 PST,+0.01+0j,+0.268898 +2020-01-27 06:00:00 PST,-0.001+0j,+0.269373 +2020-01-27 06:30:00 PST,+0.01+0j,+0.269325 +2020-01-27 07:00:00 PST,-0.001+0j,+0.2698 +2020-01-27 07:30:00 PST,+0.01+0j,+0.269753 +2020-01-27 08:00:00 PST,-0.001+0j,+0.270228 +2020-01-27 08:30:00 PST,+0.01+0j,+0.27018 +2020-01-27 09:00:00 PST,-0.001+0j,+0.270655 +2020-01-27 09:30:00 PST,+0.01+0j,+0.270608 +2020-01-27 10:00:00 PST,-0.001+0j,+0.271083 +2020-01-27 10:30:00 PST,+0.01+0j,+0.271035 +2020-01-27 11:00:00 PST,-0.001+0j,+0.27151 +2020-01-27 11:30:00 PST,+0.01+0j,+0.271463 +2020-01-27 12:00:00 PST,-0.001+0j,+0.271938 +2020-01-27 12:30:00 PST,+0.01+0j,+0.27189 +2020-01-27 13:00:00 PST,-0.001+0j,+0.272365 +2020-01-27 13:30:00 PST,+0.01+0j,+0.272318 +2020-01-27 14:00:00 PST,-0.001+0j,+0.272793 +2020-01-27 14:30:00 PST,+0.01+0j,+0.272745 +2020-01-27 15:00:00 PST,-0.001+0j,+0.27322 +2020-01-27 15:30:00 PST,+0.01+0j,+0.273173 +2020-01-27 16:00:00 PST,-0.001+0j,+0.273648 +2020-01-27 16:30:00 PST,+0.01+0j,+0.2736 +2020-01-27 17:00:00 PST,-0.001+0j,+0.274075 +2020-01-27 17:30:00 PST,+0.01+0j,+0.274028 +2020-01-27 18:00:00 PST,-0.001+0j,+0.274503 +2020-01-27 18:30:00 PST,+0.01+0j,+0.274455 +2020-01-27 19:00:00 PST,-0.001+0j,+0.27493 +2020-01-27 19:30:00 PST,+0.01+0j,+0.274883 +2020-01-27 20:00:00 PST,-0.001+0j,+0.275358 +2020-01-27 20:30:00 PST,+0.01+0j,+0.27531 +2020-01-27 21:00:00 PST,-0.001+0j,+0.275785 +2020-01-27 21:30:00 PST,+0.01+0j,+0.275738 +2020-01-27 22:00:00 PST,-0.001+0j,+0.276213 +2020-01-27 22:30:00 PST,+0.01+0j,+0.276165 +2020-01-27 23:00:00 PST,-0.001+0j,+0.27664 +2020-01-27 23:30:00 PST,+0.01+0j,+0.276593 +2020-01-28 00:00:00 PST,-0.001+0j,+0.277068 +2020-01-28 00:30:00 PST,+0.01+0j,+0.27702 +2020-01-28 01:00:00 PST,-0.001+0j,+0.277495 +2020-01-28 01:30:00 PST,+0.01+0j,+0.277448 +2020-01-28 02:00:00 PST,-0.001+0j,+0.277923 +2020-01-28 02:30:00 PST,+0.01+0j,+0.277875 +2020-01-28 03:00:00 PST,-0.001+0j,+0.27835 +2020-01-28 03:30:00 PST,+0.01+0j,+0.278303 +2020-01-28 04:00:00 PST,-0.001+0j,+0.278778 +2020-01-28 04:30:00 PST,+0.01+0j,+0.27873 +2020-01-28 05:00:00 PST,-0.001+0j,+0.279205 +2020-01-28 05:30:00 PST,+0.01+0j,+0.279158 +2020-01-28 06:00:00 PST,-0.001+0j,+0.279633 +2020-01-28 06:30:00 PST,+0.01+0j,+0.279585 +2020-01-28 07:00:00 PST,-0.001+0j,+0.28006 +2020-01-28 07:30:00 PST,+0.01+0j,+0.280013 +2020-01-28 08:00:00 PST,-0.001+0j,+0.280488 +2020-01-28 08:30:00 PST,+0.01+0j,+0.28044 +2020-01-28 09:00:00 PST,-0.001+0j,+0.280915 +2020-01-28 09:30:00 PST,+0.01+0j,+0.280868 +2020-01-28 10:00:00 PST,-0.001+0j,+0.281343 +2020-01-28 10:30:00 PST,+0.01+0j,+0.281295 +2020-01-28 11:00:00 PST,-0.001+0j,+0.28177 +2020-01-28 11:30:00 PST,+0.01+0j,+0.281723 +2020-01-28 12:00:00 PST,-0.001+0j,+0.282198 +2020-01-28 12:30:00 PST,+0.01+0j,+0.28215 +2020-01-28 13:00:00 PST,-0.001+0j,+0.282625 +2020-01-28 13:30:00 PST,+0.01+0j,+0.282578 +2020-01-28 14:00:00 PST,-0.001+0j,+0.283053 +2020-01-28 14:30:00 PST,+0.01+0j,+0.283005 +2020-01-28 15:00:00 PST,-0.001+0j,+0.28348 +2020-01-28 15:30:00 PST,+0.01+0j,+0.283433 +2020-01-28 16:00:00 PST,-0.001+0j,+0.283908 +2020-01-28 16:30:00 PST,+0.01+0j,+0.28386 +2020-01-28 17:00:00 PST,-0.001+0j,+0.284335 +2020-01-28 17:30:00 PST,+0.01+0j,+0.284288 +2020-01-28 18:00:00 PST,-0.001+0j,+0.284763 +2020-01-28 18:30:00 PST,+0.01+0j,+0.284715 +2020-01-28 19:00:00 PST,-0.001+0j,+0.28519 +2020-01-28 19:30:00 PST,+0.01+0j,+0.285143 +2020-01-28 20:00:00 PST,-0.001+0j,+0.285618 +2020-01-28 20:30:00 PST,+0.01+0j,+0.28557 +2020-01-28 21:00:00 PST,-0.001+0j,+0.286045 +2020-01-28 21:30:00 PST,+0.01+0j,+0.285998 +2020-01-28 22:00:00 PST,-0.001+0j,+0.286473 +2020-01-28 22:30:00 PST,+0.01+0j,+0.286425 +2020-01-28 23:00:00 PST,-0.001+0j,+0.2869 +2020-01-28 23:30:00 PST,+0.01+0j,+0.286853 +2020-01-29 00:00:00 PST,-0.001+0j,+0.287328 +2020-01-29 00:30:00 PST,+0.01+0j,+0.28728 +2020-01-29 01:00:00 PST,-0.001+0j,+0.287755 +2020-01-29 01:30:00 PST,+0.01+0j,+0.287708 +2020-01-29 02:00:00 PST,-0.001+0j,+0.288183 +2020-01-29 02:30:00 PST,+0.01+0j,+0.288135 +2020-01-29 03:00:00 PST,-0.001+0j,+0.28861 +2020-01-29 03:30:00 PST,+0.01+0j,+0.288563 +2020-01-29 04:00:00 PST,-0.001+0j,+0.289038 +2020-01-29 04:30:00 PST,+0.01+0j,+0.28899 +2020-01-29 05:00:00 PST,-0.001+0j,+0.289465 +2020-01-29 05:30:00 PST,+0.01+0j,+0.289418 +2020-01-29 06:00:00 PST,-0.001+0j,+0.289893 +2020-01-29 06:30:00 PST,+0.01+0j,+0.289845 +2020-01-29 07:00:00 PST,-0.001+0j,+0.29032 +2020-01-29 07:30:00 PST,+0.01+0j,+0.290273 +2020-01-29 08:00:00 PST,-0.001+0j,+0.290748 +2020-01-29 08:30:00 PST,+0.01+0j,+0.2907 +2020-01-29 09:00:00 PST,-0.001+0j,+0.291175 +2020-01-29 09:30:00 PST,+0.01+0j,+0.291128 +2020-01-29 10:00:00 PST,-0.001+0j,+0.291603 +2020-01-29 10:30:00 PST,+0.01+0j,+0.291555 +2020-01-29 11:00:00 PST,-0.001+0j,+0.29203 +2020-01-29 11:30:00 PST,+0.01+0j,+0.291983 +2020-01-29 12:00:00 PST,-0.001+0j,+0.292458 +2020-01-29 12:30:00 PST,+0.01+0j,+0.29241 +2020-01-29 13:00:00 PST,-0.001+0j,+0.292885 +2020-01-29 13:30:00 PST,+0.01+0j,+0.292838 +2020-01-29 14:00:00 PST,-0.001+0j,+0.293313 +2020-01-29 14:30:00 PST,+0.01+0j,+0.293265 +2020-01-29 15:00:00 PST,-0.001+0j,+0.29374 +2020-01-29 15:30:00 PST,+0.01+0j,+0.293693 +2020-01-29 16:00:00 PST,-0.001+0j,+0.294168 +2020-01-29 16:30:00 PST,+0.01+0j,+0.29412 +2020-01-29 17:00:00 PST,-0.001+0j,+0.294595 +2020-01-29 17:30:00 PST,+0.01+0j,+0.294548 +2020-01-29 18:00:00 PST,-0.001+0j,+0.295023 +2020-01-29 18:30:00 PST,+0.01+0j,+0.294975 +2020-01-29 19:00:00 PST,-0.001+0j,+0.29545 +2020-01-29 19:30:00 PST,+0.01+0j,+0.295403 +2020-01-29 20:00:00 PST,-0.001+0j,+0.295878 +2020-01-29 20:30:00 PST,+0.01+0j,+0.29583 +2020-01-29 21:00:00 PST,-0.001+0j,+0.296305 +2020-01-29 21:30:00 PST,+0.01+0j,+0.296258 +2020-01-29 22:00:00 PST,-0.001+0j,+0.296733 +2020-01-29 22:30:00 PST,+0.01+0j,+0.296685 +2020-01-29 23:00:00 PST,-0.001+0j,+0.29716 +2020-01-29 23:30:00 PST,+0.01+0j,+0.297113 +2020-01-30 00:00:00 PST,-0.001+0j,+0.297588 +2020-01-30 00:30:00 PST,+0.01+0j,+0.29754 +2020-01-30 01:00:00 PST,-0.001+0j,+0.298015 +2020-01-30 01:30:00 PST,+0.01+0j,+0.297968 +2020-01-30 02:00:00 PST,-0.001+0j,+0.298443 +2020-01-30 02:30:00 PST,+0.01+0j,+0.298395 +2020-01-30 03:00:00 PST,-0.001+0j,+0.29887 +2020-01-30 03:30:00 PST,+0.01+0j,+0.298823 +2020-01-30 04:00:00 PST,-0.001+0j,+0.299298 +2020-01-30 04:30:00 PST,+0.01+0j,+0.29925 +2020-01-30 05:00:00 PST,-0.001+0j,+0.299725 +2020-01-30 05:30:00 PST,+0.01+0j,+0.299678 +2020-01-30 06:00:00 PST,-0.001+0j,+0.300153 +2020-01-30 06:30:00 PST,+0.01+0j,+0.300105 +2020-01-30 07:00:00 PST,-0.001+0j,+0.30058 +2020-01-30 07:30:00 PST,+0.01+0j,+0.300533 +2020-01-30 08:00:00 PST,-0.001+0j,+0.301008 +2020-01-30 08:30:00 PST,+0.01+0j,+0.30096 +2020-01-30 09:00:00 PST,-0.001+0j,+0.301435 +2020-01-30 09:30:00 PST,+0.01+0j,+0.301388 +2020-01-30 10:00:00 PST,-0.001+0j,+0.301863 +2020-01-30 10:30:00 PST,+0.01+0j,+0.301815 +2020-01-30 11:00:00 PST,-0.001+0j,+0.30229 +2020-01-30 11:30:00 PST,+0.01+0j,+0.302243 +2020-01-30 12:00:00 PST,-0.001+0j,+0.302718 +2020-01-30 12:30:00 PST,+0.01+0j,+0.30267 +2020-01-30 13:00:00 PST,-0.001+0j,+0.303145 +2020-01-30 13:30:00 PST,+0.01+0j,+0.303098 +2020-01-30 14:00:00 PST,-0.001+0j,+0.303573 +2020-01-30 14:30:00 PST,+0.01+0j,+0.303525 +2020-01-30 15:00:00 PST,-0.001+0j,+0.304 +2020-01-30 15:30:00 PST,+0.01+0j,+0.303953 +2020-01-30 16:00:00 PST,-0.001+0j,+0.304428 +2020-01-30 16:30:00 PST,+0.01+0j,+0.30438 +2020-01-30 17:00:00 PST,-0.001+0j,+0.304855 +2020-01-30 17:30:00 PST,+0.01+0j,+0.304808 +2020-01-30 18:00:00 PST,-0.001+0j,+0.305283 +2020-01-30 18:30:00 PST,+0.01+0j,+0.305235 +2020-01-30 19:00:00 PST,-0.001+0j,+0.30571 +2020-01-30 19:30:00 PST,+0.01+0j,+0.305663 +2020-01-30 20:00:00 PST,-0.001+0j,+0.306138 +2020-01-30 20:30:00 PST,+0.01+0j,+0.30609 +2020-01-30 21:00:00 PST,-0.001+0j,+0.306565 +2020-01-30 21:30:00 PST,+0.01+0j,+0.306518 +2020-01-30 22:00:00 PST,-0.001+0j,+0.306993 +2020-01-30 22:30:00 PST,+0.01+0j,+0.306945 +2020-01-30 23:00:00 PST,-0.001+0j,+0.30742 +2020-01-30 23:30:00 PST,+0.01+0j,+0.307373 +2020-01-31 00:00:00 PST,-0.001+0j,+0.307848 +2020-01-31 00:30:00 PST,+0.01+0j,+0.3078 +2020-01-31 01:00:00 PST,-0.001+0j,+0.308275 +2020-01-31 01:30:00 PST,+0.01+0j,+0.308228 +2020-01-31 02:00:00 PST,-0.001+0j,+0.308703 +2020-01-31 02:30:00 PST,+0.01+0j,+0.308655 +2020-01-31 03:00:00 PST,-0.001+0j,+0.30913 +2020-01-31 03:30:00 PST,+0.01+0j,+0.309083 +2020-01-31 04:00:00 PST,-0.001+0j,+0.309558 +2020-01-31 04:30:00 PST,+0.01+0j,+0.30951 +2020-01-31 05:00:00 PST,-0.001+0j,+0.309985 +2020-01-31 05:30:00 PST,+0.01+0j,+0.309938 +2020-01-31 06:00:00 PST,-0.001+0j,+0.310413 +2020-01-31 06:30:00 PST,+0.01+0j,+0.310365 +2020-01-31 07:00:00 PST,-0.001+0j,+0.31084 +2020-01-31 07:30:00 PST,+0.01+0j,+0.310793 +2020-01-31 08:00:00 PST,-0.001+0j,+0.311268 +2020-01-31 08:30:00 PST,+0.01+0j,+0.31122 +2020-01-31 09:00:00 PST,-0.001+0j,+0.311695 +2020-01-31 09:30:00 PST,+0.01+0j,+0.311648 +2020-01-31 10:00:00 PST,-0.001+0j,+0.312123 +2020-01-31 10:30:00 PST,+0.01+0j,+0.312075 +2020-01-31 11:00:00 PST,-0.001+0j,+0.31255 +2020-01-31 11:30:00 PST,+0.01+0j,+0.312503 +2020-01-31 12:00:00 PST,-0.001+0j,+0.312978 +2020-01-31 12:30:00 PST,+0.01+0j,+0.31293 +2020-01-31 13:00:00 PST,-0.001+0j,+0.313405 +2020-01-31 13:30:00 PST,+0.01+0j,+0.313358 +2020-01-31 14:00:00 PST,-0.001+0j,+0.313833 +2020-01-31 14:30:00 PST,+0.01+0j,+0.313785 +2020-01-31 15:00:00 PST,-0.001+0j,+0.31426 +2020-01-31 15:30:00 PST,+0.01+0j,+0.314213 +2020-01-31 16:00:00 PST,-0.001+0j,+0.314688 +2020-01-31 16:30:00 PST,+0.01+0j,+0.31464 +2020-01-31 17:00:00 PST,-0.001+0j,+0.315115 +2020-01-31 17:30:00 PST,+0.01+0j,+0.315068 +2020-01-31 18:00:00 PST,-0.001+0j,+0.315543 +2020-01-31 18:30:00 PST,+0.01+0j,+0.315495 +2020-01-31 19:00:00 PST,-0.001+0j,+0.31597 +2020-01-31 19:30:00 PST,+0.01+0j,+0.315923 +2020-01-31 20:00:00 PST,-0.001+0j,+0.316398 +2020-01-31 20:30:00 PST,+0.01+0j,+0.31635 +2020-01-31 21:00:00 PST,-0.001+0j,+0.316825 +2020-01-31 21:30:00 PST,+0.01+0j,+0.316778 +2020-01-31 22:00:00 PST,-0.001+0j,+0.317253 +2020-01-31 22:30:00 PST,+0.01+0j,+0.317205 +2020-01-31 23:00:00 PST,-0.001+0j,+0.31768 +2020-01-31 23:30:00 PST,+0.01+0j,+0.317633 +2020-02-01 00:00:00 PST,-0.001+0j,+0.318108 diff --git a/module/pypower/branch.cpp b/module/pypower/branch.cpp index 0cfaaef01..f09abb957 100644 --- a/module/pypower/branch.cpp +++ b/module/pypower/branch.cpp @@ -69,6 +69,12 @@ branch::branch(MODULE *module) PT_double, "angmax[deg]", get_angmax_offset(), PT_DESCRIPTION, "maximum angle difference, angle(Vf) - angle(Vt) (degrees)", + PT_complex, "current[A]", get_current_offset(), + PT_DESCRIPTION, "line current (A)", + + PT_double, "loss[MW]", get_loss_offset(), + PT_DESCRIPTION, "line loss (MW)", + NULL)<1) { throw "unable to publish branch properties"; diff --git a/module/pypower/branch.h b/module/pypower/branch.h index 703729f41..c29ebcf0f 100644 --- a/module/pypower/branch.h +++ b/module/pypower/branch.h @@ -30,6 +30,8 @@ class branch : public gld_object public: GL_ATOMIC(int32,child_count); + GL_ATOMIC(complex,current); + GL_ATOMIC(double,loss); public: // event handlers diff --git a/module/pypower/bus.h b/module/pypower/bus.h index 7e5ae71bb..d00caceb4 100644 --- a/module/pypower/bus.h +++ b/module/pypower/bus.h @@ -62,6 +62,10 @@ class bus : public gld_object gld_property *weather_mapper[N_WEATHERDATA]; WEATHERDATA *first, *last, *current; +public: + + complex V; + public: // event handlers diff --git a/module/pypower/powerplant.cpp b/module/pypower/powerplant.cpp index 68054bc34..98855073e 100644 --- a/module/pypower/powerplant.cpp +++ b/module/pypower/powerplant.cpp @@ -5,6 +5,7 @@ EXPORT_CREATE(powerplant); EXPORT_INIT(powerplant); +EXPORT_PRECOMMIT(powerplant); EXPORT_SYNC(powerplant); CLASS *powerplant::oclass = NULL; @@ -46,36 +47,36 @@ powerplant::powerplant(MODULE *module) PT_DESCRIPTION, "Generator plant code number", PT_set, "generator", get_generator_offset(), - PT_KEYWORD, "UNKNOWN", (set)0x00000001, - PT_KEYWORD, "HT", (set)0x00000002, // hydro turbine - PT_KEYWORD, "ST", (set)0x00000004, // steam turbine - PT_KEYWORD, "AT", (set)0x00000008, // compressed air turbine - PT_KEYWORD, "IC", (set)0x00000010, // internal combustion - PT_KEYWORD, "FW", (set)0x00000020, // flywheel - PT_KEYWORD, "WT", (set)0x00000040, // wind turbine - PT_KEYWORD, "ES", (set)0x00000080, // energy storage inverter - PT_KEYWORD, "CT", (set)0x00000100, // combustion turbine - PT_KEYWORD, "PV", (set)0x00000200, // photovoltaic inverter - PT_KEYWORD, "CC", (set)0x00000400, // combined cycle turbine + PT_KEYWORD, "UNKNOWN", (set)GT_UNKNOWN, + PT_KEYWORD, "HT", (set)GT_HYDROTURBINE, + PT_KEYWORD, "ST", (set)GT_STEAMTURBINE, + PT_KEYWORD, "AT", (set)GT_COMPRESSEDAIR, + PT_KEYWORD, "IC", (set)GT_INTERNALCOMBUSTION, + PT_KEYWORD, "FW", (set)GT_FLYWHEEL, + PT_KEYWORD, "WT", (set)GT_WINDTURBINE, + PT_KEYWORD, "ES", (set)GT_ENERGYSTORAGE, + PT_KEYWORD, "CT", (set)GT_COMBUSTIONTURBINE, + PT_KEYWORD, "PV", (set)GT_PHOTOVOLTAIC, + PT_KEYWORD, "CC", (set)GT_COMBINEDCYCLE, PT_DESCRIPTION, "Generator type", PT_set, "fuel", get_fuel_offset(), - PT_KEYWORD, "ELEC", (set)0x00000001, - PT_KEYWORD, "WIND", (set)0x00000002, - PT_KEYWORD, "SUN", (set)0x00000004, - PT_KEYWORD, "GEO", (set)0x00000008, - PT_KEYWORD, "COKE", (set)0x00000010, - PT_KEYWORD, "WASTE", (set)0x00000020, - PT_KEYWORD, "BIO", (set)0x00000040, - PT_KEYWORD, "OIL", (set)0x00000080, - PT_KEYWORD, "UNKNOWN", (set)0x00000100, - PT_KEYWORD, "WOOD", (set)0x00000200, - PT_KEYWORD, "OTHER", (set)0x00000400, - PT_KEYWORD, "GAS", (set)0x00000800, - PT_KEYWORD, "NUC", (set)0x00001000, - PT_KEYWORD, "WATER", (set)0x00002000, - PT_KEYWORD, "COAL", (set)0x00004000, - PT_KEYWORD, "NG", (set)0x00008000, + PT_KEYWORD, "ELEC", (set)FT_ELECTRICITY, + PT_KEYWORD, "WIND", (set)FT_WIND, + PT_KEYWORD, "SUN", (set)FT_SOLAR, + PT_KEYWORD, "GEO", (set)FT_GEOTHERMAL, + PT_KEYWORD, "COKE", (set)FT_COKE, + PT_KEYWORD, "WASTE", (set)FT_WASTE, + PT_KEYWORD, "BIO", (set)FT_BIOMASS, + PT_KEYWORD, "OIL", (set)FT_OIL, + PT_KEYWORD, "UNKNOWN", (set)FT_UNKNOWN, + PT_KEYWORD, "WOOD", (set)FT_WOOD, + PT_KEYWORD, "OTHER", (set)FT_OTHER, + PT_KEYWORD, "GAS", (set)FT_GAS, + PT_KEYWORD, "NUC", (set)FT_NUCLEAR, + PT_KEYWORD, "WATER", (set)FT_WATER, + PT_KEYWORD, "COAL", (set)FT_COAL, + PT_KEYWORD, "NG", (set)FT_NATURALGAS, PT_DESCRIPTION, "Generator fuel type", PT_enumeration, "status", get_status_offset(), @@ -101,6 +102,19 @@ powerplant::powerplant(MODULE *module) PT_char256, "substation_2", get_substation_2_offset(), PT_DESCRIPTION, "Substation 2 id", + PT_double, "storage_capacity[MWh]", get_storage_capacity_offset(), + PT_DESCRIPTION, "Energy storage capacity (MWh)", + + PT_double, "charging_capacity[MW]", get_charging_capacity_offset(), + PT_DESCRIPTION, "Energy storage charging capacity (MW)", + + PT_double, "storage_efficiency[pu]", get_storage_efficiency_offset(), + PT_DEFAULT, "1 pu", + PT_DESCRIPTION, "Energy storage round-trip efficiency (pu)", + + PT_double, "state_of_charge[pu]", get_state_of_charge_offset(), + PT_DESCRIPTION, "Energy storage state of charge (pu)", + PT_complex, "S[MVA]", get_S_offset(), PT_DESCRIPTION, "power generation (MVA)", @@ -119,6 +133,7 @@ int powerplant::create(void) py_controller = NULL; py_args = PyTuple_New(1); py_kwargs = PyDict_New(); + last_t = 0; return 1; // return 1 on success, 0 on failure } @@ -131,6 +146,10 @@ int powerplant::init(OBJECT *parent_hdr) if ( parent->isa("gen","pypower") ) { is_dynamic = TRUE; + if ( get_storage_capacity() > 0 ) + { + warning("energy storage devices cannot be dynamically dispatchable (parent is a generator)"); + } } else if ( parent->isa("bus","pypower") ) { @@ -199,6 +218,40 @@ int powerplant::init(OBJECT *parent_hdr) return 1; // return 1 on success, 0 on failure, 2 on retry later } +TIMESTAMP powerplant::precommit(TIMESTAMP t0) +{ + if ( last_t > 0 && get_storage_capacity() > 0 ) + { + double Dt = double(t0-last_t)/3600.0; + + double DE = S.Re(); + if ( DE > get_charging_capacity() ) + { + DE = get_charging_capacity(); + } + else if ( DE < -get_charging_capacity() ) + { + DE = -get_charging_capacity(); + } + + double Et = get_storage_capacity()*get_state_of_charge() + DE*Dt*get_storage_efficiency(); + if ( Et > get_storage_capacity() ) + { + set_state_of_charge(1.0); + } + else if ( Et < 0 ) + { + set_state_of_charge(0.0); + } + else + { + set_state_of_charge(Et/get_storage_capacity()); + } + } + last_t = t0; + + return TS_NEVER; +} TIMESTAMP powerplant::presync(TIMESTAMP t0) { if ( get_status() == 0 ) diff --git a/module/pypower/powerplant.h b/module/pypower/powerplant.h index 2df4fbbe7..3d8659bc7 100644 --- a/module/pypower/powerplant.h +++ b/module/pypower/powerplant.h @@ -9,6 +9,43 @@ class powerplant : public gld_object { +public: + + typedef enum { + GT_UNDEFINED = 0x0000, + GT_UNKNOWN = 0x0001, + GT_HYDROTURBINE = 0x0002, + GT_STEAMTURBINE = 0x0004, + GT_COMPRESSEDAIR = 0x0008, + GT_INTERNALCOMBUSTION = 0x0010, + GT_FLYWHEEL = 0x0020, + GT_WINDTURBINE = 0x0040, + GT_ENERGYSTORAGE = 0x0080, + GT_COMBUSTIONTURBINE = 0x0100, + GT_PHOTOVOLTAIC = 0x0200, + GT_COMBINEDCYCLE = 0x0400, + } GENERATORTYPE; + + typedef enum { + FT_UNDEFINED = 0x00000000, + FT_ELECTRICITY = 0x00000001, + FT_WIND = 0x00000002, + FT_SOLAR = 0x00000004, + FT_GEOTHERMAL = 0x00000008, + FT_COKE = 0x00000010, + FT_WASTE = 0x00000020, + FT_BIOMASS = 0x00000040, + FT_OIL = 0x00000080, + FT_UNKNOWN = 0x00000100, + FT_WOOD = 0x00000200, + FT_OTHER = 0x00000400, + FT_GAS = 0x00000800, + FT_NUCLEAR = 0x00001000, + FT_WATER = 0x00002000, + FT_COAL = 0x00004000, + FT_NATURALGAS = 0x00008000, + } FUELTYPE; + public: // published properties GL_ATOMIC(char32,city); @@ -27,6 +64,10 @@ class powerplant : public gld_object GL_ATOMIC(double,capacity_factor); GL_ATOMIC(char256,substation_1); GL_ATOMIC(char256,substation_2); + GL_ATOMIC(double,storage_capacity); + GL_ATOMIC(double,charging_capacity); + GL_ATOMIC(double,storage_efficiency); + GL_ATOMIC(double,state_of_charge); GL_ATOMIC(complex,S); GL_ATOMIC(char256,controller); @@ -37,15 +78,17 @@ class powerplant : public gld_object private: bool is_dynamic; // true if parent is a gen otherwise false + TIMESTAMP last_t; public: // event handlers powerplant(MODULE *module); int create(void); int init(OBJECT *parent); - TIMESTAMP presync(TIMESTAMP t1); - TIMESTAMP sync(TIMESTAMP t1); - TIMESTAMP postsync(TIMESTAMP t1); + TIMESTAMP precommit(TIMESTAMP t0); + TIMESTAMP presync(TIMESTAMP t0); + TIMESTAMP sync(TIMESTAMP t0); + TIMESTAMP postsync(TIMESTAMP t0); public: // internal properties diff --git a/module/pypower/pypower.cpp b/module/pypower/pypower.cpp index edd4150d7..eedfefc6f 100644 --- a/module/pypower/pypower.cpp +++ b/module/pypower/pypower.cpp @@ -32,6 +32,8 @@ typedef enum { } PYPOWERSAVEFORMAT; enumeration save_format = PPSF_CSV; const char *save_formats[] = {"csv","json","py"}; +double total_loss = 0; +double generation_shortfall = 0; enum { SS_INIT = 0, @@ -43,7 +45,11 @@ char1024 controllers; char1024 controllers_path; PyObject *py_controllers; PyObject *py_globals; +PyObject *py_precommit; PyObject *py_sync; +PyObject *py_commit; +PyObject *py_term; +PyObject *py_module; EXPORT CLASS *init(CALLBACKS *fntable, MODULE *module, int argc, char *argv[]) { @@ -160,6 +166,18 @@ EXPORT CLASS *init(CALLBACKS *fntable, MODULE *module, int argc, char *argv[]) PT_DESCRIPTION, "Save case format", NULL); + gl_global_create("pypower::total_loss", + PT_double, &total_loss, + PT_UNITS, "MW", + PT_DESCRIPTION, "System-wide line losses", + NULL); + + gl_global_create("pypower::generation_shortfall", + PT_double, &generation_shortfall, + PT_UNITS, "MW", + PT_DESCRIPTION, "System-wide generation shortfall", + NULL); + // always return the first class registered return bus::oclass; } @@ -209,6 +227,9 @@ EXPORT bool on_init(void) return false; } + PyObject_SetAttrString(py_controllers,"gridlabd",callback->python.main); + Py_INCREF(callback->python.main); + py_globals = PyModule_GetDict(py_controllers); if ( py_globals == NULL ) { @@ -222,7 +243,7 @@ EXPORT bool on_init(void) { if ( ! PyCallable_Check(on_init) ) { - gl_error("%s.on_init() is not callable",(const char*)controllers); + gl_error("%s.on_init is not callable",(const char*)controllers); Py_DECREF(on_init); return false; } @@ -257,16 +278,49 @@ EXPORT bool on_init(void) Py_DECREF(result); } + py_precommit = PyDict_GetItemString(py_globals,"on_precommit"); + if ( py_precommit ) + { + if ( ! PyCallable_Check(py_precommit) ) + { + gl_error("%s.on_precommit is not callable",(const char*)controllers); + return false; + } + Py_INCREF(py_precommit); + } + py_sync = PyDict_GetItemString(py_globals,"on_sync"); if ( py_sync ) { if ( ! PyCallable_Check(py_sync) ) { - gl_error("%s.on_sync() is not callable",(const char*)controllers); + gl_error("%s.on_sync is not callable",(const char*)controllers); return false; } Py_INCREF(py_sync); } + + py_commit = PyDict_GetItemString(py_globals,"on_commit"); + if ( py_commit ) + { + if ( ! PyCallable_Check(py_commit) ) + { + gl_error("%s.on_commit is not callable",(const char*)controllers); + return false; + } + Py_INCREF(py_commit); + } + + py_term = PyDict_GetItemString(py_globals,"on_term"); + if ( py_term ) + { + if ( ! PyCallable_Check(py_term) ) + { + gl_error("%s.on_term is not callable",(const char*)controllers); + return false; + } + Py_INCREF(py_commit); + } } // import pypower solver @@ -367,7 +421,7 @@ EXPORT bool on_init(void) if ( py == NULL || fabs(obj->get_##NAME()-Py##TO##_As##FROM(py)) > solver_update_resolution ) { \ PyObject *value = Py##TO##_From##FROM(obj->get_##NAME()); \ if ( value == NULL ) { \ - gl_warning("pypower:on_sync(t0=%lld): unable to create value " #NAME " for data item %d",t0,INDEX); \ + gl_warning("pypower:on_*(t0=%lld): unable to create value " #NAME " for data item %d",t0,INDEX); \ } \ else { \ PyList_SET_ITEM(pyobj,INDEX,value); \ @@ -381,6 +435,166 @@ EXPORT bool on_init(void) obj->set_##NAME(Py##FROM##_As##TO(py)); \ }} +#define SENDX(INDEX,NAME,FROM,TO) { PyObject *py = PyList_GetItem(pyobj,INDEX); \ + if ( py == NULL || fabs(obj->get_##NAME()-Py##TO##_As##FROM(py)) > solver_update_resolution ) { \ + PyObject *value = Py##TO##_From##FROM(obj->get_##NAME()); \ + if ( value == NULL ) { \ + gl_warning("pypower:on_*(t0=%lld): unable to create value " #NAME " for data item %d",t0,INDEX); \ + } \ + else { \ + PyList_SET_ITEM(pyobj,INDEX,value); \ + Py_XDECREF(py); \ +}}} + +#define RECVX(NAME,INDEX,FROM,TO) { PyObject *py = PyList_GET_ITEM(pyobj,INDEX);\ + if ( fabs(obj->get_##NAME()-Py##FROM##_As##TO(py)) > solver_update_resolution ) { \ + obj->set_##NAME(Py##FROM##_As##TO(py)); \ + }} + +EXPORT TIMESTAMP on_precommit(TIMESTAMP t0) +{ + // not a pypower model + if ( nbus == 0 || nbranch == 0 ) + { + return TS_NEVER; + } + + // send values out to solver + for ( size_t n = 0 ; n < nbus ; n++ ) + { + bus *obj = buslist[n]; + PyObject *pyobj = PyList_GetItem(busdata,n); + SENDX(0,bus_i,Double,Float) + SENDX(1,type,Long,Long) + SENDX(2,Pd,Double,Float) + SENDX(3,Qd,Double,Float) + SENDX(4,Gs,Double,Float) + SENDX(5,Bs,Double,Float) + SENDX(6,area,Long,Long) + SENDX(7,Vm,Double,Float) + SENDX(8,Va,Double,Float) + SENDX(9,baseKV,Double,Float) + SENDX(10,zone,Long,Long) + SENDX(11,Vmax,Double,Float) + SENDX(12,Vmin,Double,Float) + if ( enable_opf ) + { + SENDX(13,lam_P,Double,Float) + SENDX(14,lam_Q,Double,Float) + SENDX(15,mu_Vmax,Double,Float) + SENDX(16,mu_Vmin,Double,Float) + } + } + for ( size_t n = 0 ; n < nbranch ; n++ ) + { + branch *obj = branchlist[n]; + PyObject *pyobj = PyList_GetItem(branchdata,n); + SENDX(0,fbus,Long,Long) + SENDX(1,tbus,Long,Long) + SENDX(2,r,Double,Float) + SENDX(3,x,Double,Float) + SENDX(4,b,Double,Float) + SENDX(5,rateA,Double,Float) + SENDX(6,rateB,Double,Float) + SENDX(7,rateC,Double,Float) + SENDX(8,ratio,Double,Float) + SENDX(9,angle,Double,Float) + SENDX(10,status,Long,Long) + SENDX(11,angmin,Double,Float) + SENDX(12,angmax,Double,Float) + + } + for ( size_t n = 0 ; n < ngen ; n++ ) + { + gen *obj = genlist[n]; + PyObject *pyobj = PyList_GetItem(gendata,n); + SENDX(0,bus,Long,Long) + SENDX(1,Pg,Double,Float) + SENDX(2,Qg,Double,Float) + SENDX(3,Qmax,Double,Float) + SENDX(4,Qmin,Double,Float) + SENDX(5,Vg,Double,Float) + SENDX(6,mBase,Double,Float) + SENDX(7,status,Long,Long) + SENDX(8,Pmax,Double,Float) + SENDX(9,Pmin,Double,Float) + SENDX(10,Pc1,Double,Float) + SENDX(11,Pc2,Double,Float) + SENDX(12,Qc1min,Double,Float) + SENDX(13,Qc1max,Double,Float) + SENDX(14,Qc2min,Double,Float) + SENDX(15,Qc2max,Double,Float) + SENDX(16,ramp_agc,Double,Float) + SENDX(17,ramp_10,Double,Float) + SENDX(18,ramp_30,Double,Float) + SENDX(19,ramp_q,Double,Float) + SENDX(20,apf,Double,Float) + if ( enable_opf ) + { + SENDX(21,mu_Pmax,Double,Float) + SENDX(22,mu_Pmin,Double,Float) + SENDX(23,mu_Qmax,Double,Float) + SENDX(24,mu_Qmin,Double,Float) + } + } + if ( gencostdata ) + { + for ( size_t n = 0 ; n < ngencost ; n++ ) + { + gencost *obj = gencostlist[n]; + PyObject *pyobj = PyList_GetItem(gencostdata,n); + SENDX(0,model,Long,Long) + SENDX(1,startup,Double,Float) + SENDX(2,shutdown,Double,Float) + PyObject *py = PyList_GetItem(pyobj,3); + if ( py == NULL || strcmp((const char*)PyUnicode_DATA(py),obj->get_costs())!=0 ) + { + Py_XDECREF(py); + PyList_SET_ITEM(pyobj,3,PyUnicode_FromString(obj->get_costs())); + } + } + } + + // run controller on_precommit, if any + TIMESTAMP t1 = TS_NEVER; + if ( py_precommit ) + { + PyDict_SetItemString(data,"t",PyLong_FromLong(t0)); + PyErr_Clear(); + PyObject *ts = PyObject_CallOneArg(py_precommit,data); + if ( PyErr_Occurred() ) + { + PyErr_Print(); + return TS_INVALID; + } + if ( ts == NULL || ! PyLong_Check(ts) ) + { + gl_error("%s.on_precommit(data) returned value that is not a valid timestamp",(const char*)controllers); + Py_XDECREF(ts); + return TS_INVALID; + } + t1 = PyLong_AsLong(ts); + Py_DECREF(ts); + if ( t1 < 0 ) + { + t1 = TS_NEVER; + } + else if ( t1 == 0 && stop_on_failure ) + { + gl_error("%s.on_precommit(data) halted the simulation",(const char*)controllers); + return TS_INVALID; + } + else if ( t1 < t0 ) + { + gl_error("%s.on_precommit(data) returned a timestamp earlier than precommit time t0=%lld",(const char*)controllers,t0); + return TS_INVALID; + } + } + + TIMESTAMP t2 = maximum_timestep > 0 ? t0+maximum_timestep : TS_NEVER; + return (TIMESTAMP)min((unsigned long long)t1,(unsigned long long)t2); +} + EXPORT TIMESTAMP on_sync(TIMESTAMP t0) { // not a pypower model @@ -584,6 +798,34 @@ EXPORT TIMESTAMP on_sync(TIMESTAMP t0) RECV(mu_Vmax,15,Float,Double) RECV(mu_Vmin,16,Float,Double) } + obj->V.SetPolar(obj->get_Vm(),obj->get_Va()); + } + + for ( size_t n = 0 ; n < nbranch ; n++ ) + { + branch *line = branchlist[n]; + size_t fbus_id = line->get_fbus()-1; + size_t tbus_id = line->get_tbus()-1; + if ( fbus_id < 0 || fbus_id >= nbus ) + { + gl_warning("pypower::on_sync(): from bus %d on branch %d is not valid",fbus_id,n); + } + else if ( tbus_id < 0 || tbus_id >= nbus ) + { + gl_warning("pypower::on_sync(): to bus %d on branch %d is not valid",tbus_id,n); + } + else + { + complex Z(line->get_r(),line->get_x()); + bus *fbus = buslist[fbus_id]; + bus *tbus = buslist[tbus_id]; + complex DV = fbus->V - tbus->V; + complex current = DV / Z; + line->set_current(current*base_MVA); + double loss = (DV * ~current).Mag() / base_MVA; + line->set_loss(loss); + total_loss += loss; + } } PyObject *gendata = PyDict_GetItemString(result,"gen"); @@ -593,6 +835,7 @@ EXPORT TIMESTAMP on_sync(TIMESTAMP t0) solver_status = SS_FAILED; return TS_INVALID; } + generation_shortfall = 0; for ( size_t n = 0 ; n < ngen ; n++ ) { gen *obj = genlist[n]; @@ -607,6 +850,7 @@ EXPORT TIMESTAMP on_sync(TIMESTAMP t0) RECV(mu_Qmax,23,Float,Double) RECV(mu_Qmin,24,Float,Double) } + generation_shortfall += max(obj->get_Pg() - obj->get_Pmax(),0.0); } } } @@ -639,6 +883,150 @@ EXPORT TIMESTAMP on_sync(TIMESTAMP t0) } } +EXPORT int on_commit(TIMESTAMP t0) +{ + // not a pypower model + if ( nbus == 0 || nbranch == 0 ) + { + return 1; + } + + // send values out to solver + for ( size_t n = 0 ; n < nbus ; n++ ) + { + bus *obj = buslist[n]; + PyObject *pyobj = PyList_GetItem(busdata,n); + SENDX(0,bus_i,Double,Float) + SENDX(1,type,Long,Long) + SENDX(2,Pd,Double,Float) + SENDX(3,Qd,Double,Float) + SENDX(4,Gs,Double,Float) + SENDX(5,Bs,Double,Float) + SENDX(6,area,Long,Long) + SENDX(7,Vm,Double,Float) + SENDX(8,Va,Double,Float) + SENDX(9,baseKV,Double,Float) + SENDX(10,zone,Long,Long) + SENDX(11,Vmax,Double,Float) + SENDX(12,Vmin,Double,Float) + if ( enable_opf ) + { + SENDX(13,lam_P,Double,Float) + SENDX(14,lam_Q,Double,Float) + SENDX(15,mu_Vmax,Double,Float) + SENDX(16,mu_Vmin,Double,Float) + } + } + for ( size_t n = 0 ; n < nbranch ; n++ ) + { + branch *obj = branchlist[n]; + PyObject *pyobj = PyList_GetItem(branchdata,n); + SENDX(0,fbus,Long,Long) + SENDX(1,tbus,Long,Long) + SENDX(2,r,Double,Float) + SENDX(3,x,Double,Float) + SENDX(4,b,Double,Float) + SENDX(5,rateA,Double,Float) + SENDX(6,rateB,Double,Float) + SENDX(7,rateC,Double,Float) + SENDX(8,ratio,Double,Float) + SENDX(9,angle,Double,Float) + SENDX(10,status,Long,Long) + SENDX(11,angmin,Double,Float) + SENDX(12,angmax,Double,Float) + + } + for ( size_t n = 0 ; n < ngen ; n++ ) + { + gen *obj = genlist[n]; + PyObject *pyobj = PyList_GetItem(gendata,n); + SENDX(0,bus,Long,Long) + SENDX(1,Pg,Double,Float) + SENDX(2,Qg,Double,Float) + SENDX(3,Qmax,Double,Float) + SENDX(4,Qmin,Double,Float) + SENDX(5,Vg,Double,Float) + SENDX(6,mBase,Double,Float) + SENDX(7,status,Long,Long) + SENDX(8,Pmax,Double,Float) + SENDX(9,Pmin,Double,Float) + SENDX(10,Pc1,Double,Float) + SENDX(11,Pc2,Double,Float) + SENDX(12,Qc1min,Double,Float) + SENDX(13,Qc1max,Double,Float) + SENDX(14,Qc2min,Double,Float) + SENDX(15,Qc2max,Double,Float) + SENDX(16,ramp_agc,Double,Float) + SENDX(17,ramp_10,Double,Float) + SENDX(18,ramp_30,Double,Float) + SENDX(19,ramp_q,Double,Float) + SENDX(20,apf,Double,Float) + if ( enable_opf ) + { + SENDX(21,mu_Pmax,Double,Float) + SENDX(22,mu_Pmin,Double,Float) + SENDX(23,mu_Qmax,Double,Float) + SENDX(24,mu_Qmin,Double,Float) + } + } + if ( gencostdata ) + { + for ( size_t n = 0 ; n < ngencost ; n++ ) + { + gencost *obj = gencostlist[n]; + PyObject *pyobj = PyList_GetItem(gencostdata,n); + SENDX(0,model,Long,Long) + SENDX(1,startup,Double,Float) + SENDX(2,shutdown,Double,Float) + PyObject *py = PyList_GetItem(pyobj,3); + if ( py == NULL || strcmp((const char*)PyUnicode_DATA(py),obj->get_costs())!=0 ) + { + Py_XDECREF(py); + PyList_SET_ITEM(pyobj,3,PyUnicode_FromString(obj->get_costs())); + } + } + } + + // run controller on_commit, if any + if ( py_commit ) + { + PyDict_SetItemString(data,"t",PyLong_FromLong(t0)); + PyErr_Clear(); + PyObject *ts = PyObject_CallOneArg(py_commit,data); + if ( PyErr_Occurred() ) + { + PyErr_Print(); + return 0; + } + Py_DECREF(ts); + } + + return 1; +} + +EXPORT void on_term(void) +{ + if ( py_term == NULL) + { + return; + } + PyErr_Clear(); + PyObject *result = PyObject_CallNoArgs(py_term); + if ( PyErr_Occurred() ) + { + PyErr_Print(); + return; + } + if ( result != NULL && result != Py_None ) + { + gl_warning("ignored return value from on_term()"); + } + if ( result ) + { + Py_DECREF(result); + } +} + EXPORT int do_kill(void*) { // if global memory needs to be released, this is a good time to do it diff --git a/module/pypower/pypower_solver.py b/module/pypower/pypower_solver.py index b8db2441f..3926835a7 100644 --- a/module/pypower/pypower_solver.py +++ b/module/pypower/pypower_solver.py @@ -25,7 +25,7 @@ csv_headers = { "bus" : "bus_i,type,Pd,Qd,Gs,Bs,area,Vm,Va,baseKV,zone,Vmax,Vmin,lam_P,lam_Q,mu_Vmax,mu_Vmin", "branch" : "fbus,tbus,r,x,b,rateA,rateB,rateC,ratio,angle,status,angmin,angmax,Pfrom,Qfrom,Pto,Qto,mu_Sfrom,mu_Sto,mu_angmin,mu_angmax", - "gen" : "bus,Pg,Qb,Qmax,Qmin,Vg,mBase,status,Pmax,Pmin,Pc1,Pc2,Qc1min,Qc1max,Qc2min,Qc2max,ramp_agc,ramp_10,ramp_30,ramp_q,apf,mu_Pmax,mu_Pmin,mu_Qmax,mu_Qmin", + "gen" : "bus,Pg,Qg,Qmax,Qmin,Vg,mBase,status,Pmax,Pmin,Pc1,Pc2,Qc1min,Qc1max,Qc2min,Qc2max,ramp_agc,ramp_10,ramp_30,ramp_q,apf,mu_Pmax,mu_Pmin,mu_Qmax,mu_Qmin", "gencost" : "model,startup,shutdown,parameters", } @@ -162,19 +162,6 @@ def solver(pf_case): # copy back to model if success: - # # compute residual power taken up by the swing bus - # for n,refbus in enumerate([x for x in results['bus'] if x[1]==3]): - # P,Q = 0,0 - # for branch in [x for x in results['branch'] if refbus[1] in x[0:2]]: - # if refbus[1] == branch[0]: # from - # P -= branch[13] - # Q -= branch[14] - # else: # to - # P += branch[15] - # Q += branch[15] - # results['bus'][n,2] = P - # results['bus'][n,3] = Q - # # print(P,Q,results['bus'],file=sys.stderr) for name in ['bus','gen','branch']: pf_case[name] = results[name].tolist() diff --git a/runtime/gridlabd.h b/runtime/gridlabd.h index 2e33cb126..2efff8237 100644 --- a/runtime/gridlabd.h +++ b/runtime/gridlabd.h @@ -1420,6 +1420,7 @@ typedef struct s_callbacks { } version; int (*call_external_callback)(const char*, void *); struct { + PyObject *main; PyObject *(*import)(const char *module, const char *path); bool (*call)(PyObject *pModule, const char *method, const char *vargsfmt, va_list varargs, void *result); } python; diff --git a/source/module.cpp b/source/module.cpp index 5002de45d..d8acbc8c1 100644 --- a/source/module.cpp +++ b/source/module.cpp @@ -239,7 +239,7 @@ static CALLBACKS callbacks = { {randomvar_getnext,randomvar_getspec}, {version_major,version_minor,version_patch,version_build,version_branch}, call_external_callback, - {python_embed_import,python_embed_call}, + {NULL,python_embed_import,python_embed_call}, MAGIC /* used to check structure */ }; CALLBACKS *module_callbacks(void) { return &callbacks; } @@ -539,6 +539,8 @@ MODULE *module_load(const char *file, /**< module filename, searches \p PATH */ /* call the initialization function */ errno = 0; + extern PyObject *gridlabd_module; + callbacks.python.main = gridlabd_module; mod->oclass = (*init)(&callbacks,(void*)mod,argc,argv); if ( mod->oclass==NULL && errno!=0 ) return NULL; diff --git a/source/object.h b/source/object.h index 8755b1d17..c73ca6087 100644 --- a/source/object.h +++ b/source/object.h @@ -365,6 +365,7 @@ typedef struct s_callbacks { } version; int (*call_external_callback)(const char*, void *); struct { + PyObject *main; PyObject *(*import)(const char *module, const char *path); bool (*call)(PyObject *pModule, const char *method, const char *vargsfmt, va_list varargs, void *result); } python;